From dbb03ec6dc371a706daeb04f6a1365a84ec448ea Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Mon, 19 Apr 2004 02:58:45 +0000 Subject: [PATCH] Fixes support for older versions of direct sound. Adds support for deleting notification array. Minor debug and white space cleanups. --- dlls/dsound/buffer.c | 12 +++++++++--- dlls/dsound/capture.c | 25 ++++++++++++++++++++++--- dlls/dsound/dsound_main.c | 11 ++++++++++- include/dsound.h | 31 +++++++++++++++++++++++++------ 4 files changed, 66 insertions(+), 13 deletions(-) diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index 4c55e25343c..35cb2c39dd0 100644 --- a/dlls/dsound/buffer.c +++ b/dlls/dsound/buffer.c @@ -100,7 +100,7 @@ static HRESULT WINAPI IDirectSoundNotifyImpl_SetNotificationPositions( ICOM_THIS(IDirectSoundNotifyImpl,iface); TRACE("(%p,0x%08lx,%p)\n",This,howmuch,notify); - if (notify == NULL) { + if (howmuch > 0 && notify == NULL) { WARN("invalid parameter: notify == NULL\n"); return DSERR_INVALIDPARAM; } @@ -118,7 +118,7 @@ static HRESULT WINAPI IDirectSoundNotifyImpl_SetNotificationPositions( if (hres != DS_OK) WARN("IDsDriverNotify_SetNotificationPositions failed\n"); return hres; - } else { + } else if (howmuch > 0) { /* Make an internal copy of the caller-supplied array. * Replace the existing copy if one is already present. */ if (This->dsb->notifies) @@ -134,7 +134,13 @@ static HRESULT WINAPI IDirectSoundNotifyImpl_SetNotificationPositions( } memcpy(This->dsb->notifies, notify, howmuch * sizeof(DSBPOSITIONNOTIFY)); This->dsb->nrofnotifies = howmuch; - } + } else { + if (This->dsb->notifies) { + HeapFree(GetProcessHeap(), 0, This->dsb->notifies); + This->dsb->notifies = NULL; + } + This->dsb->nrofnotifies = 0; + } return S_OK; } diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c index 1dfe4da4586..889eb0ec98b 100644 --- a/dlls/dsound/capture.c +++ b/dlls/dsound/capture.c @@ -667,7 +667,8 @@ DSOUND_CreateDirectSoundCaptureBuffer( return DSERR_INVALIDPARAM; } - if ( (lpcDSCBufferDesc->dwSize < sizeof(DSCBUFFERDESC)) || + if ( ((lpcDSCBufferDesc->dwSize != sizeof(DSCBUFFERDESC)) && + (lpcDSCBufferDesc->dwSize != sizeof(DSCBUFFERDESC1))) || (lpcDSCBufferDesc->dwBufferBytes == 0) || (lpcDSCBufferDesc->lpwfxFormat == NULL) ) { WARN("invalid lpcDSCBufferDesc\n"); @@ -823,6 +824,8 @@ static ULONG WINAPI IDirectSoundCaptureNotifyImpl_Release(LPDIRECTSOUNDNOTIFY if ref = InterlockedDecrement(&(This->ref)); if (ref == 0) { + if (This->dscb->hwnotify) + IDsDriverNotify_Release(This->dscb->hwnotify); This->dscb->notify=NULL; IDirectSoundCaptureBuffer_Release((LPDIRECTSOUNDCAPTUREBUFFER)This->dscb); HeapFree(GetProcessHeap(),0,This); @@ -839,7 +842,7 @@ static HRESULT WINAPI IDirectSoundCaptureNotifyImpl_SetNotificationPositions( ICOM_THIS(IDirectSoundCaptureNotifyImpl,iface); TRACE("(%p,0x%08lx,%p)\n",This,howmuch,notify); - if (notify == NULL) { + if (howmuch > 0 && notify == NULL) { WARN("invalid parameter: notify == NULL\n"); return DSERR_INVALIDPARAM; } @@ -857,7 +860,7 @@ static HRESULT WINAPI IDirectSoundCaptureNotifyImpl_SetNotificationPositions( if (hres != DS_OK) WARN("IDsDriverNotify_SetNotificationPositions failed\n"); return hres; - } else { + } else if (howmuch > 0) { /* Make an internal copy of the caller-supplied array. * Replace the existing copy if one is already present. */ if (This->dscb->notifies) @@ -873,6 +876,12 @@ static HRESULT WINAPI IDirectSoundCaptureNotifyImpl_SetNotificationPositions( } memcpy(This->dscb->notifies, notify, howmuch * sizeof(DSBPOSITIONNOTIFY)); This->dscb->nrofnotifies = howmuch; + } else { + if (This->dscb->notifies) { + HeapFree(GetProcessHeap(), 0, This->dscb->notifies); + This->dscb->notifies = NULL; + } + This->dscb->nrofnotifies = 0; } return S_OK; @@ -1361,6 +1370,11 @@ IDirectSoundCaptureBufferImpl_Start( ipDSC->nrofpwaves*sizeof(WAVEHDR)); for (c = 0; c < ipDSC->nrofpwaves; c++) { + if (This->notifies[c].dwOffset == DSBPN_OFFSETSTOP) { + TRACE("got DSBPN_OFFSETSTOP\n"); + ipDSC->nrofpwaves = c; + break; + } if (c == 0) { ipDSC->pwave[0].lpData = ipDSC->buffer; ipDSC->pwave[0].dwBufferLength = @@ -1379,6 +1393,7 @@ IDirectSoundCaptureBufferImpl_Start( err = mmErr(waveInPrepareHeader(ipDSC->hwi, &(ipDSC->pwave[c]),sizeof(WAVEHDR))); if (err != DS_OK) { + WARN("waveInPrepareHeader failed\n"); while (c--) waveInUnprepareHeader(ipDSC->hwi, &(ipDSC->pwave[c]),sizeof(WAVEHDR)); @@ -1388,6 +1403,7 @@ IDirectSoundCaptureBufferImpl_Start( err = mmErr(waveInAddBuffer(ipDSC->hwi, &(ipDSC->pwave[c]), sizeof(WAVEHDR))); if (err != DS_OK) { + WARN("waveInAddBuffer failed\n"); while (c--) waveInUnprepareHeader(ipDSC->hwi, &(ipDSC->pwave[c]),sizeof(WAVEHDR)); @@ -1423,6 +1439,7 @@ IDirectSoundCaptureBufferImpl_Start( err = mmErr(waveInAddBuffer(ipDSC->hwi, &(ipDSC->pwave[0]), sizeof(WAVEHDR))); if (err != DS_OK) { + WARN("waveInAddBuffer failed\n"); waveInUnprepareHeader(ipDSC->hwi, &(ipDSC->pwave[0]),sizeof(WAVEHDR)); } @@ -1435,6 +1452,8 @@ IDirectSoundCaptureBufferImpl_Start( if (err == DS_OK) { /* start filling the first buffer */ err = mmErr(waveInStart(ipDSC->hwi)); + if (err != DS_OK) + WARN("waveInStart failed\n"); } } diff --git a/dlls/dsound/dsound_main.c b/dlls/dsound/dsound_main.c index c7998548c40..bdf9dda38c1 100644 --- a/dlls/dsound/dsound_main.c +++ b/dlls/dsound/dsound_main.c @@ -475,7 +475,11 @@ static HRESULT WINAPI IDirectSoundImpl_SetCooperativeLevel( LPDIRECTSOUND8 iface,HWND hwnd,DWORD level ) { ICOM_THIS(IDirectSoundImpl,iface); - TRACE("(%p,%08lx,%ld)\n",This,(DWORD)hwnd,level); + TRACE("(%p,%08lx,%ld(%s))\n",This,(DWORD)hwnd,level, + level == DSSCL_NORMAL ? "DSSCL_NORMAL" : + level == DSSCL_PRIORITY ? "DSSCL_PRIORITY" : + level == DSSCL_EXCLUSIVE ? "DSSCL_EXCLUSIVE" : + level == DSSCL_WRITEPRIMARY ? "DSSCL_WRITEPRIMARY" : "Unknown"); if (level==DSSCL_PRIORITY || level==DSSCL_EXCLUSIVE) { FIXME("level=%s not fully supported\n", @@ -506,6 +510,11 @@ static HRESULT WINAPI IDirectSoundImpl_CreateSoundBuffer( return DSERR_INVALIDPARAM; } + if (dsbd->dwSize != sizeof(DSBUFFERDESC) && dsbd->dwSize != sizeof(DSBUFFERDESC1)) { + WARN("invalid parameter: dsbd\n"); + return DSERR_INVALIDPARAM; + } + if (ppdsb == NULL) { WARN("invalid parameter: ppdsb == NULL\n"); return DSERR_INVALIDPARAM; diff --git a/include/dsound.h b/include/dsound.h index 5c14b56111c..7c90bdcedc5 100644 --- a/include/dsound.h +++ b/include/dsound.h @@ -266,6 +266,16 @@ enum DSFXR_SENDLOOP }; +typedef struct _DSBUFFERDESC1 +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + LPWAVEFORMATEX lpwfxFormat; +} DSBUFFERDESC1,*LPDSBUFFERDESC1; +typedef const DSBUFFERDESC1 *LPCDSBUFFERDESC1; + typedef struct _DSBUFFERDESC { DWORD dwSize; @@ -314,13 +324,22 @@ typedef struct _DSCEFFECTDESC DWORD dwReserved2; } DSCEFFECTDESC, *LPDSCEFFECTDESC; typedef const DSCEFFECTDESC *LPCDSCEFFECTDESC; - + #define DSCFX_LOCHARDWARE 0x00000001 #define DSCFX_LOCSOFTWARE 0x00000002 - + #define DSCFXR_LOCHARDWARE 0x00000010 #define DSCFXR_LOCSOFTWARE 0x00000020 - + +typedef struct _DSCBUFFERDESC1 +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwBufferBytes; + DWORD dwReserved; + LPWAVEFORMATEX lpwfxFormat; +} DSCBUFFERDESC1, *LPDSCBUFFERDESC1; + typedef struct _DSCBUFFERDESC { DWORD dwSize; @@ -390,9 +409,9 @@ extern HRESULT WINAPI DirectSoundCaptureEnumerateW(LPDSENUMCALLBACKW, LPVOID); extern HRESULT WINAPI DirectSoundCreate8(LPCGUID lpGUID,LPDIRECTSOUND8 *ppDS8,LPUNKNOWN pUnkOuter); extern HRESULT WINAPI DirectSoundCaptureCreate8(LPCGUID lpGUID, LPDIRECTSOUNDCAPTURE *ppDSC8, LPUNKNOWN pUnkOuter); -extern HRESULT WINAPI DirectSoundFullDuplexCreate(LPCGUID pcGuidCaptureDevice, LPCGUID pcGuidRenderDevice, - LPCDSCBUFFERDESC pcDSCBufferDesc, LPCDSBUFFERDESC pcDSBufferDesc, HWND hWnd, DWORD dwLevel, - LPDIRECTSOUNDFULLDUPLEX *ppDSFD, LPDIRECTSOUNDCAPTUREBUFFER8 *ppDSCBuffer8, LPDIRECTSOUNDBUFFER8 *ppDSBuffer8, LPUNKNOWN pUnkOuter); +extern HRESULT WINAPI DirectSoundFullDuplexCreate(LPCGUID pcGuidCaptureDevice, LPCGUID pcGuidRenderDevice, + LPCDSCBUFFERDESC pcDSCBufferDesc, LPCDSBUFFERDESC pcDSBufferDesc, HWND hWnd, DWORD dwLevel, + LPDIRECTSOUNDFULLDUPLEX *ppDSFD, LPDIRECTSOUNDCAPTUREBUFFER8 *ppDSCBuffer8, LPDIRECTSOUNDBUFFER8 *ppDSBuffer8, LPUNKNOWN pUnkOuter); #define DirectSoundFullDuplexCreate8 DirectSoundFullDuplexCreate extern HRESULT WINAPI GetDeviceID(LPCGUID lpGuidSrc, LPGUID lpGuidDest); -- 2.11.4.GIT