dsound dsound8 3d stereo buffer bug fix
Robert Reif
reif at earthlink.net
Tue Aug 24 18:19:54 CDT 2004
DirectSound8 doesn't accept 3D stereo secondary buffers but
DirectSound does.
Add tests.
-------------- next part --------------
Index: dlls/dsound/dsound.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/dsound.c,v
retrieving revision 1.16
diff -u -r1.16 dsound.c
--- dlls/dsound/dsound.c 23 Aug 2004 19:39:51 -0000 1.16
+++ dlls/dsound/dsound.c 24 Aug 2004 23:06:55 -0000
@@ -320,7 +320,19 @@
LPUNKNOWN lpunk)
{
ICOM_THIS(IDirectSoundImpl,iface);
- LPWAVEFORMATEX wfex;
+ TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
+ FIXME("shouldn't be called directly\n");
+ return DSERR_GENERIC;
+}
+
+static HRESULT WINAPI DSOUND_CreateSoundBuffer(
+ LPDIRECTSOUND8 iface,
+ LPCDSBUFFERDESC dsbd,
+ LPLPDIRECTSOUNDBUFFER ppdsb,
+ LPUNKNOWN lpunk,
+ BOOL from8)
+{
+ ICOM_THIS(IDirectSoundImpl,iface);
HRESULT hres = DS_OK;
TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
@@ -339,7 +351,8 @@
return DSERR_INVALIDPARAM;
}
- if (dsbd->dwSize != sizeof(DSBUFFERDESC) && dsbd->dwSize != sizeof(DSBUFFERDESC1)) {
+ if (dsbd->dwSize != sizeof(DSBUFFERDESC) &&
+ dsbd->dwSize != sizeof(DSBUFFERDESC1)) {
WARN("invalid parameter: dsbd\n");
return DSERR_INVALIDPARAM;
}
@@ -358,16 +371,13 @@
TRACE("(lpwfxFormat=%p)\n",dsbd->lpwfxFormat);
}
- wfex = dsbd->lpwfxFormat;
-
- if (wfex)
- TRACE("(formattag=0x%04x,chans=%d,samplerate=%ld,"
- "bytespersec=%ld,blockalign=%d,bitspersamp=%d,cbSize=%d)\n",
- wfex->wFormatTag, wfex->nChannels, wfex->nSamplesPerSec,
- wfex->nAvgBytesPerSec, wfex->nBlockAlign,
- wfex->wBitsPerSample, wfex->cbSize);
-
if (dsbd->dwFlags & DSBCAPS_PRIMARYBUFFER) {
+ if (dsbd->lpwfxFormat != NULL) {
+ WARN("invalid parameter: dsbd->lpwfxFormat must be NULL for "
+ "primary buffer\n");
+ return DSERR_INVALIDPARAM;
+ }
+
if (This->primary) {
WARN("Primary Buffer already created\n");
IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)(This->primary));
@@ -383,6 +393,26 @@
}
} else {
IDirectSoundBufferImpl * dsb;
+
+ if (dsbd->lpwfxFormat == NULL) {
+ WARN("invalid parameter: dsbd->lpwfxFormat can't be NULL for "
+ "secondary buffer\n");
+ return DSERR_INVALIDPARAM;
+ }
+
+ TRACE("(formattag=0x%04x,chans=%d,samplerate=%ld,"
+ "bytespersec=%ld,blockalign=%d,bitspersamp=%d,cbSize=%d)\n",
+ dsbd->lpwfxFormat->wFormatTag, dsbd->lpwfxFormat->nChannels,
+ dsbd->lpwfxFormat->nSamplesPerSec,
+ dsbd->lpwfxFormat->nAvgBytesPerSec,
+ dsbd->lpwfxFormat->nBlockAlign,
+ dsbd->lpwfxFormat->wBitsPerSample, dsbd->lpwfxFormat->cbSize);
+
+ if (from8 && (dsbd->dwFlags & DSBCAPS_CTRL3D) && (dsbd->lpwfxFormat->nChannels != 1)) {
+ WARN("invalid parameter: 3D buffer format must be mono\n");
+ return DSERR_INVALIDPARAM;
+ }
+
hres = IDirectSoundBufferImpl_Create(This, (IDirectSoundBufferImpl**)&dsb, dsbd);
if (dsb) {
hres = SecondaryBufferImpl_Create(dsb, (SecondaryBufferImpl**)ppdsb);
@@ -1073,7 +1103,7 @@
{
ICOM_THIS(IDirectSound_IDirectSound,iface);
TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
- return IDirectSoundImpl_CreateSoundBuffer(This->pds,dsbd,ppdsb,lpunk);
+ return DSOUND_CreateSoundBuffer(This->pds,dsbd,ppdsb,lpunk,FALSE);
}
static HRESULT WINAPI IDirectSound_IDirectSound_GetCaps(
@@ -1312,7 +1342,7 @@
{
ICOM_THIS(IDirectSound8_IDirectSound,iface);
TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
- return IDirectSoundImpl_CreateSoundBuffer(This->pds,dsbd,ppdsb,lpunk);
+ return DSOUND_CreateSoundBuffer(This->pds,dsbd,ppdsb,lpunk,TRUE);
}
static HRESULT WINAPI IDirectSound8_IDirectSound_GetCaps(
@@ -1473,7 +1503,7 @@
{
ICOM_THIS(IDirectSound8_IDirectSound8,iface);
TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
- return IDirectSoundImpl_CreateSoundBuffer(This->pds,dsbd,ppdsb,lpunk);
+ return DSOUND_CreateSoundBuffer(This->pds,dsbd,ppdsb,lpunk,TRUE);
}
static HRESULT WINAPI IDirectSound8_IDirectSound8_GetCaps(
Index: dlls/dsound/tests/ds3d.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/ds3d.c,v
retrieving revision 1.11
diff -u -r1.11 ds3d.c
--- dlls/dsound/tests/ds3d.c 23 Aug 2004 17:50:31 -0000 1.11
+++ dlls/dsound/tests/ds3d.c 24 Aug 2004 23:06:56 -0000
@@ -71,6 +71,47 @@
return buf;
}
+const char * getDSBCAPS(DWORD xmask) {
+ static struct {
+ DWORD mask;
+ char *name;
+ } flags[] = {
+#define FE(x) { x, #x },
+ FE(DSBCAPS_PRIMARYBUFFER)
+ FE(DSBCAPS_STATIC)
+ FE(DSBCAPS_LOCHARDWARE)
+ FE(DSBCAPS_LOCSOFTWARE)
+ FE(DSBCAPS_CTRL3D)
+ FE(DSBCAPS_CTRLFREQUENCY)
+ FE(DSBCAPS_CTRLPAN)
+ FE(DSBCAPS_CTRLVOLUME)
+ FE(DSBCAPS_CTRLPOSITIONNOTIFY)
+ FE(DSBCAPS_CTRLALL)
+ FE(DSBCAPS_STICKYFOCUS)
+ FE(DSBCAPS_GLOBALFOCUS)
+ FE(DSBCAPS_GETCURRENTPOSITION2)
+ FE(DSBCAPS_MUTE3DATMAXDISTANCE)
+#undef FE
+ };
+ static char buffer[512];
+ int i;
+ BOOL first = TRUE;
+
+ buffer[0] = 0;
+
+ for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) {
+ if ((flags[i].mask & xmask) == flags[i].mask) {
+ if (first)
+ first = FALSE;
+ else
+ strcat(buffer, "|");
+ strcat(buffer, flags[i].name);
+ }
+ }
+
+ return buffer;
+}
+
HWND get_hwnd()
{
HWND hwnd=GetForegroundWindow();
@@ -616,14 +657,15 @@
else
bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,"IDirectSound_CreateSoundBuffer() failed "
- "to create a %sprimary buffer: %s\n",has_3d?"3D ":"",
+ ok(rc==DS_OK && primary!=NULL,"IDirectSound_CreateSoundBuffer() "
+ "failed to create a %sprimary buffer: %s\n",has_3d?"3D ":"",
DXGetErrorString8(rc));
if (rc==DS_OK && primary!=NULL) {
if (has_listener) {
rc=IDirectSoundBuffer_QueryInterface(primary,
- &IID_IDirectSound3DListener,(void **)&listener);
+ &IID_IDirectSound3DListener,
+ (void **)&listener);
ok(rc==DS_OK && listener!=NULL,
"IDirectSoundBuffer_QueryInterface() failed to get a 3D "
"listener: %s\n",DXGetErrorString8(rc));
@@ -636,14 +678,16 @@
/* DSOUND: Error: Invalid buffer */
rc=IDirectSound3DListener_GetAllParameters(listener,0);
ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound3dListener_GetAllParameters() failed: %s\n",
+ "IDirectSound3dListener_GetAllParameters() should have "
+ "returned DSERR_INVALIDPARAM, returned: %s\n",
DXGetErrorString8(rc));
/* DSOUND: Error: Invalid buffer */
rc=IDirectSound3DListener_GetAllParameters(listener,
&listener_param);
ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound3dListener_GetAllParameters() failed: %s\n",
+ "IDirectSound3dListener_GetAllParameters() should have "
+ "returned DSERR_INVALIDPARAM, returned: %s\n",
DXGetErrorString8(rc));
listener_param.dwSize=sizeof(listener_param);
@@ -681,11 +725,16 @@
}
rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
ok(rc==DS_OK && secondary!=NULL,"IDirectSound_CreateSoundBuffer() "
- "failed to create a 3D secondary buffer: %s\n",
- DXGetErrorString8(rc));
+ "failed to create a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d (%s): %s\n",
+ has_3dbuffer?"3D ":"", has_duplicate?"duplicated ":"",
+ listener!=NULL||move_sound?"with ":"", move_listener?"moving ":"",
+ listener!=NULL?"listener ":"",
+ listener&&move_sound?"and moving sound ":move_sound?
+ "moving sound ":"",
+ wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
+ getDSBCAPS(bufdesc.dwFlags),DXGetErrorString8(rc));
if (rc==DS_OK && secondary!=NULL) {
- if (!has_3d)
- {
+ if (!has_3d) {
DWORD refpan,pan;
LONG refvol,vol;
@@ -749,24 +798,25 @@
/* DSOUND: Error: Invalid source buffer */
rc=IDirectSound_DuplicateSoundBuffer(dso,0,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound_DuplicateSoundBuffer() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
+ ok(rc==DSERR_INVALIDPARAM,
+ "IDirectSound_DuplicateSoundBuffer() should have returned "
+ "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
/* DSOUND: Error: Invalid dest buffer */
rc=IDirectSound_DuplicateSoundBuffer(dso,secondary,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound_DuplicateSoundBuffer() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
+ ok(rc==DSERR_INVALIDPARAM,
+ "IDirectSound_DuplicateSoundBuffer() should have returned "
+ "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
/* DSOUND: Error: Invalid source buffer */
rc=IDirectSound_DuplicateSoundBuffer(dso,0,&duplicated);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound_DuplicateSoundBuffer() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
+ ok(rc==DSERR_INVALIDPARAM,
+ "IDirectSound_DuplicateSoundBuffer() should have returned "
+ "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
duplicated=NULL;
- rc=IDirectSound_DuplicateSoundBuffer(dso,secondary,&duplicated);
+ rc=IDirectSound_DuplicateSoundBuffer(dso,secondary,
+ &duplicated);
ok(rc==DS_OK && duplicated!=NULL,
"IDirectSound_DuplicateSoundBuffer() failed to duplicate "
"a secondary buffer: %s\n",DXGetErrorString8(rc));
Index: dlls/dsound/tests/ds3d8.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/ds3d8.c,v
retrieving revision 1.5
diff -u -r1.5 ds3d8.c
--- dlls/dsound/tests/ds3d8.c 23 Aug 2004 17:50:31 -0000 1.5
+++ dlls/dsound/tests/ds3d8.c 24 Aug 2004 23:06:56 -0000
@@ -577,14 +577,16 @@
/* DSOUND: Error: Invalid buffer */
rc=IDirectSound3DListener_GetAllParameters(listener,0);
ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound3dListener_GetAllParameters() failed: %s\n",
+ "IDirectSound3dListener_GetAllParameters() should have "
+ "returned DSERR_INVALIDPARAM, returned: %s\n",
DXGetErrorString8(rc));
/* DSOUND: Error: Invalid buffer */
rc=IDirectSound3DListener_GetAllParameters(listener,
&listener_param);
ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound3dListener_GetAllParameters() failed: %s\n",
+ "IDirectSound3dListener_GetAllParameters() should have "
+ "returned DSERR_INVALIDPARAM, returned: %s\n",
DXGetErrorString8(rc));
listener_param.dwSize=sizeof(listener_param);
@@ -605,10 +607,22 @@
if (has_3d)
bufdesc.dwFlags|=DSBCAPS_CTRL3D;
else
- bufdesc.dwFlags|=(DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|
- DSBCAPS_CTRLPAN);
+ bufdesc.dwFlags|=
+ (DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
bufdesc.lpwfxFormat=&wfx;
+ if (has_3d) {
+ /* a stereo 3D buffer should fail */
+ rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
+ ok(rc==DSERR_INVALIDPARAM,
+ "IDirectSound8_CreateSoundBuffer(secondary) should have "
+ "returned DSERR_INVALIDPARAM, returned %s\n",
+ DXGetErrorString8(rc));
+ if (secondary)
+ ref=IDirectSoundBuffer_Release(secondary);
+ init_format(&wfx,WAVE_FORMAT_PCM,22050,16,1);
+ }
+
if (winetest_interactive) {
trace(" Testing a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d\n",
has_3dbuffer?"3D ":"",
@@ -622,12 +636,18 @@
}
rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
ok(rc==DS_OK && secondary!=NULL,"IDirectSound8_CreateSoundBuffer() "
- "failed to create a 3D secondary buffer: %s\n",
- DXGetErrorString8(rc));
+ "failed to create a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d (%s): %s\n",
+ has_3dbuffer?"3D ":"", has_duplicate?"duplicated ":"",
+ listener!=NULL||move_sound?"with ":"", move_listener?"moving ":"",
+ listener!=NULL?"listener ":"",
+ listener&&move_sound?"and moving sound ":move_sound?
+ "moving sound ":"",
+ wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
+ getDSBCAPS(bufdesc.dwFlags),DXGetErrorString8(rc));
if (rc==DS_OK && secondary!=NULL) {
- if (!has_3d)
- {
- LONG refvol,refpan,vol,pan;
+ if (!has_3d) {
+ DWORD refpan,pan;
+ LONG refvol,vol;
/* Check the initial secondary buffer's volume and pan */
rc=IDirectSoundBuffer_GetVolume(secondary,&vol);
Index: dlls/dsound/tests/dsound.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/dsound.c,v
retrieving revision 1.37
diff -u -r1.37 dsound.c
--- dlls/dsound/tests/dsound.c 23 Aug 2004 17:50:31 -0000 1.37
+++ dlls/dsound/tests/dsound.c 24 Aug 2004 23:06:57 -0000
@@ -339,6 +339,7 @@
LPDIRECTSOUNDBUFFER primary=NULL,second=NULL,third=NULL;
DSBUFFERDESC bufdesc;
DSCAPS dscaps;
+ WAVEFORMATEX wfx;
int ref;
/* Create the DirectSound object */
@@ -395,6 +396,18 @@
ZeroMemory(&bufdesc, sizeof(bufdesc));
bufdesc.dwSize=sizeof(bufdesc);
bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME;
+ bufdesc.lpwfxFormat = &wfx;
+ init_format(&wfx,WAVE_FORMAT_PCM,11025,8,2);
+ rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
+ ok(rc==DSERR_INVALIDPARAM,"IDirectSound_CreateSoundBuffer() should have "
+ "returned DSERR_INVALIDPARAM, returned: %s\n", DXGetErrorString8(rc));
+ if (rc==DS_OK && primary!=NULL)
+ IDirectSoundBuffer_Release(primary);
+
+ primary=NULL;
+ ZeroMemory(&bufdesc, sizeof(bufdesc));
+ bufdesc.dwSize=sizeof(bufdesc);
+ bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME;
rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
ok(rc==DS_OK && primary!=NULL,
"IDirectSound_CreateSoundBuffer() failed to create a primary buffer: "
@@ -640,6 +653,18 @@
for (f=0;f<NB_FORMATS;f++) {
init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],
formats[f][2]);
+ secondary=NULL;
+ ZeroMemory(&bufdesc, sizeof(bufdesc));
+ bufdesc.dwSize=sizeof(bufdesc);
+ bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
+ bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+ rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
+ ok(rc==DSERR_INVALIDPARAM,"IDirectSound_CreateSoundBuffer() "
+ "should have returned DSERR_INVALIDPARAM, returned: %s\n",
+ DXGetErrorString8(rc));
+ if (rc==DS_OK && secondary!=NULL)
+ IDirectSoundBuffer_Release(secondary);
+
secondary=NULL;
ZeroMemory(&bufdesc, sizeof(bufdesc));
bufdesc.dwSize=sizeof(bufdesc);
Index: dlls/dsound/tests/dsound8.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/dsound8.c,v
retrieving revision 1.5
diff -u -r1.5 dsound8.c
--- dlls/dsound/tests/dsound8.c 23 Aug 2004 17:50:31 -0000 1.5
+++ dlls/dsound/tests/dsound8.c 24 Aug 2004 23:06:58 -0000
@@ -358,6 +358,7 @@
LPDIRECTSOUNDBUFFER primary=NULL,second=NULL,third=NULL;
DSBUFFERDESC bufdesc;
DSCAPS dscaps;
+ WAVEFORMATEX wfx;
int ref;
/* Create the DirectSound object */
@@ -415,6 +416,18 @@
ZeroMemory(&bufdesc, sizeof(bufdesc));
bufdesc.dwSize=sizeof(bufdesc);
bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME;
+ bufdesc.lpwfxFormat = &wfx;
+ init_format(&wfx,WAVE_FORMAT_PCM,11025,8,2);
+ rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
+ ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_CreateSoundBuffer() should have "
+ "returned DSERR_INVALIDPARAM, returned: %s\n", DXGetErrorString8(rc));
+ if (rc==DS_OK && primary!=NULL)
+ IDirectSoundBuffer_Release(primary);
+
+ primary=NULL;
+ ZeroMemory(&bufdesc, sizeof(bufdesc));
+ bufdesc.dwSize=sizeof(bufdesc);
+ bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME;
rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
ok(rc==DS_OK && primary!=NULL,
"IDirectSound8_CreateSoundBuffer() failed to create a primary buffer: "
@@ -659,6 +672,18 @@
for (f=0;f<NB_FORMATS;f++) {
init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],
formats[f][2]);
+ secondary=NULL;
+ ZeroMemory(&bufdesc, sizeof(bufdesc));
+ bufdesc.dwSize=sizeof(bufdesc);
+ bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
+ bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
+ rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
+ ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_CreateSoundBuffer() "
+ "should have returned DSERR_INVALIDPARAM, returned: %s\n",
+ DXGetErrorString8(rc));
+ if (rc==DS_OK && secondary!=NULL)
+ IDirectSoundBuffer_Release(secondary);
+
secondary=NULL;
ZeroMemory(&bufdesc, sizeof(bufdesc));
bufdesc.dwSize=sizeof(bufdesc);
Index: dlls/dsound/tests/dsound_test.h
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/dsound_test.h,v
retrieving revision 1.3
diff -u -r1.3 dsound_test.h
--- dlls/dsound/tests/dsound_test.h 30 Jul 2004 18:42:51 -0000 1.3
+++ dlls/dsound/tests/dsound_test.h 24 Aug 2004 23:06:58 -0000
@@ -60,3 +60,4 @@
extern void test_buffer8(LPDIRECTSOUND8,LPDIRECTSOUNDBUFFER,
BOOL,BOOL,LONG,BOOL,LONG,BOOL,double,BOOL,
LPDIRECTSOUND3DLISTENER,BOOL,BOOL);
+extern const char * getDSBCAPS(DWORD xmask);
More information about the wine-patches
mailing list