diff --git a/dlls/dsound/tests/.cvsignore b/dlls/dsound/tests/.cvsignore index a02054a5c55..2a11dff94d5 100644 --- a/dlls/dsound/tests/.cvsignore +++ b/dlls/dsound/tests/.cvsignore @@ -1,6 +1,8 @@ Makefile capture.ok ds3d.ok +ds3d8.ok dsound.ok +dsound8.ok propset.ok testlist.c diff --git a/dlls/dsound/tests/Makefile.in b/dlls/dsound/tests/Makefile.in index 949a7ddeff2..b27a2e1ab6e 100644 --- a/dlls/dsound/tests/Makefile.in +++ b/dlls/dsound/tests/Makefile.in @@ -9,7 +9,9 @@ EXTRALIBS = -ldxguid -luuid -ldxerr8 CTESTS = \ capture.c \ ds3d.c \ + ds3d8.c \ dsound.c \ + dsound8.c \ propset.c @MAKE_TEST_RULES@ diff --git a/dlls/dsound/tests/ds3d.c b/dlls/dsound/tests/ds3d.c index df43f079d88..ecc95fb2383 100644 --- a/dlls/dsound/tests/ds3d.c +++ b/dlls/dsound/tests/ds3d.c @@ -38,7 +38,6 @@ #include "dsound_test.h" - #define PI 3.14159265358979323846 char* wave_generate_la(WAVEFORMATEX* wfx, double duration, DWORD* size) { @@ -526,7 +525,7 @@ static HRESULT test_secondary(LPGUID lpGuid, int play, /* Create the DirectSound object */ rc=DirectSoundCreate(lpGuid,&dso,NULL); - ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc); + ok(rc==DS_OK,"DirectSoundCreate failed: 0x%08lx\n",rc); if (rc!=DS_OK) return rc; @@ -694,50 +693,6 @@ EXIT: return rc; } -static HRESULT test_dsound(LPGUID lpGuid) -{ - HRESULT rc; - LPDIRECTSOUND dso=NULL; - DWORD speaker_config, new_speaker_config; - int ref; - - /* The basic DirectSound tests are performed in the playback test */ - - /* Create the DirectSound object */ - rc=DirectSoundCreate(lpGuid,&dso,NULL); - ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc); - if (rc!=DS_OK) - return rc; - - rc=IDirectSound_GetSpeakerConfig(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetSpeakerConfig should have failed: 0x%lx\n",rc); - - rc=IDirectSound_GetSpeakerConfig(dso,&speaker_config); - ok(rc==DS_OK,"GetSpeakerConfig failed: 0x%lx\n",rc); - if (rc==DS_OK) { - trace(" DirectSound SpeakerConfig: 0x%08lx\n", speaker_config); - } - - speaker_config = DSSPEAKER_COMBINED(DSSPEAKER_STEREO,DSSPEAKER_GEOMETRY_WIDE); - rc=IDirectSound_SetSpeakerConfig(dso,speaker_config); - ok(rc==DS_OK,"SetSpeakerConfig failed: 0x%lx\n",rc); - if (rc==DS_OK) { - rc=IDirectSound_GetSpeakerConfig(dso,&new_speaker_config); - ok(rc==DS_OK,"GetSpeakerConfig failed: 0x%lx\n",rc); - if (rc==DS_OK) - ok(speaker_config==new_speaker_config,"SetSpeakerConfig failed to set speaker config: expected 0x%08lx, got 0x%08lx\n", - speaker_config,new_speaker_config); - } - - /* Release the DirectSound object */ - ref=IDirectSound_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - if (ref!=0) - return DSERR_GENERIC; - - return DS_OK; -} - static HRESULT test_primary(LPGUID lpGuid) { HRESULT rc; @@ -959,7 +914,6 @@ static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext) { trace("*** Testing %s - %s\n",lpcstrDescription,lpcstrModule); - test_dsound(lpGuid); trace(" Testing the primary buffer\n"); test_primary(lpGuid); diff --git a/dlls/dsound/tests/ds3d8.c b/dlls/dsound/tests/ds3d8.c new file mode 100644 index 00000000000..28c05fceaf9 --- /dev/null +++ b/dlls/dsound/tests/ds3d8.c @@ -0,0 +1,915 @@ +/* + * Tests the panning and 3D functions of DirectSound + * + * Part of this test involves playing test tones. But this only makes + * sense if someone is going to carefully listen to it, and would only + * bother everyone else. + * So this is only done if the test is being run in interactive mode. + * + * Copyright (c) 2002-2004 Francois Gouget + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define NONAMELESSSTRUCT +#define NONAMELESSUNION +#include + +#include +#include + +#include "wine/test.h" +#include "windef.h" +#include "wingdi.h" +#include "dsound.h" +#include "dxerr8.h" + +#include "dsound_test.h" + +typedef struct { + char* wave; + DWORD wave_len; + + LPDIRECTSOUNDBUFFER dsbo; + LPWAVEFORMATEX wfx; + DWORD buffer_size; + DWORD written; + DWORD played; + DWORD offset; +} play_state_t; + +static int buffer_refill8(play_state_t* state, DWORD size) +{ + LPVOID ptr1,ptr2; + DWORD len1,len2; + HRESULT rc; + + if (size>state->wave_len-state->written) + size=state->wave_len-state->written; + + rc=IDirectSoundBuffer_Lock(state->dsbo,state->offset,size, + &ptr1,&len1,&ptr2,&len2,0); + ok(rc==DS_OK,"Lock: 0x%lx\n",rc); + if (rc!=DS_OK) + return -1; + + memcpy(ptr1,state->wave+state->written,len1); + state->written+=len1; + if (ptr2!=NULL) { + memcpy(ptr2,state->wave+state->written,len2); + state->written+=len2; + } + state->offset=state->written % state->buffer_size; + rc=IDirectSoundBuffer_Unlock(state->dsbo,ptr1,len1,ptr2,len2); + ok(rc==DS_OK,"Unlock: 0x%lx\n",rc); + if (rc!=DS_OK) + return -1; + return size; +} + +static int buffer_silence8(play_state_t* state, DWORD size) +{ + LPVOID ptr1,ptr2; + DWORD len1,len2; + HRESULT rc; + BYTE s; + + rc=IDirectSoundBuffer_Lock(state->dsbo,state->offset,size, + &ptr1,&len1,&ptr2,&len2,0); + ok(rc==DS_OK,"Lock: 0x%lx\n",rc); + if (rc!=DS_OK) + return -1; + + s=(state->wfx->wBitsPerSample==8?0x80:0); + memset(ptr1,s,len1); + if (ptr2!=NULL) { + memset(ptr2,s,len2); + } + state->offset=(state->offset+size) % state->buffer_size; + rc=IDirectSoundBuffer_Unlock(state->dsbo,ptr1,len1,ptr2,len2); + ok(rc==DS_OK,"Unlock: 0x%lx\n",rc); + if (rc!=DS_OK) + return -1; + return size; +} + +static int buffer_service8(play_state_t* state) +{ + DWORD last_play_pos,play_pos,buf_free; + HRESULT rc; + + rc=IDirectSoundBuffer_GetCurrentPosition(state->dsbo,&play_pos,NULL); + ok(rc==DS_OK,"GetCurrentPosition: %lx\n",rc); + if (rc!=DS_OK) { + goto STOP; + } + + /* Update the amount played */ + last_play_pos=state->played % state->buffer_size; + if (play_posplayed+=state->buffer_size-last_play_pos+play_pos; + else + state->played+=play_pos-last_play_pos; + + if (winetest_debug > 1) + trace("buf size=%ld last_play_pos=%ld play_pos=%ld played=%ld / %ld\n", + state->buffer_size,last_play_pos,play_pos,state->played,state->wave_len); + + if (state->played>state->wave_len) + { + /* Everything has been played */ + goto STOP; + } + + /* Refill the buffer */ + if (state->offset<=play_pos) + buf_free=play_pos-state->offset; + else + buf_free=state->buffer_size-state->offset+play_pos; + + if (winetest_debug > 1) + trace("offset=%ld free=%ld written=%ld / %ld\n", + state->offset,buf_free,state->written,state->wave_len); + if (buf_free==0) + return 1; + + if (state->writtenwave_len) + { + int w=buffer_refill8(state,buf_free); + if (w==-1) + goto STOP; + buf_free-=w; + if (state->written==state->wave_len && winetest_debug > 1) + trace("last sound byte at %ld\n", + (state->written % state->buffer_size)); + } + + if (buf_free>0) { + /* Fill with silence */ + if (winetest_debug > 1) + trace("writing %ld bytes of silence\n",buf_free); + if (buffer_silence8(state,buf_free)==-1) + goto STOP; + } + return 1; + +STOP: + if (winetest_debug > 1) + trace("stopping playback\n"); + rc=IDirectSoundBuffer_Stop(state->dsbo); + ok(rc==DS_OK,"Stop failed: rc=%ld\n",rc); + return 0; +} + +void test_buffer8(LPDIRECTSOUND8 dso, LPDIRECTSOUNDBUFFER dsbo, + BOOL is_primary, BOOL set_volume, LONG volume, + BOOL set_pan, LONG pan, BOOL play, double duration, + BOOL buffer3d, LPDIRECTSOUND3DLISTENER listener, + BOOL move_listener, BOOL move_sound) +{ + HRESULT rc; + DSBCAPS dsbcaps; + WAVEFORMATEX wfx,wfx2; + DWORD size,status,freq; + int ref; + + /* DSOUND: Error: Invalid caps pointer */ + rc=IDirectSoundBuffer_GetCaps(dsbo,0); + ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: 0x%lx\n",rc); + + ZeroMemory(&dsbcaps, sizeof(dsbcaps)); + + /* DSOUND: Error: Invalid caps pointer */ + rc=IDirectSoundBuffer_GetCaps(dsbo,&dsbcaps); + ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: 0x%lx\n",rc); + + dsbcaps.dwSize=sizeof(dsbcaps); + rc=IDirectSoundBuffer_GetCaps(dsbo,&dsbcaps); + ok(rc==DS_OK,"GetCaps failed: 0x%lx\n",rc); + if (rc==DS_OK) { + trace(" Caps: flags=0x%08lx size=%ld\n",dsbcaps.dwFlags, + dsbcaps.dwBufferBytes); + } + + /* Query the format size. Note that it may not match sizeof(wfx) */ + size=0; + rc=IDirectSoundBuffer_GetFormat(dsbo,NULL,0,&size); + ok(rc==DS_OK && size!=0, + "GetFormat should have returned the needed size: rc=0x%lx size=%ld\n", + rc,size); + + rc=IDirectSoundBuffer_GetFormat(dsbo,&wfx,sizeof(wfx),NULL); + ok(rc==DS_OK,"GetFormat failed: 0x%lx\n",rc); + if (rc==DS_OK && is_primary) { + trace("Primary buffer default format: tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n", + wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample, + wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign); + } + + /* DSOUND: Error: Invalid frequency buffer */ + rc=IDirectSoundBuffer_GetFrequency(dsbo,0); + ok(rc==DSERR_INVALIDPARAM,"GetFrequency should have failed: 0x%lx\n",rc); + + /* DSOUND: Error: Primary buffers don't support CTRLFREQUENCY */ + rc=IDirectSoundBuffer_GetFrequency(dsbo,&freq); + ok((rc==DS_OK && !is_primary) || (rc==DSERR_CONTROLUNAVAIL&&is_primary) || + (rc==DSERR_CONTROLUNAVAIL&&!(dsbcaps.dwFlags&DSBCAPS_CTRLFREQUENCY)), + "GetFrequency failed: 0x%lx\n",rc); + if (rc==DS_OK) { + ok(freq==wfx.nSamplesPerSec, + "The frequency returned by GetFrequency %ld does not match the format %ld\n", + freq,wfx.nSamplesPerSec); + } + + /* DSOUND: Error: Invalid status pointer */ + rc=IDirectSoundBuffer_GetStatus(dsbo,0); + ok(rc==DSERR_INVALIDPARAM,"GetStatus should have failed: 0x%lx\n",rc); + + rc=IDirectSoundBuffer_GetStatus(dsbo,&status); + ok(rc==DS_OK,"GetStatus failed: 0x%lx\n",rc); + ok(status==0,"status=0x%lx instead of 0\n",status); + + if (is_primary) { + /* We must call SetCooperativeLevel to be allowed to call SetFormat */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc); + if (rc!=DS_OK) + return; + + /* DSOUND: Error: Invalid format pointer */ + rc=IDirectSoundBuffer_SetFormat(dsbo,0); + ok(rc==DSERR_INVALIDPARAM,"SetFormat should have failed: 0x%lx\n",rc); + + init_format(&wfx2,WAVE_FORMAT_PCM,11025,16,2); + rc=IDirectSoundBuffer_SetFormat(dsbo,&wfx2); + ok(rc==DS_OK,"SetFormat failed: 0x%lx\n",rc); + + /* There is no garantee that SetFormat will actually change the + * format to what we asked for. It depends on what the soundcard + * supports. So we must re-query the format. + */ + rc=IDirectSoundBuffer_GetFormat(dsbo,&wfx,sizeof(wfx),NULL); + ok(rc==DS_OK,"GetFormat failed: 0x%lx\n",rc); + if (rc==DS_OK && + (wfx.wFormatTag!=wfx2.wFormatTag || + wfx.nSamplesPerSec!=wfx2.nSamplesPerSec || + wfx.wBitsPerSample!=wfx2.wBitsPerSample || + wfx.nChannels!=wfx2.nChannels)) { + trace("Requested format tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n", + wfx2.wFormatTag,wfx2.nSamplesPerSec,wfx2.wBitsPerSample, + wfx2.nChannels,wfx2.nAvgBytesPerSec,wfx2.nBlockAlign); + trace("Got tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n", + wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample, + wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign); + } + + /* Set the CooperativeLevel back to normal */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc); + } + + if (play) { + play_state_t state; + DS3DLISTENER listener_param; + LPDIRECTSOUND3DBUFFER buffer=NULL; + DS3DBUFFER buffer_param; + DWORD start_time,now; + + trace(" Playing %g second 440Hz tone at %ldx%dx%d\n", duration, + wfx.nSamplesPerSec, wfx.wBitsPerSample,wfx.nChannels); + + if (is_primary) { + /* We must call SetCooperativeLevel to be allowed to call Lock */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_WRITEPRIMARY */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_WRITEPRIMARY); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc); + if (rc!=DS_OK) + return; + } + if (buffer3d) { + LPDIRECTSOUNDBUFFER temp_buffer; + + rc=IDirectSoundBuffer_QueryInterface(dsbo,&IID_IDirectSound3DBuffer,(LPVOID *)&buffer); + ok(rc==DS_OK,"QueryInterface failed: 0x%lx\n",rc); + if (rc!=DS_OK) + return; + + /* check the COM interface */ + rc=IDirectSoundBuffer_QueryInterface(dsbo, &IID_IDirectSoundBuffer,(LPVOID *)&temp_buffer); + ok(rc==DS_OK && temp_buffer!=NULL,"QueryInterface failed: 0x%lx\n",rc); + ok(temp_buffer==dsbo,"COM interface broken: 0x%08lx != 0x%08lx\n",(DWORD)temp_buffer,(DWORD)dsbo); + ref=IDirectSoundBuffer_Release(temp_buffer); + ok(ref==1,"IDirectSoundBuffer_Release has %d references, should have 1\n",ref); + + temp_buffer=NULL; + rc=IDirectSound3DBuffer_QueryInterface(dsbo, &IID_IDirectSoundBuffer,(LPVOID *)&temp_buffer); + ok(rc==DS_OK && temp_buffer!=NULL,"IDirectSound3DBuffer_QueryInterface failed: 0x%lx\n",rc); + ok(temp_buffer==dsbo,"COM interface broken: 0x%08lx != 0x%08lx\n",(DWORD)temp_buffer,(DWORD)dsbo); + ref=IDirectSoundBuffer_Release(temp_buffer); + ok(ref==1,"IDirectSoundBuffer_Release has %d references, should have 1\n",ref); + +#if 0 + /* FIXME: this works on windows */ + ref=IDirectSoundBuffer_Release(dsbo); + ok(ref==0,"IDirectSoundBuffer_Release has %d references, should have 0\n",ref); + + rc=IDirectSound3DBuffer_QueryInterface(buffer, &IID_IDirectSoundBuffer,(LPVOID *)&dsbo); + ok(rc==DS_OK && dsbo!=NULL,"IDirectSound3DBuffer_QueryInterface failed: 0x%lx\n",rc); +#endif + + /* DSOUND: Error: Invalid buffer */ + rc=IDirectSound3DBuffer_GetAllParameters(buffer,0); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound3DBuffer_GetAllParameters failed: 0x%lx\n",rc); + + ZeroMemory(&buffer_param, sizeof(buffer_param)); + + /* DSOUND: Error: Invalid buffer */ + rc=IDirectSound3DBuffer_GetAllParameters(buffer,&buffer_param); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound3DBuffer_GetAllParameters failed: 0x%lx\n",rc); + + buffer_param.dwSize=sizeof(buffer_param); + rc=IDirectSound3DBuffer_GetAllParameters(buffer,&buffer_param); + ok(rc==DS_OK,"IDirectSound3DBuffer_GetAllParameters failed: 0x%lx\n",rc); + } + if (set_volume) { + if (dsbcaps.dwFlags & DSBCAPS_CTRLVOLUME) { + LONG val; + rc=IDirectSoundBuffer_GetVolume(dsbo,&val); + ok(rc==DS_OK,"GetVolume failed: 0x%lx\n",rc); + + rc=IDirectSoundBuffer_SetVolume(dsbo,volume); + ok(rc==DS_OK,"SetVolume failed: 0x%lx\n",rc); + } else { + /* DSOUND: Error: Buffer does not have CTRLVOLUME */ + rc=IDirectSoundBuffer_GetVolume(dsbo,&volume); + ok(rc==DSERR_CONTROLUNAVAIL,"GetVolume should have failed: 0x%lx\n",rc); + } + } + + if (set_pan) { + if (dsbcaps.dwFlags & DSBCAPS_CTRLPAN) { + LONG val; + rc=IDirectSoundBuffer_GetPan(dsbo,&val); + ok(rc==DS_OK,"GetPan failed: 0x%lx\n",rc); + + rc=IDirectSoundBuffer_SetPan(dsbo,pan); + ok(rc==DS_OK,"SetPan failed: 0x%lx\n",rc); + } else { + /* DSOUND: Error: Buffer does not have CTRLPAN */ + rc=IDirectSoundBuffer_GetPan(dsbo,&pan); + ok(rc==DSERR_CONTROLUNAVAIL,"GetPan should have failed: 0x%lx\n",rc); + } + } + + state.wave=wave_generate_la(&wfx,duration,&state.wave_len); + + state.dsbo=dsbo; + state.wfx=&wfx; + state.buffer_size=dsbcaps.dwBufferBytes; + state.played=state.written=state.offset=0; + buffer_refill8(&state,state.buffer_size); + + rc=IDirectSoundBuffer_Play(dsbo,0,0,DSBPLAY_LOOPING); + ok(rc==DS_OK,"Play: 0x%lx\n",rc); + + rc=IDirectSoundBuffer_GetStatus(dsbo,&status); + ok(rc==DS_OK,"GetStatus failed: 0x%lx\n",rc); + ok(status==(DSBSTATUS_PLAYING|DSBSTATUS_LOOPING), + "GetStatus: bad status: %lx\n",status); + + if (listener) { + ZeroMemory(&listener_param,sizeof(listener_param)); + listener_param.dwSize=sizeof(listener_param); + rc=IDirectSound3DListener_GetAllParameters(listener,&listener_param); + ok(rc==DS_OK,"IDirectSound3dListener_GetAllParameters failed 0x%lx\n",rc); + if (move_listener) + { + listener_param.vPosition.x = -5.0; + listener_param.vVelocity.x = 10.0/duration; + } + rc=IDirectSound3DListener_SetAllParameters(listener,&listener_param,DS3D_IMMEDIATE); + ok(rc==DS_OK,"IDirectSound3dListener_SetPosition failed 0x%lx\n",rc); + } + if (buffer3d) { + if (move_sound) + { + buffer_param.vPosition.x = 100.0; + buffer_param.vVelocity.x = -200.0/duration; + } + buffer_param.flMinDistance = 10; + rc=IDirectSound3DBuffer_SetAllParameters(buffer,&buffer_param,DS3D_IMMEDIATE); + ok(rc==DS_OK,"IDirectSound3dBuffer_SetPosition failed 0x%lx\n",rc); + } + + start_time=GetTickCount(); + while (buffer_service8(&state)) { + WaitForSingleObject(GetCurrentProcess(),TIME_SLICE); + now=GetTickCount(); + if (listener && move_listener) { + listener_param.vPosition.x = -5.0+10.0*(now-start_time)/1000/duration; + if (winetest_debug>2) + trace("listener position=%g\n",listener_param.vPosition.x); + rc=IDirectSound3DListener_SetPosition(listener,listener_param.vPosition.x,listener_param.vPosition.y,listener_param.vPosition.z,DS3D_IMMEDIATE); + ok(rc==DS_OK,"IDirectSound3dListener_SetPosition failed 0x%lx\n",rc); + } + if (buffer3d && move_sound) { + buffer_param.vPosition.x = 100-200.0*(now-start_time)/1000/duration; + if (winetest_debug>2) + trace("sound position=%g\n",buffer_param.vPosition.x); + rc=IDirectSound3DBuffer_SetPosition(buffer,buffer_param.vPosition.x,buffer_param.vPosition.y,buffer_param.vPosition.z,DS3D_IMMEDIATE); + ok(rc==DS_OK,"IDirectSound3dBuffer_SetPosition failed 0x%lx\n",rc); + } + } + /* Check the sound duration was within 10% of the expected value */ + now=GetTickCount(); + ok(fabs(1000*duration-now+start_time)<=100*duration,"The sound played for %ld ms instead of %g ms\n",now-start_time,1000*duration); + + free(state.wave); + if (is_primary) { + /* Set the CooperativeLevel back to normal */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc); + } + if (buffer3d) { + ref=IDirectSound3DBuffer_Release(buffer); + ok(ref==0,"IDirectSound3DBuffer_Release has %d references, should have 0\n",ref); + } + } +} + +static HRESULT test_secondary8(LPGUID lpGuid, int play, + int has_3d, int has_3dbuffer, + int has_listener, int has_duplicate, + int move_listener, int move_sound) +{ + HRESULT rc; + LPDIRECTSOUND8 dso=NULL; + LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL; + LPDIRECTSOUND3DLISTENER listener=NULL; + DSBUFFERDESC bufdesc; + WAVEFORMATEX wfx; + int ref; + + /* Create the DirectSound object */ + rc=DirectSoundCreate8(lpGuid,&dso,NULL); + ok(rc==DS_OK,"DirectSoundCreate8 failed: 0x%08lx\n",rc); + if (rc!=DS_OK) + return rc; + + /* We must call SetCooperativeLevel before creating primary buffer */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc); + if (rc!=DS_OK) + goto EXIT; + + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER; + if (has_3d) + bufdesc.dwFlags|=DSBCAPS_CTRL3D; + else + bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN); + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); + ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a %sprimary buffer 0x%lx\n",has_3d?"3D ":"", rc); + + if (rc==DS_OK && primary!=NULL) { + if (has_listener) { + rc=IDirectSoundBuffer_QueryInterface(primary,&IID_IDirectSound3DListener,(void **)&listener); + ok(rc==DS_OK && listener!=NULL,"IDirectSoundBuffer_QueryInterface failed to get a 3D listener 0x%lx\n",rc); + ref=IDirectSoundBuffer_Release(primary); + ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref); + if (rc==DS_OK && listener!=NULL) { + DS3DLISTENER listener_param; + ZeroMemory(&listener_param,sizeof(listener_param)); + /* DSOUND: Error: Invalid buffer */ + rc=IDirectSound3DListener_GetAllParameters(listener,0); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound3dListener_GetAllParameters failed 0x%lx\n",rc); + + /* DSOUND: Error: Invalid buffer */ + rc=IDirectSound3DListener_GetAllParameters(listener,&listener_param); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound3dListener_GetAllParameters failed 0x%lx\n",rc); + + listener_param.dwSize=sizeof(listener_param); + rc=IDirectSound3DListener_GetAllParameters(listener,&listener_param); + ok(rc==DS_OK,"IDirectSound3dListener_GetAllParameters failed 0x%lx\n",rc); + } + else + goto EXIT; + } + + init_format(&wfx,WAVE_FORMAT_PCM,22050,16,2); + secondary=NULL; + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2; + if (has_3d) + bufdesc.dwFlags|=DSBCAPS_CTRL3D; + else + bufdesc.dwFlags|=(DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN); + bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000; + bufdesc.lpwfxFormat=&wfx; + trace(" Testing a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d\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); + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); + ok(rc==DS_OK && secondary!=NULL,"CreateSoundBuffer failed to create a 3D secondary buffer 0x%lx\n",rc); + if (rc==DS_OK && secondary!=NULL) { + if (!has_3d) + { + DWORD refvol,refpan,vol,pan; + + /* Check the initial secondary buffer's volume and pan */ + rc=IDirectSoundBuffer_GetVolume(secondary,&vol); + ok(rc==DS_OK,"GetVolume(secondary) failed: %s\n",DXGetErrorString8(rc)); + ok(vol==0,"wrong volume for a new secondary buffer: %ld\n",vol); + rc=IDirectSoundBuffer_GetPan(secondary,&pan); + ok(rc==DS_OK,"GetPan(secondary) failed: %s\n",DXGetErrorString8(rc)); + ok(pan==0,"wrong pan for a new secondary buffer: %ld\n",pan); + + /* Check that changing the secondary buffer's volume and pan + * does not impact the primary buffer's volume and pan + */ + rc=IDirectSoundBuffer_GetVolume(primary,&refvol); + ok(rc==DS_OK,"GetVolume(primary) failed: %s\n",DXGetErrorString8(rc)); + rc=IDirectSoundBuffer_GetPan(primary,&refpan); + ok(rc==DS_OK,"GetPan(primary) failed: %s\n",DXGetErrorString8(rc)); + + rc=IDirectSoundBuffer_SetVolume(secondary,-1000); + ok(rc==DS_OK,"SetVolume(secondary) failed: %s\n",DXGetErrorString8(rc)); + rc=IDirectSoundBuffer_GetVolume(secondary,&vol); + ok(rc==DS_OK,"SetVolume(secondary) failed: %s\n",DXGetErrorString8(rc)); + ok(vol==-1000,"secondary: wrong volume %ld instead of -1000\n",vol); + rc=IDirectSoundBuffer_SetPan(secondary,-1000); + ok(rc==DS_OK,"SetPan(secondary) failed: %s\n",DXGetErrorString8(rc)); + rc=IDirectSoundBuffer_GetPan(secondary,&pan); + ok(rc==DS_OK,"SetPan(secondary) failed: %s\n",DXGetErrorString8(rc)); + ok(vol==-1000,"secondary: wrong pan %ld instead of -1000\n",pan); + + rc=IDirectSoundBuffer_GetVolume(primary,&vol); + ok(rc==DS_OK,"GetVolume(primary) failed: %s\n",DXGetErrorString8(rc)); + ok(vol==refvol,"The primary volume changed from %ld to %ld\n",refvol,vol); + rc=IDirectSoundBuffer_GetPan(primary,&pan); + ok(rc==DS_OK,"GetPan(primary) failed: %s\n",DXGetErrorString8(rc)); + ok(pan==refpan,"The primary pan changed from %ld to %ld\n",refpan,pan); + + rc=IDirectSoundBuffer_SetVolume(secondary,0); + ok(rc==DS_OK,"SetVolume(secondary) failed: %s\n",DXGetErrorString8(rc)); + rc=IDirectSoundBuffer_SetPan(secondary,0); + ok(rc==DS_OK,"SetPan(secondary) failed: %s\n",DXGetErrorString8(rc)); + } + if (has_duplicate) { + LPDIRECTSOUNDBUFFER duplicated=NULL; + + /* DSOUND: Error: Invalid source buffer */ + rc=IDirectSound8_DuplicateSoundBuffer(dso,0,0); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_DuplicateSoundBuffer should have failed 0x%lx\n",rc); + + /* DSOUND: Error: Invalid dest buffer */ + rc=IDirectSound8_DuplicateSoundBuffer(dso,secondary,0); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_DuplicateSoundBuffer should have failed 0x%lx\n",rc); + + /* DSOUND: Error: Invalid source buffer */ + rc=IDirectSound8_DuplicateSoundBuffer(dso,0,&duplicated); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_DuplicateSoundBuffer should have failed 0x%lx\n",rc); + + duplicated=NULL; + rc=IDirectSound8_DuplicateSoundBuffer(dso,secondary,&duplicated); + ok(rc==DS_OK && duplicated!=NULL,"IDirectSound8_DuplicateSoundBuffer failed to duplicate a secondary buffer 0x%lx\n",rc); + + if (rc==DS_OK && duplicated!=NULL) { + ref=IDirectSoundBuffer_Release(secondary); + ok(ref==0,"IDirectSoundBuffer_Release secondary has %d references, should have 0\n",ref); + secondary=duplicated; + } + } + + if (rc==DS_OK && secondary!=NULL) { + double duration; + duration=(move_listener || move_sound?4.0:1.0); + test_buffer8(dso,secondary,0,FALSE,0,FALSE,0,winetest_interactive,duration,has_3dbuffer,listener,move_listener,move_sound); + ref=IDirectSoundBuffer_Release(secondary); + ok(ref==0,"IDirectSoundBuffer_Release %s has %d references, should have 0\n",has_duplicate?"duplicated":"secondary",ref); + } + } + } + if (has_listener) { + ref=IDirectSound3DListener_Release(listener); + ok(ref==0,"IDirectSound3dListener_Release listener has %d references, should have 0\n",ref); + } else { + ref=IDirectSoundBuffer_Release(primary); + ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref); + } + + /* Set the CooperativeLevel back to normal */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc); + +EXIT: + ref=IDirectSound8_Release(dso); + ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref); + if (ref!=0) + return DSERR_GENERIC; + + return rc; +} + +static HRESULT test_primary8(LPGUID lpGuid) +{ + HRESULT rc; + LPDIRECTSOUND8 dso=NULL; + LPDIRECTSOUNDBUFFER primary=NULL; + DSBUFFERDESC bufdesc; + DSCAPS dscaps; + int ref, i; + + /* Create the DirectSound object */ + rc=DirectSoundCreate8(lpGuid,&dso,NULL); + ok(rc==DS_OK,"DirectSoundCreate8 failed: 0x%lx\n",rc); + if (rc!=DS_OK) + return rc; + + /* Get the device capabilities */ + ZeroMemory(&dscaps, sizeof(dscaps)); + dscaps.dwSize=sizeof(dscaps); + rc=IDirectSound8_GetCaps(dso,&dscaps); + ok(rc==DS_OK,"GetCaps failed: 0x%lx\n",rc); + if (rc!=DS_OK) + goto EXIT; + + /* We must call SetCooperativeLevel before calling CreateSoundBuffer */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc); + if (rc!=DS_OK) + goto EXIT; + + /* Testing the primary buffer */ + primary=NULL; + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN; + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); + ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a primary buffer: 0x%lx\n",rc); + if (rc==DS_OK && primary!=NULL) { + test_buffer8(dso,primary,1,TRUE,0,TRUE,0,winetest_interactive && !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,NULL,0,0); + if (winetest_interactive) { + LONG volume,pan; + + volume = DSBVOLUME_MAX; + for (i = 0; i < 6; i++) { + test_buffer8(dso,primary,1,TRUE,volume,TRUE,0,winetest_interactive && !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,NULL,0,0); + volume -= ((DSBVOLUME_MAX-DSBVOLUME_MIN) / 40); + } + + pan = DSBPAN_LEFT; + for (i = 0; i < 7; i++) { + test_buffer8(dso,primary,1,TRUE,0,TRUE,pan,winetest_interactive && !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,0,0,0); + pan += ((DSBPAN_RIGHT-DSBPAN_LEFT) / 6); + } + } + ref=IDirectSoundBuffer_Release(primary); + ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref); + } + + /* Set the CooperativeLevel back to normal */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc); + +EXIT: + ref=IDirectSound8_Release(dso); + ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref); + if (ref!=0) + return DSERR_GENERIC; + + return rc; +} + +static HRESULT test_primary_3d8(LPGUID lpGuid) +{ + HRESULT rc; + LPDIRECTSOUND8 dso=NULL; + LPDIRECTSOUNDBUFFER primary=NULL; + DSBUFFERDESC bufdesc; + DSCAPS dscaps; + int ref; + + /* Create the DirectSound object */ + rc=DirectSoundCreate8(lpGuid,&dso,NULL); + ok(rc==DS_OK,"DirectSoundCreate8 failed: 0x%lx\n",rc); + if (rc!=DS_OK) + return rc; + + /* Get the device capabilities */ + ZeroMemory(&dscaps, sizeof(dscaps)); + dscaps.dwSize=sizeof(dscaps); + rc=IDirectSound8_GetCaps(dso,&dscaps); + ok(rc==DS_OK,"GetCaps failed: 0x%lx\n",rc); + if (rc!=DS_OK) + goto EXIT; + + /* We must call SetCooperativeLevel before calling CreateSoundBuffer */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc); + if (rc!=DS_OK) + goto EXIT; + + primary=NULL; + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER; + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); + ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a primary buffer: 0x%lx\n",rc); + if (rc==DS_OK && primary!=NULL) { + ref=IDirectSoundBuffer_Release(primary); + ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref); + primary=NULL; + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D; + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); + ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a 3D primary buffer: 0x%lx\n",rc); + if (rc==DS_OK && primary!=NULL) { + test_buffer8(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive && !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,0,0,0); + ref=IDirectSoundBuffer_Release(primary); + ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref); + } + } + /* Set the CooperativeLevel back to normal */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc); + +EXIT: + ref=IDirectSound8_Release(dso); + ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref); + if (ref!=0) + return DSERR_GENERIC; + + return rc; +} + +static HRESULT test_primary_3d_with_listener8(LPGUID lpGuid) +{ + HRESULT rc; + LPDIRECTSOUND8 dso=NULL; + LPDIRECTSOUNDBUFFER primary=NULL; + DSBUFFERDESC bufdesc; + DSCAPS dscaps; + int ref; + + /* Create the DirectSound object */ + rc=DirectSoundCreate8(lpGuid,&dso,NULL); + ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc); + if (rc!=DS_OK) + return rc; + + /* Get the device capabilities */ + ZeroMemory(&dscaps, sizeof(dscaps)); + dscaps.dwSize=sizeof(dscaps); + rc=IDirectSound8_GetCaps(dso,&dscaps); + ok(rc==DS_OK,"GetCaps failed: 0x%lx\n",rc); + if (rc!=DS_OK) + goto EXIT; + + /* We must call SetCooperativeLevel before calling CreateSoundBuffer */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc); + if (rc!=DS_OK) + goto EXIT; + primary=NULL; + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D; + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); + ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a 3D primary buffer 0x%lx\n",rc); + if (rc==DS_OK && primary!=NULL) { + LPDIRECTSOUND3DLISTENER listener=NULL; + rc=IDirectSoundBuffer_QueryInterface(primary,&IID_IDirectSound3DListener,(void **)&listener); + ok(rc==DS_OK && listener!=NULL,"IDirectSoundBuffer_QueryInterface failed to get a 3D listener 0x%lx\n",rc); + if (rc==DS_OK && listener!=NULL) { + LPDIRECTSOUNDBUFFER temp_buffer=NULL; + + /* Checking the COM interface */ + rc=IDirectSoundBuffer_QueryInterface(primary, &IID_IDirectSoundBuffer,(LPVOID *)&temp_buffer); + ok(rc==DS_OK && temp_buffer!=NULL,"IDirectSoundBuffer_QueryInterface failed: 0x%lx\n",rc); + ok(temp_buffer==primary,"COM interface broken: 0x%08lx != 0x%08lx\n",(DWORD)temp_buffer,(DWORD)primary); + if (rc==DS_OK && temp_buffer!=NULL) { + ref=IDirectSoundBuffer_Release(temp_buffer); + ok(ref==1,"IDirectSoundBuffer_Release has %d references, should have 1\n",ref); + + temp_buffer=NULL; + rc=IDirectSound3DListener_QueryInterface(listener, &IID_IDirectSoundBuffer,(LPVOID *)&temp_buffer); + ok(rc==DS_OK && temp_buffer!=NULL,"IDirectSoundBuffer_QueryInterface failed: 0x%lx\n",rc); + ok(temp_buffer==primary,"COM interface broken: 0x%08lx != 0x%08lx\n",(DWORD)temp_buffer,(DWORD)primary); + ref=IDirectSoundBuffer_Release(temp_buffer); + ok(ref==1,"IDirectSoundBuffer_Release has %d references, should have 1\n",ref); + + /* Testing the buffer */ + test_buffer8(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive && !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,listener,0,0); + } + + /* Testing the reference counting */ + ref=IDirectSound3DListener_Release(listener); + ok(ref==0,"IDirectSound3DListener_Release listener has %d references, should have 0\n",ref); + } + + /* Testing the reference counting */ + ref=IDirectSoundBuffer_Release(primary); + ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref); + } + +EXIT: + ref=IDirectSound8_Release(dso); + ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref); + if (ref!=0) +return DSERR_GENERIC; + + return rc; +} + +static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, + LPCSTR lpcstrModule, LPVOID lpContext) +{ + trace("*** Testing %s - %s\n",lpcstrDescription,lpcstrModule); + + trace(" Testing the primary buffer\n"); + test_primary8(lpGuid); + + trace(" Testing 3D primary buffer\n"); + test_primary_3d8(lpGuid); + + trace(" Testing 3D primary buffer with listener\n"); + test_primary_3d_with_listener8(lpGuid); + + /* Testing secondary buffers */ + test_secondary8(lpGuid,winetest_interactive,0,0,0,0,0,0); + test_secondary8(lpGuid,winetest_interactive,0,0,0,1,0,0); + + /* Testing 3D secondary buffers */ + test_secondary8(lpGuid,winetest_interactive,1,0,0,0,0,0); + test_secondary8(lpGuid,winetest_interactive,1,1,0,0,0,0); + test_secondary8(lpGuid,winetest_interactive,1,1,0,1,0,0); + test_secondary8(lpGuid,winetest_interactive,1,0,1,0,0,0); + test_secondary8(lpGuid,winetest_interactive,1,0,1,1,0,0); + test_secondary8(lpGuid,winetest_interactive,1,1,1,0,0,0); + test_secondary8(lpGuid,winetest_interactive,1,1,1,1,0,0); + test_secondary8(lpGuid,winetest_interactive,1,1,1,0,1,0); + test_secondary8(lpGuid,winetest_interactive,1,1,1,0,0,1); + test_secondary8(lpGuid,winetest_interactive,1,1,1,0,1,1); + + return 1; +} + +static void ds3d8_tests() +{ + HRESULT rc; + rc=DirectSoundEnumerateA(&dsenum_callback,NULL); + ok(rc==DS_OK,"DirectSoundEnumerate failed: %ld\n",rc); +} + +START_TEST(ds3d8) +{ + HMODULE hDsound; + FARPROC pFunc; + + CoInitialize(NULL); + + hDsound = LoadLibraryA("dsound.dll"); + if (!hDsound) { + trace("dsound.dll not found\n"); + return; + } + + pFunc = (void*)GetProcAddress(hDsound, "DirectSoundCreate8"); + if (!pFunc) { + trace("ds3d8 test skipped\n"); + return; + } + + ds3d8_tests(); +} diff --git a/dlls/dsound/tests/dsound.c b/dlls/dsound/tests/dsound.c index 8480c749e0c..9a2653f7e8f 100644 --- a/dlls/dsound/tests/dsound.c +++ b/dlls/dsound/tests/dsound.c @@ -37,418 +37,209 @@ #include "wingdi.h" #include "dsound.h" #include "dxerr8.h" +#include "dsconf.h" #include "dsound_test.h" -static void dsound_dsound_tests() +static void IDirectSound_test(LPDIRECTSOUND dso, BOOL initialized, + LPCGUID lpGuid) { HRESULT rc; - LPDIRECTSOUND dso=NULL; DSCAPS dscaps; int ref; IUnknown * unknown; IDirectSound * ds; IDirectSound8 * ds8; + DWORD speaker_config, new_speaker_config; - /* try the COM class factory method of creation */ - rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound, (void**)&dso); - ok(rc==S_OK,"CoCreateInstance failed: %s\n",DXGetErrorString8(rc)); - if (dso) { - /* Try to Query for objects */ - rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); - ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(unknown); + /* Try to Query for objects */ + rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); + ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK) + IDirectSound_Release(unknown); - rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); - ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(ds); + rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); + ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK) + IDirectSound_Release(ds); - rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); - ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(ds8); + rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); + ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) " + "should have failed: %s\n",DXGetErrorString8(rc)); + if (rc==DS_OK) + IDirectSound8_Release(ds8); + if (initialized == FALSE) { /* try unitialized object */ rc=IDirectSound_GetCaps(dso,0); - ok(rc==DSERR_UNINITIALIZED,"GetCaps should have returned DSERR_UNINITIALIZED, returned: %s\n",DXGetErrorString8(rc)); + ok(rc==DSERR_UNINITIALIZED,"IDirectSound_GetCaps(NULL) " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); - rc=IDirectSound_Initialize(dso,NULL); - ok(rc==DS_OK,"IDirectSound_Initialize(NULL) failed: %s\n",DXGetErrorString8(rc)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound_GetCaps(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - ZeroMemory(&dscaps, sizeof(dscaps)); - - /* DSOUND: Error: Invalid caps buffer */ rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); + ok(rc==DSERR_UNINITIALIZED,"IDirectSound_GetCaps() " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); - dscaps.dwSize=sizeof(dscaps); + rc=IDirectSound_Compact(dso); + ok(rc==DSERR_UNINITIALIZED,"IDirectSound_Compact() " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); - /* DSOUND: Running on a certified driver */ - rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n", - dscaps.dwFlags,dscaps.dwMinSecondarySampleRate, - dscaps.dwMaxSecondarySampleRate); - } + rc=IDirectSound_GetSpeakerConfig(dso,&speaker_config); + ok(rc==DSERR_UNINITIALIZED,"IDirectSound_GetSpeakerConfig() " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); - ref=IDirectSound_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); + rc=IDirectSound_Initialize(dso,lpGuid); + ok(rc==DS_OK,"IDirectSound_Initialize() failed: %s\n", + DXGetErrorString8(rc)); } + /* DSOUND: Error: Invalid caps buffer */ + rc=IDirectSound_GetCaps(dso,0); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound_GetCaps(NULL) " + "should have failed: %s\n",DXGetErrorString8(rc)); + + ZeroMemory(&dscaps, sizeof(dscaps)); + + /* DSOUND: Error: Invalid caps buffer */ + rc=IDirectSound_GetCaps(dso,&dscaps); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound_GetCaps() " + "should have failed: %s\n",DXGetErrorString8(rc)); + + dscaps.dwSize=sizeof(dscaps); + + /* DSOUND: Running on a certified driver */ + rc=IDirectSound_GetCaps(dso,&dscaps); + ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc)); + + rc=IDirectSound_Compact(dso); + ok(rc==DSERR_PRIOLEVELNEEDED,"IDirectSound_Compact() failed: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSound_Compact(dso); + ok(rc==DS_OK,"IDirectSound_Compact() failed: %s\n",DXGetErrorString8(rc)); + + rc=IDirectSound_GetSpeakerConfig(dso,0); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound_GetSpeakerConfig(NULL) " + "should have failed: %s\n",DXGetErrorString8(rc)); + + rc=IDirectSound_GetSpeakerConfig(dso,&speaker_config); + ok(rc==DS_OK,"IDirectSound_GetSpeakerConfig() failed: %s\n", + DXGetErrorString8(rc)); + + speaker_config = DSSPEAKER_COMBINED(DSSPEAKER_STEREO, + DSSPEAKER_GEOMETRY_WIDE); + rc=IDirectSound_SetSpeakerConfig(dso,speaker_config); + ok(rc==DS_OK,"IDirectSound_SetSpeakerConfig() failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK) { + rc=IDirectSound_GetSpeakerConfig(dso,&new_speaker_config); + ok(rc==DS_OK,"IDirectSound_GetSpeakerConfig() failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK) + ok(speaker_config==new_speaker_config, + "IDirectSound_GetSpeakerConfig() failed to set speaker config: " + "expected 0x%08lx, got 0x%08lx\n", + speaker_config,new_speaker_config); + } + + ref=IDirectSound_Release(dso); + ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref); +} + +static void IDirectSound_tests() +{ + HRESULT rc; + LPDIRECTSOUND dso=NULL; + + trace("Testing IDirectSound\n"); + + /* try the COM class factory method of creation with no device specified */ + rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound, (void**)&dso); + ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n", + DXGetErrorString8(rc)); + if (dso) + IDirectSound_test(dso, FALSE, NULL); + + /* try the COM class factory method of creation with default playback + * device specified */ + rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound, (void**)&dso); + ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n", + DXGetErrorString8(rc)); + if (dso) + IDirectSound_test(dso, FALSE, &DSDEVID_DefaultPlayback); + + /* try the COM class factory method of creation with default voice + * playback device specified */ + rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound, (void**)&dso); + ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n", + DXGetErrorString8(rc)); + if (dso) + IDirectSound_test(dso, FALSE, &DSDEVID_DefaultVoicePlayback); + + /* try the COM class factory method of creation with a bad + * IID specified */ + rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, + &CLSID_DirectSoundPrivate, (void**)&dso); + ok(rc==E_NOINTERFACE, + "CoCreateInstance(CLSID_DirectSound,CLSID_DirectSoundPrivate) " + "should have failed: %s\n",DXGetErrorString8(rc)); + + /* try the COM class factory method of creation with a bad + * GUID and IID specified */ + rc=CoCreateInstance(&CLSID_DirectSoundPrivate, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound, (void**)&dso); + ok(rc==REGDB_E_CLASSNOTREG, + "CoCreateInstance(CLSID_DirectSoundPrivate,IID_IDirectSound) " + "should have failed: %s\n",DXGetErrorString8(rc)); + /* try with no device specified */ rc=DirectSoundCreate(NULL,&dso,NULL); ok(rc==S_OK,"DirectSoundCreate(NULL) failed: %s\n",DXGetErrorString8(rc)); - if (dso) { - /* Try to Query for objects */ - rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); - ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(unknown); - - rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); - ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(ds); - - rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); - ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(ds8); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound_GetCaps(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - ZeroMemory(&dscaps, sizeof(dscaps)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - dscaps.dwSize=sizeof(dscaps); - - /* DSOUND: Running on a certified driver */ - rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n", - dscaps.dwFlags,dscaps.dwMinSecondarySampleRate, - dscaps.dwMaxSecondarySampleRate); - } - - ref=IDirectSound_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - } + if (dso) + IDirectSound_test(dso, TRUE, NULL); /* try with default playback device specified */ rc=DirectSoundCreate(&DSDEVID_DefaultPlayback,&dso,NULL); - ok(rc==S_OK,"DirectSoundCreate(DSDEVID_DefaultPlayback) failed: %s\n",DXGetErrorString8(rc)); - if (dso) { - /* Try to Query for objects */ - rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); - ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(unknown); - - rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); - ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(ds); - - rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); - ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(ds8); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound_GetCaps(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - ZeroMemory(&dscaps, sizeof(dscaps)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - dscaps.dwSize=sizeof(dscaps); - - /* DSOUND: Running on a certified driver */ - rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n", - dscaps.dwFlags,dscaps.dwMinSecondarySampleRate, - dscaps.dwMaxSecondarySampleRate); - } - - ref=IDirectSound_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - } + ok(rc==S_OK,"DirectSoundCreate(DSDEVID_DefaultPlayback) failed: %s\n", + DXGetErrorString8(rc)); + if (dso) + IDirectSound_test(dso, TRUE, NULL); /* try with default voice playback device specified */ rc=DirectSoundCreate(&DSDEVID_DefaultVoicePlayback,&dso,NULL); - ok(rc==S_OK,"DirectSoundCreate(DSDEVID_DefaultVoicePlayback) failed: %s\n",DXGetErrorString8(rc)); - if (dso) { - /* Try to Query for objects */ - rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); - ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(unknown); + ok(rc==S_OK,"DirectSoundCreate(DSDEVID_DefaultVoicePlayback) failed: %s\n", + DXGetErrorString8(rc)); + if (dso) + IDirectSound_test(dso, TRUE, NULL); - rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); - ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(ds); - - rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); - ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(ds8); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound_GetCaps(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - ZeroMemory(&dscaps, sizeof(dscaps)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - dscaps.dwSize=sizeof(dscaps); - - /* DSOUND: Running on a certified driver */ - rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n", - dscaps.dwFlags,dscaps.dwMinSecondarySampleRate, - dscaps.dwMaxSecondarySampleRate); - } - - ref=IDirectSound_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - } -} - -static void dsound_dsound8_tests() -{ - HRESULT rc; - LPDIRECTSOUND8 dso=NULL; - DSCAPS dscaps; - int ref; - IUnknown * unknown; - IDirectSound * ds; - IDirectSound8 * ds8; - - /* try the COM class factory method of creation */ - rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound8, (void**)&dso); - ok(rc==S_OK,"CoCreateInstance failed: %s\n",DXGetErrorString8(rc)); - if (dso) { - /* Try to Query for objects */ - rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(unknown); - - rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(ds); - - rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(ds8); - - /* try unitialized object */ - rc=IDirectSound8_GetCaps(dso,0); - ok(rc==DSERR_UNINITIALIZED,"GetCaps should have returned DSERR_UNINITIALIZED, returned: %s\n",DXGetErrorString8(rc)); - - rc=IDirectSound8_Initialize(dso,NULL); - ok(rc==DS_OK,"IDirectSound_Initialize(NULL) failed: %s\n",DXGetErrorString8(rc)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound8_GetCaps(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - ZeroMemory(&dscaps, sizeof(dscaps)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound8_GetCaps(dso,&dscaps); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - dscaps.dwSize=sizeof(dscaps); - - /* DSOUND: Running on a certified driver */ - rc=IDirectSound8_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n", - dscaps.dwFlags,dscaps.dwMinSecondarySampleRate, - dscaps.dwMaxSecondarySampleRate); - } - - ref=IDirectSound8_Release(dso); - ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref); - } - - /* try with no device specified */ - rc=DirectSoundCreate8(NULL,&dso,NULL); - ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); - if (dso) { - /* Try to Query for objects */ - rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(unknown); - - rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(ds); - - rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(ds8); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound8_GetCaps(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - ZeroMemory(&dscaps, sizeof(dscaps)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound8_GetCaps(dso,&dscaps); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - dscaps.dwSize=sizeof(dscaps); - - /* DSOUND: Running on a certified driver */ - rc=IDirectSound8_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n", - dscaps.dwFlags,dscaps.dwMinSecondarySampleRate, - dscaps.dwMaxSecondarySampleRate); - } - - ref=IDirectSound8_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - } - - /* try with default playback device specified */ - rc=DirectSoundCreate8(&DSDEVID_DefaultPlayback,&dso,NULL); - ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); - if (dso) { - /* Try to Query for objects */ - rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(unknown); - - rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(ds); - - rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(ds8); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound8_GetCaps(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - ZeroMemory(&dscaps, sizeof(dscaps)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound8_GetCaps(dso,&dscaps); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - dscaps.dwSize=sizeof(dscaps); - - /* DSOUND: Running on a certified driver */ - rc=IDirectSound8_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n", - dscaps.dwFlags,dscaps.dwMinSecondarySampleRate, - dscaps.dwMaxSecondarySampleRate); - } - - ref=IDirectSound8_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - } - - /* try with default voice playback device specified */ - rc=DirectSoundCreate8(&DSDEVID_DefaultVoicePlayback,&dso,NULL); - ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); - if (dso) { - /* Try to Query for objects */ - rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(unknown); - - rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(ds); - - rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(ds8); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound8_GetCaps(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - ZeroMemory(&dscaps, sizeof(dscaps)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound8_GetCaps(dso,&dscaps); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - dscaps.dwSize=sizeof(dscaps); - - /* DSOUND: Running on a certified driver */ - rc=IDirectSound8_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n", - dscaps.dwFlags,dscaps.dwMinSecondarySampleRate, - dscaps.dwMaxSecondarySampleRate); - } - - ref=IDirectSound8_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - } + /* try with a bad device specified */ + rc=DirectSoundCreate(&DSDEVID_DefaultVoiceCapture,&dso,NULL); + ok(rc==DSERR_NODRIVER,"DirectSoundCreate(DSDEVID_DefaultVoiceCapture) " + "should have failed: %s\n",DXGetErrorString8(rc)); } static HRESULT test_dsound(LPGUID lpGuid) { HRESULT rc; LPDIRECTSOUND dso=NULL; - DSCAPS dscaps; int ref; - IUnknown * unknown; - IDirectSound * ds; - IDirectSound8 * ds8; /* DSOUND: Error: Invalid interface buffer */ rc=DirectSoundCreate(lpGuid,0,NULL); - ok(rc==DSERR_INVALIDPARAM,"DirectSoundCreate should have failed: %s\n",DXGetErrorString8(rc)); + ok(rc==DSERR_INVALIDPARAM,"DirectSoundCreate should have failed: %s\n", + DXGetErrorString8(rc)); /* Create the DirectSound object */ rc=DirectSoundCreate(lpGuid,&dso,NULL); @@ -456,48 +247,16 @@ static HRESULT test_dsound(LPGUID lpGuid) if (rc!=DS_OK) return rc; - /* Try to Query for objects */ - rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); - ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(unknown); + /* Try the enumerated device */ + IDirectSound_test(dso, TRUE, lpGuid); - rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); - ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(ds); - - rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); - ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(ds8); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound_GetCaps(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - ZeroMemory(&dscaps, sizeof(dscaps)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - dscaps.dwSize=sizeof(dscaps); - - /* DSOUND: Running on a certified driver */ - rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n", - dscaps.dwFlags,dscaps.dwMinSecondarySampleRate, - dscaps.dwMaxSecondarySampleRate); - } - - /* Release the DirectSound object */ - ref=IDirectSound_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - if (ref!=0) - return DSERR_GENERIC; + /* Try the COM class factory method of creation with enumerated device */ + rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound, (void**)&dso); + ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n", + DXGetErrorString8(rc)); + if (dso) + IDirectSound_test(dso, FALSE, lpGuid); /* Create a DirectSound object */ rc=DirectSoundCreate(lpGuid,&dso,NULL); @@ -511,13 +270,16 @@ static HRESULT test_dsound(LPGUID lpGuid) if (rc==DS_OK) { /* Release the second DirectSound object */ ref=IDirectSound_Release(dso1); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - ok(dso!=dso1,"DirectSound objects should be unique: dso=0x%08lx,dso1=0x%08lx\n",(DWORD)dso,(DWORD)dso1); + ok(ref==0,"IDirectSound_Release has %d references, should have 0\n", + ref); + ok(dso!=dso1,"DirectSound objects should be unique: " + "dso=0x%08lx,dso1=0x%08lx\n",(DWORD)dso,(DWORD)dso1); } /* Release the first DirectSound object */ ref=IDirectSound_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); + ok(ref==0,"IDirectSound_Release has %d references, should have 0\n", + ref); if (ref!=0) return DSERR_GENERIC; } else @@ -538,152 +300,28 @@ static HRESULT test_dsound(LPGUID lpGuid) 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); + ok(rc==DS_OK && secondary!=NULL, + "IDirectSound_CreateSoundBuffer failed to create a secondary buffer " + "%s\n",DXGetErrorString8(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",DXGetErrorString8(rc)); + rc=IDirectSound_QueryInterface(secondary, &IID_IDirectSound3DBuffer, + (void **)&buffer3d); + ok(rc==DS_OK && buffer3d!=NULL,"QueryInterface failed: %s\n", + DXGetErrorString8(rc)); if (rc==DS_OK && buffer3d!=NULL) { ref=IDirectSound3DBuffer_AddRef(buffer3d); - ok(ref==2,"IDirectSound3DBuffer_AddRef has %d references, should have 2\n",ref); + ok(ref==2,"IDirectSound3DBuffer_AddRef has %d references, " + "should have 2\n",ref); } ref=IDirectSoundBuffer_AddRef(secondary); - ok(ref==2,"IDirectSoundBuffer_AddRef has %d references, should have 2\n",ref); + ok(ref==2,"IDirectSoundBuffer_AddRef has %d references, " + "should have 2\n",ref); } /* release with buffer */ ref=IDirectSound_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - if (ref!=0) - return DSERR_GENERIC; - } else - return rc; - - return DS_OK; -} - -static HRESULT test_dsound8(LPGUID lpGuid) -{ - HRESULT rc; - LPDIRECTSOUND8 dso=NULL; - DSCAPS dscaps; - int ref; - IUnknown * unknown; - IDirectSound * ds; - IDirectSound8 * ds8; - - /* DSOUND: Error: Invalid interface buffer */ - rc=DirectSoundCreate8(lpGuid,0,NULL); - ok(rc==DSERR_INVALIDPARAM,"DirectSoundCreate8 should have failed: %s\n",DXGetErrorString8(rc)); - - /* Create the DirectSound8 object */ - rc=DirectSoundCreate8(lpGuid,&dso,NULL); - ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); - if (rc!=DS_OK) - return rc; - - /* Try to Query for objects */ - rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(unknown); - - rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound_Release(ds); - - rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); - ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) - IDirectSound8_Release(ds8); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound8_GetCaps(dso,0); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - ZeroMemory(&dscaps, sizeof(dscaps)); - - /* DSOUND: Error: Invalid caps buffer */ - rc=IDirectSound8_GetCaps(dso,&dscaps); - ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString8(rc)); - - dscaps.dwSize=sizeof(dscaps); - - /* DSOUND: Running on a certified driver */ - rc=IDirectSound8_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n", - dscaps.dwFlags,dscaps.dwMinSecondarySampleRate, - dscaps.dwMaxSecondarySampleRate); - } - - /* Release the DirectSound8 object */ - ref=IDirectSound8_Release(dso); - ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref); - if (ref!=0) - return DSERR_GENERIC; - - /* Create a DirectSound8 object */ - rc=DirectSoundCreate8(lpGuid,&dso,NULL); - ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - LPDIRECTSOUND8 dso1=NULL; - - /* Create a second DirectSound8 object */ - rc=DirectSoundCreate8(lpGuid,&dso1,NULL); - ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - /* Release the second DirectSound8 object */ - ref=IDirectSound8_Release(dso1); - ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref); - ok(dso!=dso1,"DirectSound8 objects should be unique: dso=0x%08lx,dso1=0x%08lx\n",(DWORD)dso,(DWORD)dso1); - } - - /* Release the first DirectSound8 object */ - ref=IDirectSound8_Release(dso); - ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref); - if (ref!=0) - return DSERR_GENERIC; - } else - return rc; - - /* Create a DirectSound8 object */ - rc=DirectSoundCreate8(lpGuid,&dso,NULL); - ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK) { - LPDIRECTSOUNDBUFFER secondary; - DSBUFFERDESC bufdesc; - WAVEFORMATEX wfx; - - init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1); - ZeroMemory(&bufdesc, sizeof(bufdesc)); - bufdesc.dwSize=sizeof(bufdesc); - bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D; - 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; - LPDIRECTSOUNDBUFFER8 buffer8; - rc=IDirectSound_QueryInterface(secondary, &IID_IDirectSound3DBuffer, (void **)&buffer3d); - ok(rc==DS_OK && buffer3d!=NULL,"QueryInterface failed: %s\n",DXGetErrorString8(rc)); - if (rc==DS_OK && buffer3d!=NULL) { - ref=IDirectSound3DBuffer_AddRef(buffer3d); - ok(ref==2,"IDirectSound3DBuffer_AddRef has %d references, should have 2\n",ref); - } - rc=IDirectSound_QueryInterface(secondary, &IID_IDirectSoundBuffer8, (void **)&buffer8); - if (rc==DS_OK && buffer8!=NULL) { - ref=IDirectSoundBuffer8_AddRef(buffer8); - ok(ref==3,"IDirectSoundBuffer8_AddRef has %d references, should have 3\n",ref); - } - ref=IDirectSoundBuffer_AddRef(secondary); - ok(ref==4,"IDirectSoundBuffer_AddRef has %d references, should have 4\n",ref); - } - /* release with buffer */ - ref=IDirectSound8_Release(dso); - ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref); + ok(ref==0,"IDirectSound_Release has %d references, should have 0\n", + ref); if (ref!=0) return DSERR_GENERIC; } else @@ -703,7 +341,7 @@ static HRESULT test_primary(LPGUID lpGuid) /* Create the DirectSound object */ rc=DirectSoundCreate(lpGuid,&dso,NULL); - ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc); + ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString8(rc)); if (rc!=DS_OK) return rc; @@ -711,33 +349,42 @@ static HRESULT test_primary(LPGUID lpGuid) ZeroMemory(&dscaps, sizeof(dscaps)); dscaps.dwSize=sizeof(dscaps); rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: 0x%lx\n",rc); + ok(rc==DS_OK,"IDirectSound_GetCaps failed: %s\n",DXGetErrorString8(rc)); if (rc!=DS_OK) goto EXIT; /* DSOUND: Error: Invalid buffer description pointer */ rc=IDirectSound_CreateSoundBuffer(dso,0,0,NULL); - ok(rc==DSERR_INVALIDPARAM,"CreateSoundBuffer should have failed: 0x%lx\n",rc); + ok(rc==DSERR_INVALIDPARAM, + "IDirectSound_CreateSoundBuffer should have failed: %s\n", + DXGetErrorString8(rc)); /* DSOUND: Error: Invalid buffer description pointer */ rc=IDirectSound_CreateSoundBuffer(dso,0,&primary,NULL); - ok(rc==DSERR_INVALIDPARAM && primary==0,"CreateSoundBuffer should have failed: rc=0x%lx,dsbo=0x%lx\n",rc,(DWORD)primary); + ok(rc==DSERR_INVALIDPARAM && primary==0, + "IDirectSound_CreateSoundBuffer should have failed: rc=%s,dsbo=0x%lx\n", + DXGetErrorString8(rc),(DWORD)primary); /* DSOUND: Error: Invalid buffer description pointer */ rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,0,NULL); - ok(rc==DSERR_INVALIDPARAM && primary==0,"CreateSoundBuffer should have failed: rc=0x%lx,dsbo=0x%lx\n",rc,(DWORD)primary); + ok(rc==DSERR_INVALIDPARAM && primary==0, + "IDirectSound_CreateSoundBuffer should have failed: rc=%s,dsbo=0x%lx\n", + DXGetErrorString8(rc),(DWORD)primary); ZeroMemory(&bufdesc, sizeof(bufdesc)); /* DSOUND: Error: Invalid size */ /* DSOUND: Error: Invalid buffer description */ rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); - ok(rc==DSERR_INVALIDPARAM && primary==0,"CreateSoundBuffer should have failed: rc=0x%lx,primary=0x%lx\n",rc,(DWORD)primary); + ok(rc==DSERR_INVALIDPARAM && primary==0, + "IDirectSound_CreateSoundBuffer should have failed: rc=%s," + "primary=0x%lx\n",DXGetErrorString8(rc),(DWORD)primary); /* We must call SetCooperativeLevel before calling CreateSoundBuffer */ /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */ rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); - ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc); + ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel failed: %s\n", + DXGetErrorString8(rc)); if (rc!=DS_OK) goto EXIT; @@ -747,44 +394,55 @@ static HRESULT test_primary(LPGUID lpGuid) bufdesc.dwSize=sizeof(bufdesc); bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME; rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); - ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a primary buffer: 0x%lx\n",rc); + ok(rc==DS_OK && primary!=NULL, + "IDirectSound_CreateSoundBuffer failed to create a primary buffer: %s\n", + DXGetErrorString8(rc)); if (rc==DS_OK && primary!=NULL) { LONG vol; /* Try to create a second primary buffer */ - /* DSOUND: Error: The primary buffer already exists. Any changes made to the buffer description will be ignored. */ + /* DSOUND: Error: The primary buffer already exists. + * Any changes made to the buffer description will be ignored. */ rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&second,NULL); - ok(rc==DS_OK && second==primary,"CreateSoundBuffer should have returned original primary buffer: 0x%lx\n",rc); + ok(rc==DS_OK && second==primary, + "IDirectSound_CreateSoundBuffer should have returned original " + "primary buffer: %s\n",DXGetErrorString8(rc)); ref=IDirectSoundBuffer_Release(second); - ok(ref==1,"IDirectSoundBuffer_Release primary has %d references, should have 1\n",ref); + ok(ref==1,"IDirectSoundBuffer_Release primary has %d references, " + "should have 1\n",ref); /* Try to duplicate a primary buffer */ /* DSOUND: Error: Can't duplicate primary buffers */ rc=IDirectSound_DuplicateSoundBuffer(dso,primary,&third); /* rc=0x88780032 */ - ok(rc!=DS_OK,"IDirectSound_DuplicateSoundBuffer primary buffer should have failed 0x%lx\n",rc); + ok(rc!=DS_OK,"IDirectSound_DuplicateSoundBuffer primary buffer should " + "have failed %s\n",DXGetErrorString8(rc)); rc=IDirectSoundBuffer_GetVolume(primary,&vol); - ok(rc==DS_OK,"GetVolume failed: 0x%lx\n",rc); + ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume failed: %s\n", + DXGetErrorString8(rc)); - if (winetest_interactive) - { + if (winetest_interactive) { trace("Playing a 5 seconds reference tone at the current volume.\n"); if (rc==DS_OK) - trace("(the current volume is %ld according to DirectSound)\n",vol); + trace("(the current volume is %ld according to DirectSound)\n", + vol); trace("All subsequent tones should be identical to this one.\n"); trace("Listen for stutter, changes in pitch, volume, etc.\n"); } - test_buffer(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive && !(dscaps.dwFlags & DSCAPS_EMULDRIVER),5.0,0,0,0,0); + test_buffer(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive && + !(dscaps.dwFlags & DSCAPS_EMULDRIVER),5.0,0,0,0,0); ref=IDirectSoundBuffer_Release(primary); - ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref); + ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, " + "should have 0\n",ref); } /* Set the CooperativeLevel back to normal */ /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */ rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL); - ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc); + ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel failed: %s\n", + DXGetErrorString8(rc)); EXIT: ref=IDirectSound_Release(dso); @@ -807,7 +465,7 @@ static HRESULT test_secondary(LPGUID lpGuid) /* Create the DirectSound object */ rc=DirectSoundCreate(lpGuid,&dso,NULL); - ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc); + ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString8(rc)); if (rc!=DS_OK) return rc; @@ -815,14 +473,15 @@ static HRESULT test_secondary(LPGUID lpGuid) ZeroMemory(&dscaps, sizeof(dscaps)); dscaps.dwSize=sizeof(dscaps); rc=IDirectSound_GetCaps(dso,&dscaps); - ok(rc==DS_OK,"GetCaps failed: 0x%lx\n",rc); + ok(rc==DS_OK,"IDirectSound_GetCaps failed: %s\n",DXGetErrorString8(rc)); if (rc!=DS_OK) goto EXIT; /* We must call SetCooperativeLevel before creating primary buffer */ /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */ rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); - ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc); + ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel failed: %s\n", + DXGetErrorString8(rc)); if (rc!=DS_OK) goto EXIT; @@ -830,11 +489,14 @@ static HRESULT test_secondary(LPGUID lpGuid) bufdesc.dwSize=sizeof(bufdesc); bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER; rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); - ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a primary buffer 0x%lx\n", rc); + ok(rc==DS_OK && primary!=NULL, + "IDirectSound_CreateSoundBuffer failed to create a primary buffer %s\n", + DXGetErrorString8(rc)); if (rc==DS_OK && primary!=NULL) { for (f=0;f + +#include +#include + +#include "wine/test.h" +#include "windef.h" +#include "wingdi.h" +#include "dsound.h" +#include "dxerr8.h" +#include "dsconf.h" + +#include "dsound_test.h" + +static void IDirectSound8_test(LPDIRECTSOUND8 dso, BOOL initialized, + LPCGUID lpGuid) +{ + HRESULT rc; + DSCAPS dscaps; + int ref; + IUnknown * unknown; + IDirectSound * ds; + IDirectSound8 * ds8; + DWORD speaker_config, new_speaker_config; + DWORD certified; + + /* Try to Query for objects */ + rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown); + ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK) + IDirectSound8_Release(unknown); + + rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds); + ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK) + IDirectSound_Release(ds); + + rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8); + ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) " + "should have failed: %s\n",DXGetErrorString8(rc)); + if (rc==DS_OK) + IDirectSound8_Release(ds8); + + if (initialized == FALSE) { + /* try unitialized object */ + rc=IDirectSound8_GetCaps(dso,0); + ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_GetCaps(NULL) " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSound8_GetCaps(dso,&dscaps); + ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_GetCaps() " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSound8_Compact(dso); + ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_Compact() " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSound8_GetSpeakerConfig(dso,&speaker_config); + ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_GetSpeakerConfig() " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSound8_VerifyCertification(dso, &certified); + ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_VerifyCertification() " + "should have returned DSERR_UNINITIALIZED, returned: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSound8_Initialize(dso,lpGuid); + ok(rc==DS_OK,"IDirectSound8_Initialize() failed: %s\n", + DXGetErrorString8(rc)); + } + + /* DSOUND: Error: Invalid caps buffer */ + rc=IDirectSound8_GetCaps(dso,0); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_GetCaps() " + "should have failed: %s\n",DXGetErrorString8(rc)); + + ZeroMemory(&dscaps, sizeof(dscaps)); + + /* DSOUND: Error: Invalid caps buffer */ + rc=IDirectSound8_GetCaps(dso,&dscaps); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_GetCaps() " + "should have failed: %s\n",DXGetErrorString8(rc)); + + dscaps.dwSize=sizeof(dscaps); + + /* DSOUND: Running on a certified driver */ + rc=IDirectSound8_GetCaps(dso,&dscaps); + ok(rc==DS_OK,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc)); + + rc=IDirectSound8_Compact(dso); + ok(rc==DSERR_PRIOLEVELNEEDED,"IDirectSound8_Compact() failed: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel() failed: %s\n", + DXGetErrorString8(rc)); + + rc=IDirectSound8_Compact(dso); + ok(rc==DS_OK,"IDirectSound8_Compact() failed: %s\n",DXGetErrorString8(rc)); + + rc=IDirectSound8_GetSpeakerConfig(dso,0); + ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_GetSpeakerConfig(NULL) " + "should have failed: %s\n",DXGetErrorString8(rc)); + + rc=IDirectSound8_GetSpeakerConfig(dso,&speaker_config); + ok(rc==DS_OK,"IDirectSound8_GetSpeakerConfig() failed: %s\n", + DXGetErrorString8(rc)); + + speaker_config = DSSPEAKER_COMBINED(DSSPEAKER_STEREO, + DSSPEAKER_GEOMETRY_WIDE); + rc=IDirectSound8_SetSpeakerConfig(dso,speaker_config); + ok(rc==DS_OK,"IDirectSound8_SetSpeakerConfig() failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK) { + rc=IDirectSound8_GetSpeakerConfig(dso,&new_speaker_config); + ok(rc==DS_OK,"IDirectSound8_GetSpeakerConfig() failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK) + ok(speaker_config==new_speaker_config, + "IDirectSound8_GetSpeakerConfig() failed to set speaker config: " + "expected 0x%08lx, got 0x%08lx\n", + speaker_config,new_speaker_config); + } + + rc=IDirectSound8_VerifyCertification(dso, &certified); + ok(rc==DS_OK,"IDirectSound8_VerifyCertification() failed: %s\n", + DXGetErrorString8(rc)); + + ref=IDirectSound8_Release(dso); + ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref); +} + +static void IDirectSound8_tests() +{ + HRESULT rc; + LPDIRECTSOUND8 dso=NULL; + + trace("Testing IDirectSound8\n"); + + /* try the COM class factory method of creation with no device specified */ + rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound8, (void**)&dso); + ok(rc==S_OK,"CoCreateInstance failed: %s\n",DXGetErrorString8(rc)); + if (dso) + IDirectSound8_test(dso, FALSE, NULL); + + /* try the COM class factory method of creation with default playback + * device specified */ + rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound8, (void**)&dso); + ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound8) failed: %s\n", + DXGetErrorString8(rc)); + if (dso) + IDirectSound8_test(dso, FALSE, &DSDEVID_DefaultPlayback); + + /* try the COM class factory method of creation with default voice + * playback device specified */ + rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound8, (void**)&dso); + ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound8) failed: %s\n", + DXGetErrorString8(rc)); + if (dso) + IDirectSound8_test(dso, FALSE, &DSDEVID_DefaultVoicePlayback); + + /* try the COM class factory method of creation with a bad + * IID specified */ + rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, + &CLSID_DirectSoundPrivate, (void**)&dso); + ok(rc==E_NOINTERFACE, + "CoCreateInstance(CLSID_DirectSound8,CLSID_DirectSoundPrivate) " + "should have failed: %s\n",DXGetErrorString8(rc)); + + /* try the COM class factory method of creation with a bad + * GUID and IID specified */ + rc=CoCreateInstance(&CLSID_DirectSoundPrivate, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound8, (void**)&dso); + ok(rc==REGDB_E_CLASSNOTREG, + "CoCreateInstance(CLSID_DirectSoundPrivate,IID_IDirectSound8) " + "should have failed: %s\n",DXGetErrorString8(rc)); + + /* try with no device specified */ + rc=DirectSoundCreate8(NULL,&dso,NULL); + ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); + if (dso) + IDirectSound8_test(dso, TRUE, NULL); + + /* try with default playback device specified */ + rc=DirectSoundCreate8(&DSDEVID_DefaultPlayback,&dso,NULL); + ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); + if (dso) + IDirectSound8_test(dso, TRUE, NULL); + + /* try with default voice playback device specified */ + rc=DirectSoundCreate8(&DSDEVID_DefaultVoicePlayback,&dso,NULL); + ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); + if (dso) + IDirectSound8_test(dso, TRUE, NULL); + + /* try with a bad device specified */ + rc=DirectSoundCreate8(&DSDEVID_DefaultVoiceCapture,&dso,NULL); + ok(rc==DSERR_NODRIVER,"DirectSoundCreate8(DSDEVID_DefaultVoiceCapture) " + "should have failed: %s\n",DXGetErrorString8(rc)); +} + +static HRESULT test_dsound8(LPGUID lpGuid) +{ + HRESULT rc; + LPDIRECTSOUND8 dso=NULL; + int ref; + + /* DSOUND: Error: Invalid interface buffer */ + rc=DirectSoundCreate8(lpGuid,0,NULL); + ok(rc==DSERR_INVALIDPARAM,"DirectSoundCreate8 should have failed: %s\n", + DXGetErrorString8(rc)); + + /* Create the DirectSound8 object */ + rc=DirectSoundCreate8(lpGuid,&dso,NULL); + ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); + if (rc!=DS_OK) + return rc; + + /* Try the enumerated device */ + IDirectSound8_test(dso, TRUE, lpGuid); + + /* Try the COM class factory method of creation with enumerated device */ + rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound8, (void**)&dso); + ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n", + DXGetErrorString8(rc)); + if (dso) + IDirectSound8_test(dso, FALSE, lpGuid); + + /* Create a DirectSound8 object */ + rc=DirectSoundCreate8(lpGuid,&dso,NULL); + ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString8(rc)); + if (rc==DS_OK) { + LPDIRECTSOUND8 dso1=NULL; + + /* Create a second DirectSound8 object */ + rc=DirectSoundCreate8(lpGuid,&dso1,NULL); + ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); + if (rc==DS_OK) { + /* Release the second DirectSound8 object */ + ref=IDirectSound8_Release(dso1); + ok(ref==0,"IDirectSound8_Release has %d references, " + "should have 0\n",ref); + ok(dso!=dso1,"DirectSound8 objects should be unique: " + "dso=0x%08lx,dso1=0x%08lx\n",(DWORD)dso,(DWORD)dso1); + } + + /* Release the first DirectSound8 object */ + ref=IDirectSound8_Release(dso); + ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n", + ref); + if (ref!=0) + return DSERR_GENERIC; + } else + return rc; + + /* Create a DirectSound8 object */ + rc=DirectSoundCreate8(lpGuid,&dso,NULL); + ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); + if (rc==DS_OK) { + LPDIRECTSOUNDBUFFER secondary; + DSBUFFERDESC bufdesc; + WAVEFORMATEX wfx; + + init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1); + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D; + bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000; + bufdesc.lpwfxFormat=&wfx; + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); + ok(rc==DS_OK && secondary!=NULL, + "IDirectSound8_CreateSoundBuffer failed to create a secondary " + "buffer %s\n",DXGetErrorString8(rc)); + if (rc==DS_OK && secondary!=NULL) { + LPDIRECTSOUND3DBUFFER buffer3d; + LPDIRECTSOUNDBUFFER8 buffer8; + rc=IDirectSound8_QueryInterface(secondary, + &IID_IDirectSound3DBuffer, + (void **)&buffer3d); + ok(rc==DS_OK && buffer3d!=NULL, + "IDirectSound8_QueryInterface failed: %s\n", + DXGetErrorString8(rc)); + if (rc==DS_OK && buffer3d!=NULL) { + ref=IDirectSound3DBuffer_AddRef(buffer3d); + ok(ref==2,"IDirectSound3DBuffer_AddRef has %d references, " + "should have 2\n",ref); + } + rc=IDirectSound8_QueryInterface(secondary, + &IID_IDirectSoundBuffer8, + (void **)&buffer8); + if (rc==DS_OK && buffer8!=NULL) { + ref=IDirectSoundBuffer8_AddRef(buffer8); + ok(ref==3,"IDirectSoundBuffer8_AddRef has %d references, " + "should have 3\n",ref); + } + ref=IDirectSoundBuffer_AddRef(secondary); + ok(ref==4,"IDirectSoundBuffer_AddRef has %d references, " + "should have 4\n",ref); + } + /* release with buffer */ + ref=IDirectSound8_Release(dso); + ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n", + ref); + if (ref!=0) + return DSERR_GENERIC; + } else + return rc; + + return DS_OK; +} + +static HRESULT test_primary8(LPGUID lpGuid) +{ + HRESULT rc; + LPDIRECTSOUND8 dso=NULL; + LPDIRECTSOUNDBUFFER primary=NULL,second=NULL,third=NULL; + DSBUFFERDESC bufdesc; + DSCAPS dscaps; + int ref; + + /* Create the DirectSound object */ + rc=DirectSoundCreate8(lpGuid,&dso,NULL); + ok(rc==DS_OK,"DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc)); + if (rc!=DS_OK) + return rc; + + /* Get the device capabilities */ + ZeroMemory(&dscaps, sizeof(dscaps)); + dscaps.dwSize=sizeof(dscaps); + rc=IDirectSound8_GetCaps(dso,&dscaps); + ok(rc==DS_OK,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc)); + if (rc!=DS_OK) + goto EXIT; + + /* DSOUND: Error: Invalid buffer description pointer */ + rc=IDirectSound8_CreateSoundBuffer(dso,0,0,NULL); + ok(rc==DSERR_INVALIDPARAM, + "IDirectSound8_CreateSoundBuffer should have failed: %s\n", + DXGetErrorString8(rc)); + + /* DSOUND: Error: Invalid buffer description pointer */ + rc=IDirectSound8_CreateSoundBuffer(dso,0,&primary,NULL); + ok(rc==DSERR_INVALIDPARAM && primary==0, + "IDirectSound8_CreateSoundBuffer should have failed: rc=%s,dsbo=0x%lx\n", + DXGetErrorString8(rc),(DWORD)primary); + + /* DSOUND: Error: Invalid buffer description pointer */ + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,0,NULL); + ok(rc==DSERR_INVALIDPARAM && primary==0, + "IDirectSound8_CreateSoundBuffer should have failed: rc=%s,dsbo=0x%lx\n", + DXGetErrorString8(rc),(DWORD)primary); + + ZeroMemory(&bufdesc, sizeof(bufdesc)); + + /* DSOUND: Error: Invalid size */ + /* DSOUND: Error: Invalid buffer description */ + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); + ok(rc==DSERR_INVALIDPARAM && primary==0, + "IDirectSound8_CreateSoundBuffer should have failed: rc=%s," + "primary=0x%lx\n",DXGetErrorString8(rc),(DWORD)primary); + + /* We must call SetCooperativeLevel before calling CreateSoundBuffer */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel failed: %s\n", + DXGetErrorString8(rc)); + if (rc!=DS_OK) + goto EXIT; + + /* Testing the primary buffer */ + 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: " + "%s\n",DXGetErrorString8(rc)); + if (rc==DS_OK && primary!=NULL) { + LONG vol; + + /* Try to create a second primary buffer */ + /* DSOUND: Error: The primary buffer already exists. + * Any changes made to the buffer description will be ignored. */ + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&second,NULL); + ok(rc==DS_OK && second==primary, + "IDirectSound8_CreateSoundBuffer should have returned original " + "primary buffer: %s\n",DXGetErrorString8(rc)); + ref=IDirectSoundBuffer_Release(second); + ok(ref==1,"IDirectSoundBuffer_Release primary has %d references, " + "should have 1\n",ref); + + /* Try to duplicate a primary buffer */ + /* DSOUND: Error: Can't duplicate primary buffers */ + rc=IDirectSound8_DuplicateSoundBuffer(dso,primary,&third); + /* rc=0x88780032 */ + ok(rc!=DS_OK,"IDirectSound8_DuplicateSoundBuffer primary buffer should " + "have failed %s\n",DXGetErrorString8(rc)); + + rc=IDirectSoundBuffer_GetVolume(primary,&vol); + ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume failed: %s\n", + DXGetErrorString8(rc)); + + if (winetest_interactive) { + trace("Playing a 5 seconds reference tone at the current volume.\n"); + if (rc==DS_OK) + trace("(the current volume is %ld according to DirectSound)\n", + vol); + trace("All subsequent tones should be identical to this one.\n"); + trace("Listen for stutter, changes in pitch, volume, etc.\n"); + } + test_buffer8(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive && + !(dscaps.dwFlags & DSCAPS_EMULDRIVER),5.0,0,0,0,0); + + ref=IDirectSoundBuffer_Release(primary); + ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, " + "should have 0\n",ref); + } + + /* Set the CooperativeLevel back to normal */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL); + ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel failed: %s\n", + DXGetErrorString8(rc)); + +EXIT: + ref=IDirectSound8_Release(dso); + ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref); + if (ref!=0) + return DSERR_GENERIC; + + return rc; +} + +static HRESULT test_secondary8(LPGUID lpGuid) +{ + HRESULT rc; + LPDIRECTSOUND8 dso=NULL; + LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL; + DSBUFFERDESC bufdesc; + DSCAPS dscaps; + WAVEFORMATEX wfx; + int f,ref; + + /* Create the DirectSound object */ + rc=DirectSoundCreate8(lpGuid,&dso,NULL); + ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString8(rc)); + if (rc!=DS_OK) + return rc; + + /* Get the device capabilities */ + ZeroMemory(&dscaps, sizeof(dscaps)); + dscaps.dwSize=sizeof(dscaps); + rc=IDirectSound8_GetCaps(dso,&dscaps); + ok(rc==DS_OK,"IDirectSound8_GetCaps failed: %s\n",DXGetErrorString8(rc)); + if (rc!=DS_OK) + goto EXIT; + + /* We must call SetCooperativeLevel before creating primary buffer */ + /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */ + rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel failed: %s\n", + DXGetErrorString8(rc)); + if (rc!=DS_OK) + goto EXIT; + + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER; + rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); + ok(rc==DS_OK && primary!=NULL, + "IDirectSound8_CreateSoundBuffer failed to create a primary buffer %s\n", + DXGetErrorString8(rc)); + + if (rc==DS_OK && primary!=NULL) { + for (f=0;f