Fixes support for older versions of direct sound.
Adds support for deleting notification array.
Minor debug and white space cleanups.
diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c
index 4c55e25..35cb2c3 100644
--- a/dlls/dsound/buffer.c
+++ b/dlls/dsound/buffer.c
@@ -100,7 +100,7 @@
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 @@
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 @@
}
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 1dfe4da..889eb0e 100644
--- a/dlls/dsound/capture.c
+++ b/dlls/dsound/capture.c
@@ -667,7 +667,8 @@
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 @@
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 c799854..bdf9dda 100644
--- a/dlls/dsound/dsound_main.c
+++ b/dlls/dsound/dsound_main.c
@@ -475,7 +475,11 @@
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 @@
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 5c14b56..7c90bdc 100644
--- a/include/dsound.h
+++ b/include/dsound.h
@@ -266,6 +266,16 @@
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 @@
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 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);