IDirectSoundBuffer *DSLoadSoundBuffer(IDirectSound *pDS, LPCTSTR lpName) { IDirectSoundBuffer *pDSB = NULL; DSBUFFERDESC dsBD = {0}; BYTE *pbWaveData; if (DSGetWaveResource(NULL, lpName, &dsBD.lpwfxFormat, &pbWaveData, &dsBD.dwBufferBytes)) { dsBD.dwSize = sizeof(dsBD); dsBD.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLDEFAULT; // | DSBCAPS_GETCURRENTPOSITION2; if (SUCCEEDED(IDirectSound_CreateSoundBuffer(pDS, &dsBD, &pDSB, NULL))) { if (!DSFillSoundBuffer(pDSB, pbWaveData, dsBD.dwBufferBytes)) { IDirectSoundBuffer_Release(pDSB); pDSB = NULL; } } else { pDSB = NULL; } } return pDSB; }
BOOL DSReloadSoundBuffer(IDirectSoundBuffer *pDSB, LPCTSTR lpName) { BOOL result=FALSE; BYTE *pbWaveData; DWORD cbWaveSize; void *pvBase; if (DSGetWaveResource(NULL, lpName, NULL, &pbWaveData, &cbWaveSize)) { if (SUCCEEDED(IDirectSoundBuffer_Restore(pDSB)) && DSFillSoundBuffer(pDSB, pbWaveData, cbWaveSize)) { result = TRUE; } } else if( DSGetWaveFile(NULL, lpName, NULL, &pbWaveData, &cbWaveSize, &pvBase)) { if (SUCCEEDED(IDirectSoundBuffer_Restore(pDSB)) && DSFillSoundBuffer(pDSB, pbWaveData, cbWaveSize)) { result = TRUE; } UnmapViewOfFile (pvBase); } return result; }
SNDOBJ *SndObjCreate(IDirectSound *pDS, LPCTSTR lpName, int iConcurrent) { SNDOBJ *pSO = NULL; LPWAVEFORMATEX pWaveHeader; BOOL fFound = FALSE; BYTE *pbData; DWORD cbData; void *pvBase; if (DSGetWaveResource(NULL, lpName, &pWaveHeader, &pbData, &cbData)) fFound = TRUE; if (DSGetWaveFile(NULL, lpName, &pWaveHeader, &pbData, &cbData, &pvBase)) { fFound = TRUE; UnmapViewOfFile( pvBase ); } if( fFound ) { if (iConcurrent < 1) iConcurrent = 1; if ((pSO = (SNDOBJ *)LocalAlloc(LPTR, sizeof(SNDOBJ) + (iConcurrent-1) * sizeof(IDirectSoundBuffer *))) != NULL) { int i; pSO->iAlloc = iConcurrent; pSO->pbWaveData = pbData; pSO->cbWaveSize = cbData; pSO->Buffers[0] = DSLoadSoundBuffer(pDS, lpName); for (i=1; i<pSO->iAlloc; i++) { if (FAILED(IDirectSound_DuplicateSoundBuffer(pDS, pSO->Buffers[0], &pSO->Buffers[i]))) { pSO->Buffers[i] = DSLoadSoundBuffer(pDS, lpName); if (!pSO->Buffers[i]) { SndObjDestroy(pSO); pSO = NULL; break; } } } } } return pSO; }
IDirectSoundBuffer *DSLoad3DSoundBuffer(IDirectSound *pDS, LPCTSTR lpName) { IDirectSoundBuffer *pDSB = NULL; DSBUFFERDESC dsBD = {0}; BYTE *pbWaveData; void *pvBase; dsBD.dwSize = sizeof(dsBD); dsBD.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRL3D | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_LOCSOFTWARE | DSBCAPS_STICKYFOCUS; if (DSGetWaveResource(NULL, lpName, &dsBD.lpwfxFormat, &pbWaveData, &dsBD.dwBufferBytes)) { if (SUCCEEDED(IDirectSound_CreateSoundBuffer(pDS, &dsBD, &pDSB, NULL))) { if (!DSFillSoundBuffer(pDSB, pbWaveData, dsBD.dwBufferBytes)) { IDirectSoundBuffer_Release(pDSB); pDSB = NULL; } } else { pDSB = NULL; } } else if (DSGetWaveFile(NULL, lpName, &dsBD.lpwfxFormat, &pbWaveData, &dsBD.dwBufferBytes, &pvBase)) { if (SUCCEEDED(IDirectSound_CreateSoundBuffer(pDS, &dsBD, &pDSB, NULL))) { if (!DSFillSoundBuffer(pDSB, pbWaveData, dsBD.dwBufferBytes)) { IDirectSoundBuffer_Release(pDSB); pDSB = NULL; } } else { pDSB = NULL; } UnmapViewOfFile (pvBase); } return pDSB; }