Please don't apply this patch. The point of the test is to test the QueryInterface reference counting which you just removed. Please just fix the flag bug and not remove the point of the test.
Francois Gouget wrote:
This fixes another dsound Windows crash: we first create a buffer without DSBCAPS_CTRL3D, then we query the IDirectSound3DBuffer on it which obviously fails so that we try to do an AddRef on a NULL pointer (buffer3d).
But this 3D buffer is not really needed for this test since we already have the secondary buffer reference. Also MSDN recommends only using CDSBCAPS_TRL3D when necessary because DirectSound can optimize things when it's not specified. It may not yet be the case in Wine but I'd prefer to keep the dsound.c test as simple as possible. So I removed all references to this 3D buffer. I also went through the caps we request on our buffers and remove all the unneeded ones.
Changelog:
dlls/dsound/tests/dsound.c
Francois Gouget fgouget@codeweavers.com Don't try to create a IDirectSound3DBuffer, partly to keep this
test simple and partly because it's going to fail since we did not request DSBCAPS_CTRL3D. Fixes a crash on Windows. Don't request unneeded caps.
Index: dlls/dsound/tests/dsound.c
RCS file: /var/cvs/wine/dlls/dsound/tests/dsound.c,v retrieving revision 1.24 diff -u -r1.24 dsound.c --- dlls/dsound/tests/dsound.c 13 Jul 2004 23:35:09 -0000 1.24 +++ dlls/dsound/tests/dsound.c 16 Jul 2004 17:07:59 -0000 @@ -336,18 +342,13 @@ init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1); ZeroMemory(&bufdesc, sizeof(bufdesc)); bufdesc.dwSize=sizeof(bufdesc);
bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME; bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000; bufdesc.lpwfxFormat=&wfx; rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); ok(rc==DS_OK && secondary!=NULL,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n", rc); if (rc==DS_OK && secondary!=NULL) {
LPDIRECTSOUND3DBUFFER buffer3d;
rc=IDirectSound_QueryInterface(secondary, &IID_IDirectSound3DBuffer, (void **)&buffer3d);
ok(rc==DS_OK && buffer3d!=NULL,"QueryInterface failed: %s\n",DXGetErrorString9(rc)); /* add some more refs */
IDirectSound3DBuffer_AddRef(buffer3d); IDirectSoundBuffer_AddRef(secondary); } /* release with buffer */
@@ -459,18 +460,13 @@ init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1); ZeroMemory(&bufdesc, sizeof(bufdesc)); bufdesc.dwSize=sizeof(bufdesc);
bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME; bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000; bufdesc.lpwfxFormat=&wfx; rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); ok(rc==DS_OK && secondary!=NULL,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n", rc); if (rc==DS_OK && secondary!=NULL) {
LPDIRECTSOUND3DBUFFER buffer3d;
rc=IDirectSound8_QueryInterface(secondary, &IID_IDirectSound3DBuffer, (void **)&buffer3d);
ok(rc==DS_OK && buffer3d!=NULL,"QueryInterface failed: %s\n",DXGetErrorString9(rc)); /* add some more refs */
IDirectSound3DBuffer_AddRef(buffer3d); IDirectSoundBuffer8_AddRef(secondary); } /* release with buffer */
@@ -614,7 +617,6 @@ ZeroMemory(&bufdesc, sizeof(bufdesc)); bufdesc.dwSize=sizeof(bufdesc); bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
- bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN); rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a primary buffer 0x%lx\n", rc);
@@ -625,7 +627,6 @@ ZeroMemory(&bufdesc, sizeof(bufdesc)); bufdesc.dwSize=sizeof(bufdesc); bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
bufdesc.dwFlags|=(DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN); bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000; bufdesc.lpwfxFormat=&wfx; trace(" Testing a secondary buffer at %ldx%dx%d\n",
On Sun, 18 Jul 2004, Robert Reif wrote:
Please don't apply this patch. The point of the test is to test the QueryInterface reference counting which you just removed. Please just fix the flag bug and not remove the point of the test.
We still have: ref=IDirectSoundBuffer_AddRef(secondary);
What does this one add to it? ref=IDirectSound3DBuffer_AddRef(buffer3d);
On Mon, 19 Jul 2004, Francois Gouget wrote:
On Sun, 18 Jul 2004, Robert Reif wrote:
Please don't apply this patch. The point of the test is to test the QueryInterface reference counting which you just removed. Please just fix the flag bug and not remove the point of the test.
We still have: ref=IDirectSoundBuffer_AddRef(secondary);
What does this one add to it? ref=IDirectSound3DBuffer_AddRef(buffer3d);
Well, I just realized that adding CTRL3D for this test does not impact the buffers we use for playing the test tones so adding CTRL3D is fine by me. disregard my previous message then.