Author: akhaldi Date: Mon Sep 30 11:39:02 2013 New Revision: 60475
URL: http://svn.reactos.org/svn/reactos?rev=60475&view=rev Log: [DSOUND_WINETEST] * Sync with Wine 1.7.1. CORE-7469
Modified: trunk/rostests/winetests/dsound/CMakeLists.txt trunk/rostests/winetests/dsound/capture.c trunk/rostests/winetests/dsound/ds3d.c trunk/rostests/winetests/dsound/ds3d8.c trunk/rostests/winetests/dsound/dsound.c trunk/rostests/winetests/dsound/dsound8.c trunk/rostests/winetests/dsound/dsound_test.h trunk/rostests/winetests/dsound/duplex.c trunk/rostests/winetests/dsound/propset.c trunk/rostests/winetests/dsound/testlist.c
Modified: trunk/rostests/winetests/dsound/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dsound/CMakeList... ============================================================================== --- trunk/rostests/winetests/dsound/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rostests/winetests/dsound/CMakeLists.txt [iso-8859-1] Mon Sep 30 11:39:02 2013 @@ -1,7 +1,3 @@ - -add_definitions( - -D__ROS_LONG64__ - -D_DLL -D__USE_CRTIMP)
list(APPEND SOURCE capture.c @@ -14,7 +10,7 @@ testlist.c)
add_executable(dsound_winetest ${SOURCE}) -target_link_libraries(dsound_winetest wine uuid dxguid) +target_link_libraries(dsound_winetest uuid dxguid) set_module_type(dsound_winetest win32cui) -add_importlibs(dsound_winetest dsound ole32 user32 msvcrt kernel32 ntdll) +add_importlibs(dsound_winetest ole32 user32 msvcrt kernel32) add_cd_file(TARGET dsound_winetest DESTINATION reactos/bin FOR all)
Modified: trunk/rostests/winetests/dsound/capture.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dsound/capture.c... ============================================================================== --- trunk/rostests/winetests/dsound/capture.c [iso-8859-1] (original) +++ trunk/rostests/winetests/dsound/capture.c [iso-8859-1] Mon Sep 30 11:39:02 2013 @@ -19,13 +19,21 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H +#define COBJMACROS + +#include <wine/test.h> + #include <stdio.h> -#include "initguid.h" -#include "windows.h" -#include "wine/test.h" -#include "dsound.h" -#include "mmreg.h" -#include "dsconf.h" +//#include "initguid.h" +//#include "windows.h" +#include <wingdi.h> +#include <mmsystem.h> +#include <dsound.h> +#include <mmreg.h> +#include <dsconf.h>
#include "dsound_test.h"
@@ -177,7 +185,7 @@ "should have 0\n", ref); }
-static void IDirectSoundCapture_tests(void) +static void test_capture(void) { HRESULT rc; LPDIRECTSOUNDCAPTURE dsco=NULL; @@ -379,8 +387,6 @@ (void **)&(state.notify)); ok((rc==DS_OK)&&(state.notify!=NULL), "IDirectSoundCaptureBuffer_QueryInterface() failed: %08x\n", rc); - if (rc!=DS_OK) - return;
for (i = 0; i < NOTIFICATIONS; i++) { state.posnotify[i].dwOffset = (i * state.size) + state.size - 1; @@ -390,28 +396,23 @@ rc=IDirectSoundNotify_SetNotificationPositions(state.notify,NOTIFICATIONS, state.posnotify); ok(rc==DS_OK,"IDirectSoundNotify_SetNotificationPositions() failed: %08x\n", rc); - if (rc!=DS_OK) - return;
ref=IDirectSoundNotify_Release(state.notify); ok(ref==0,"IDirectSoundNotify_Release(): has %d references, should have " "0\n",ref); - if (ref!=0) - return; + + rc=IDirectSoundCaptureBuffer_Start(dscbo,DSCBSTART_LOOPING); + ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Start() failed: %08x\n", rc); + + rc=IDirectSoundCaptureBuffer_Start(dscbo,0); + ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Start() failed: %08x\n", rc); + + rc=IDirectSoundCaptureBuffer_GetStatus(dscbo,&status); + ok(rc==DS_OK,"IDirectSoundCaptureBuffer_GetStatus() failed: %08x\n", rc); + ok(status==(DSCBSTATUS_CAPTURING|DSCBSTATUS_LOOPING) || broken(status==DSCBSTATUS_CAPTURING), + "GetStatus: bad status: %x\n",status);
if (record) { - rc=IDirectSoundCaptureBuffer_Start(dscbo,DSCBSTART_LOOPING); - ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Start() failed: %08x\n", rc); - if (rc!=DS_OK) - return; - - rc=IDirectSoundCaptureBuffer_GetStatus(dscbo,&status); - ok(rc==DS_OK,"IDirectSoundCaptureBuffer_GetStatus() failed: %08x\n", rc); - ok(status==(DSCBSTATUS_CAPTURING|DSCBSTATUS_LOOPING), - "GetStatus: bad status: %x\n",status); - if (rc!=DS_OK) - return; - /* wait for the notifications */ for (i = 0; i < (NOTIFICATIONS * 2); i++) { rc=WaitForMultipleObjects(NOTIFICATIONS,state.event,FALSE,3000); @@ -426,11 +427,12 @@ break; }
- rc=IDirectSoundCaptureBuffer_Stop(dscbo); - ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Stop() failed: %08x\n", rc); - if (rc!=DS_OK) - return; - } + } + rc=IDirectSoundCaptureBuffer_Stop(dscbo); + ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Stop() failed: %08x\n", rc); + + rc=IDirectSoundCaptureBuffer_Stop(dscbo); + ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Stop() failed: %08x\n", rc); }
static BOOL WINAPI dscenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, @@ -671,13 +673,93 @@ return TRUE; }
-static void capture_tests(void) +static void test_enumerate(void) { HRESULT rc; rc=pDirectSoundCaptureEnumerateA(&dscenum_callback,NULL); ok(rc==DS_OK,"DirectSoundCaptureEnumerateA() failed: %08x\n", rc); }
+static void test_COM(void) +{ + IDirectSoundCapture *dsc = (IDirectSoundCapture*)0xdeadbeef; + IDirectSoundCaptureBuffer *buffer = (IDirectSoundCaptureBuffer*)0xdeadbeef; + IDirectSoundNotify *notify; + IUnknown *unk; + DSCBUFFERDESC bufdesc; + WAVEFORMATEX wfx; + HRESULT hr; + ULONG refcount; + + hr = pDirectSoundCaptureCreate(NULL, &dsc, (IUnknown*)0xdeadbeef); + ok(hr == DSERR_NOAGGREGATION, + "DirectSoundCaptureCreate failed: %08x, expected DSERR_NOAGGREGATION\n", hr); + ok(dsc == (IDirectSoundCapture*)0xdeadbeef, "dsc = %p\n", dsc); + + hr = pDirectSoundCaptureCreate(NULL, &dsc, NULL); + if (hr == DSERR_NODRIVER) { + skip("No driver\n"); + return; + } + ok(hr == DS_OK, "DirectSoundCaptureCreate failed: %08x, expected DS_OK\n", hr); + + /* Different refcount for IDirectSoundCapture and for IUnknown */ + refcount = IDirectSoundCapture_AddRef(dsc); + ok(refcount == 2, "refcount == %u, expected 2\n", refcount); + hr = IDirectSoundCapture_QueryInterface(dsc, &IID_IUnknown, (void**)&unk); + ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); + refcount = IUnknown_AddRef(unk); + ok(refcount == 2, "refcount == %u, expected 2\n", refcount); + IUnknown_Release(unk); + IUnknown_Release(unk); + IDirectSoundCapture_Release(dsc); + + init_format(&wfx, WAVE_FORMAT_PCM, 44100, 16, 1); + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize = sizeof(bufdesc); + bufdesc.dwBufferBytes = wfx.nAvgBytesPerSec; + bufdesc.lpwfxFormat = &wfx; + + hr = IDirectSoundCapture_CreateCaptureBuffer(dsc, &bufdesc, &buffer, (IUnknown*)0xdeadbeef); + if (hr == E_INVALIDARG) { + /* Old DirectX has only the 1st version of the DSCBUFFERDESC struct */ + bufdesc.dwSize = sizeof(DSCBUFFERDESC1); + hr = IDirectSoundCapture_CreateCaptureBuffer(dsc, &bufdesc, &buffer, (IUnknown*)0xdeadbeef); + } + ok(hr == DSERR_NOAGGREGATION, + "IDirectSoundCapture_CreateCaptureBuffer failed: %08x, expected DSERR_NOAGGREGATION\n", hr); + ok(buffer == (IDirectSoundCaptureBuffer*)0xdeadbeef || !buffer /* Win2k without DirectX9 */, + "buffer = %p\n", buffer); + + hr = IDirectSoundCapture_CreateCaptureBuffer(dsc, &bufdesc, &buffer, NULL); + ok(hr == DS_OK, "IDirectSoundCapture_CreateCaptureBuffer failed: %08x, expected DS_OK\n", hr); + + /* IDirectSoundCaptureBuffer and IDirectSoundNotify have separate refcounts */ + IDirectSoundCaptureBuffer_AddRef(buffer); + refcount = IDirectSoundCaptureBuffer_AddRef(buffer); + ok(refcount == 3, "IDirectSoundCaptureBuffer refcount is %u, expected 3\n", refcount); + hr = IDirectSoundCaptureBuffer_QueryInterface(buffer, &IID_IDirectSoundNotify, (void**)¬ify); + ok(hr == DS_OK, "IDirectSoundCapture_QueryInterface failed: %08x, expected DS_OK\n", hr); + refcount = IDirectSoundNotify_AddRef(notify); + ok(refcount == 2, "IDirectSoundNotify refcount is %u, expected 2\n", refcount); + IDirectSoundCaptureBuffer_AddRef(buffer); + refcount = IDirectSoundCaptureBuffer_Release(buffer); + ok(refcount == 3, "IDirectSoundCaptureBuffer refcount is %u, expected 3\n", refcount); + + /* Release IDirectSoundCaptureBuffer while keeping IDirectSoundNotify alive */ + while (IDirectSoundCaptureBuffer_Release(buffer) > 0); + refcount = IDirectSoundNotify_AddRef(notify); + ok(refcount == 3, "IDirectSoundNotify refcount is %u, expected 3\n", refcount); + refcount = IDirectSoundCaptureBuffer_AddRef(buffer); + ok(refcount == 1, "IDirectSoundCaptureBuffer refcount is %u, expected 1\n", refcount); + + while (IDirectSoundNotify_Release(notify) > 0); + refcount = IDirectSoundCaptureBuffer_Release(buffer); + ok(refcount == 0, "IDirectSoundCaptureBuffer refcount is %u, expected 0\n", refcount); + refcount = IDirectSoundCapture_Release(dsc); + ok(refcount == 0, "IDirectSoundCapture refcount is %u, expected 0\n", refcount); +} + START_TEST(capture) { HMODULE hDsound; @@ -685,25 +767,22 @@ CoInitialize(NULL);
hDsound = LoadLibrary("dsound.dll"); - if (hDsound) - { - - pDirectSoundCaptureCreate=(void*)GetProcAddress(hDsound, - "DirectSoundCaptureCreate"); - pDirectSoundCaptureEnumerateA=(void*)GetProcAddress(hDsound, - "DirectSoundCaptureEnumerateA"); - if (pDirectSoundCaptureCreate && pDirectSoundCaptureEnumerateA) - { - IDirectSoundCapture_tests(); - capture_tests(); - } - else - skip("capture test skipped\n"); - - FreeLibrary(hDsound); - } - else - skip("dsound.dll not found!\n"); - + if (!hDsound) { + skip("dsound.dll not found - skipping all tests\n"); + return; + } + + pDirectSoundCaptureCreate = (void*)GetProcAddress(hDsound, "DirectSoundCaptureCreate"); + pDirectSoundCaptureEnumerateA = (void*)GetProcAddress(hDsound, "DirectSoundCaptureEnumerateA"); + if (!pDirectSoundCaptureCreate || !pDirectSoundCaptureEnumerateA) { + skip("DirectSoundCapture{Create,Enumerate} missing - skipping all tests\n"); + return; + } + + test_COM(); + test_capture(); + test_enumerate(); + + FreeLibrary(hDsound); CoUninitialize(); }
Modified: trunk/rostests/winetests/dsound/ds3d.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dsound/ds3d.c?re... ============================================================================== --- trunk/rostests/winetests/dsound/ds3d.c [iso-8859-1] (original) +++ trunk/rostests/winetests/dsound/ds3d.c [iso-8859-1] Mon Sep 30 11:39:02 2013 @@ -23,13 +23,21 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include <windows.h> +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#include <wine/test.h> + +//#include <windows.h>
#include <math.h> - -#include "wine/test.h" -#include "dsound.h" -#include "mmreg.h" +#include <wingdi.h> +#include <mmsystem.h> +#include <dsound.h> +#include <mmreg.h> +#include "ks.h" +#include "ksmedia.h" #include "dsound_test.h"
#define PI 3.14159265358979323846 @@ -39,7 +47,7 @@ static HRESULT (WINAPI *pDirectSoundCreate)(LPCGUID,LPDIRECTSOUND*, LPUNKNOWN)=NULL;
-char* wave_generate_la(WAVEFORMATEX* wfx, double duration, DWORD* size) +char* wave_generate_la(WAVEFORMATEX* wfx, double duration, DWORD* size, BOOL ieee) { int i; int nb_samples; @@ -52,12 +60,12 @@ for (i=0;i<nb_samples;i++) { double y=sin(440.0*2*PI*i/wfx->nSamplesPerSec); if (wfx->wBitsPerSample==8) { - unsigned char sample=(unsigned char)((double)127.5*(y+1.0)); + unsigned char sample=127.5*(y+1.0); *b++=sample; if (wfx->nChannels==2) *b++=sample; } else if (wfx->wBitsPerSample == 16) { - signed short sample=(signed short)((double)32767.5*y-0.5); + signed short sample=32767.5*y-0.5; b[0]=sample & 0xff; b[1]=sample >> 8; b+=2; @@ -67,7 +75,7 @@ b+=2; } } else if (wfx->wBitsPerSample == 24) { - signed int sample=(signed int)((double)8388607.5*y-0.5); + signed int sample=8388607.5*y-0.5; b[0]=sample & 0xff; b[1]=(sample >> 8)&0xff; b[2]=sample >> 16; @@ -79,18 +87,31 @@ b+=3; } } else if (wfx->wBitsPerSample == 32) { - signed int sample=(signed int)((double)2147483647.5*y-0.5); - b[0]=sample & 0xff; - b[1]=(sample >> 8)&0xff; - b[2]=(sample >> 16)&0xff; - b[3]=sample >> 24; - b+=4; - if (wfx->nChannels==2) { + if (ieee) { + float *ptr = (float *) b; + *ptr = y; + + ptr++; + b+=4; + + if (wfx->nChannels==2) { + *ptr = y; + b+=4; + } + } else { + signed int sample=2147483647.5*y-0.5; b[0]=sample & 0xff; b[1]=(sample >> 8)&0xff; b[2]=(sample >> 16)&0xff; b[3]=sample >> 24; b+=4; + if (wfx->nChannels==2) { + b[0]=sample & 0xff; + b[1]=(sample >> 8)&0xff; + b[2]=(sample >> 16)&0xff; + b[3]=sample >> 24; + b+=4; + } } } } @@ -317,6 +338,7 @@ DSBCAPS dsbcaps; WAVEFORMATEX wfx,wfx2; DWORD size,status,freq; + BOOL ieee = FALSE; int ref;
if (set_frequency) { @@ -358,12 +380,16 @@
if (size == sizeof(WAVEFORMATEX)) { rc=IDirectSoundBuffer_GetFormat(*dsbo,&wfx,size,NULL); + ieee = (wfx.wFormatTag == WAVE_FORMAT_IEEE_FLOAT); } else if (size == sizeof(WAVEFORMATEXTENSIBLE)) { WAVEFORMATEXTENSIBLE wfxe; rc=IDirectSoundBuffer_GetFormat(*dsbo,(WAVEFORMATEX*)&wfxe,size,NULL); wfx = wfxe.Format; - } + ieee = IsEqualGUID(&wfxe.SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); + } else + return; + ok(rc==DS_OK, "IDirectSoundBuffer_GetFormat() failed: %08x\n", rc); if (rc==DS_OK && winetest_debug > 1) { @@ -600,9 +626,9 @@ "returned DSERR_INVALIDPARAM, returned %08x\n", rc);
if (set_frequency) - state.wave=wave_generate_la(&wfx,(duration*frequency)/wfx.nSamplesPerSec,&state.wave_len); + state.wave=wave_generate_la(&wfx,(duration*frequency)/wfx.nSamplesPerSec,&state.wave_len,ieee); else - state.wave=wave_generate_la(&wfx,duration,&state.wave_len); + state.wave=wave_generate_la(&wfx,duration,&state.wave_len,ieee);
state.dsbo=*dsbo; state.wfx=&wfx; @@ -783,7 +809,7 @@ ZeroMemory(&bufdesc, sizeof(bufdesc)); bufdesc.dwSize=sizeof(bufdesc); bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2; - if (has_3d) + if (has_3dbuffer) bufdesc.dwFlags|=DSBCAPS_CTRL3D; else bufdesc.dwFlags|= @@ -805,8 +831,8 @@ wfx1.nSamplesPerSec,wfx1.wBitsPerSample,wfx1.nChannels); } rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); - ok(rc==DS_OK && secondary!=NULL,"IDirectSound_CreateSoundBuffer() " - "failed to create a %s%ssecondary buffer %s%s%s%sat %dx%dx%d (%s): %08x\n", + ok((rc==DS_OK && secondary!=NULL) || broken(rc == DSERR_CONTROLUNAVAIL), /* vmware drivers on w2k */ + "IDirectSound_CreateSoundBuffer() failed to create a %s%ssecondary buffer %s%s%s%sat %dx%dx%d (%s): %08x\n", has_3dbuffer?"3D ":"", has_duplicate?"duplicated ":"", listener!=NULL||move_sound?"with ":"", move_listener?"moving ":"", listener!=NULL?"listener ":"", @@ -815,6 +841,14 @@ wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels, getDSBCAPS(bufdesc.dwFlags),rc); if (rc==DS_OK && secondary!=NULL) { + IDirectSound3DBuffer *ds3d; + + rc=IDirectSoundBuffer_QueryInterface(secondary, &IID_IDirectSound3DBuffer, (void**)&ds3d); + ok((has_3dbuffer && rc==DS_OK) || (!has_3dbuffer && rc==E_NOINTERFACE), + "Wrong return trying to get 3D buffer on %s3D secondary interface: %08x\n", has_3dbuffer ? "" : "non-", rc); + if(rc==DS_OK) + IDirectSound3DBuffer_Release(ds3d); + if (!has_3d) { LONG refvol,vol,refpan,pan;
@@ -1195,15 +1229,13 @@ !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0, listener,0,0,FALSE,0);
- todo_wine { - temp_buffer = NULL; - rc=IDirectSound3DListener_QueryInterface(listener, - &IID_IKsPropertySet,(LPVOID *)&temp_buffer); - ok(rc==DS_OK && temp_buffer!=NULL, - "IDirectSound3DListener_QueryInterface didn't handle IKsPropertySet: ret = %08x\n", rc); - if(temp_buffer) - IKsPropertySet_Release(temp_buffer); - } + temp_buffer = NULL; + rc = IDirectSound3DListener_QueryInterface(listener, &IID_IKsPropertySet, + (void **)&temp_buffer); + ok(rc==DS_OK && temp_buffer!=NULL, + "IDirectSound3DListener_QueryInterface didn't handle IKsPropertySet: ret = %08x\n", rc); + if(temp_buffer) + IKsPropertySet_Release(temp_buffer); }
/* Testing the reference counting */ @@ -1212,15 +1244,12 @@ "references, should have 0\n",ref); }
- todo_wine { - temp_buffer = NULL; - rc=IDirectSoundBuffer_QueryInterface(primary, - &IID_IKsPropertySet,(LPVOID *)&temp_buffer); - ok(rc==DS_OK && temp_buffer!=NULL, - "IDirectSoundBuffer_QueryInterface didn't handle IKsPropertySet on primary buffer: ret = %08x\n", rc); - if(temp_buffer) - IKsPropertySet_Release(temp_buffer); - } + temp_buffer = NULL; + rc = IDirectSoundBuffer_QueryInterface(primary, &IID_IKsPropertySet, (void **)&temp_buffer); + ok(rc==DS_OK && temp_buffer!=NULL, + "IDirectSoundBuffer_QueryInterface didn't handle IKsPropertySet on primary buffer: ret = %08x\n", rc); + if(temp_buffer) + IKsPropertySet_Release(temp_buffer);
/* Testing the reference counting */ ref=IDirectSoundBuffer_Release(primary); @@ -1237,11 +1266,14 @@ return rc; }
+static unsigned driver_count = 0; + static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext) { HRESULT rc; trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule); + driver_count++;
rc = test_for_driver(lpGuid); if (rc == DSERR_NODRIVER) { @@ -1288,6 +1320,7 @@ HRESULT rc; rc=pDirectSoundEnumerateA(&dsenum_callback,NULL); ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %08x\n",rc); + trace("tested %u DirectSound drivers\n", driver_count); }
START_TEST(ds3d) @@ -1310,7 +1343,7 @@ FreeLibrary(hDsound); } else - skip("dsound.dll not found!\n"); + skip("dsound.dll not found - skipping all tests\n");
CoUninitialize(); }
Modified: trunk/rostests/winetests/dsound/ds3d8.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dsound/ds3d8.c?r... ============================================================================== --- trunk/rostests/winetests/dsound/ds3d8.c [iso-8859-1] (original) +++ trunk/rostests/winetests/dsound/ds3d8.c [iso-8859-1] Mon Sep 30 11:39:02 2013 @@ -23,13 +23,20 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include <windows.h> +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include <windows.h>
#include <math.h>
-#include "wine/test.h" -#include "dsound.h" -#include "mmreg.h" +#include <wine/test.h> +#include <wingdi.h> +#include <mmreg.h> +#include <dsound.h> +//#include "ks.h" +#include <ksmedia.h> #include "dsound_test.h"
static HRESULT (WINAPI *pDirectSoundEnumerateA)(LPDSENUMCALLBACKA,LPVOID)=NULL; @@ -181,6 +188,7 @@ DSBCAPS dsbcaps; WAVEFORMATEX wfx,wfx2; DWORD size,status,freq; + BOOL ieee = FALSE; int ref;
/* DSOUND: Error: Invalid caps pointer */ @@ -214,11 +222,15 @@
if (size == sizeof(WAVEFORMATEX)) { rc=IDirectSoundBuffer_GetFormat(*dsbo,&wfx,size,NULL); + ieee = (wfx.wFormatTag == WAVE_FORMAT_IEEE_FLOAT); } else if (size == sizeof(WAVEFORMATEXTENSIBLE)) { WAVEFORMATEXTENSIBLE wfxe; rc=IDirectSoundBuffer_GetFormat(*dsbo,(WAVEFORMATEX*)&wfxe,size,NULL); wfx = wfxe.Format; - } + ieee = IsEqualGUID(&wfxe.SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); + } else + return; + ok(rc==DS_OK,"IDirectSoundBuffer_GetFormat() failed: %08x\n", rc); if (rc==DS_OK && winetest_debug > 1) { trace(" Format: %s tag=0x%04x %dx%dx%d avg.B/s=%d align=%d\n", @@ -447,7 +459,7 @@ ok(rc==DSERR_INVALIDPARAM, "IDirectSoundBuffer_Lock() should have " "returned DSERR_INVALIDPARAM, returned %08x\n", rc);
- state.wave=wave_generate_la(&wfx,duration,&state.wave_len); + state.wave=wave_generate_la(&wfx,duration,&state.wave_len,ieee);
state.dsbo=*dsbo; state.wfx=&wfx; @@ -643,7 +655,10 @@ "IDirectSound8_CreateSoundBuffer(secondary) should have " "returned DSERR_INVALIDPARAM, returned %08x\n", rc); if (secondary) + { ref=IDirectSoundBuffer_Release(secondary); + ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, should have 0\n",ref); + } init_format(&wfx,WAVE_FORMAT_PCM,22050,16,1); }
@@ -699,7 +714,7 @@ rc=IDirectSoundBuffer_SetPan(secondary,-1000); ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: %08x\n",rc); rc=IDirectSoundBuffer_GetPan(secondary,&pan); - ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: %08x\n",rc); + ok(rc==DS_OK,"IDirectSoundBuffer_GetPan(secondary) failed: %08x\n",rc); ok(pan==-1000,"secondary: wrong pan %d instead of -1000\n", pan);
@@ -1073,11 +1088,14 @@ return rc; }
+static unsigned driver_count = 0; + static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext) { HRESULT rc; trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule); + driver_count++;
rc = test_for_driver8(lpGuid); if (rc == DSERR_NODRIVER) { @@ -1124,6 +1142,7 @@ HRESULT rc; rc=pDirectSoundEnumerateA(&dsenum_callback,NULL); ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %08x\n",rc); + trace("tested %u DirectSound drivers\n", driver_count); }
START_TEST(ds3d8) @@ -1143,12 +1162,12 @@ if (pDirectSoundCreate8) ds3d8_tests(); else - skip("ds3d8 test skipped\n"); + skip("DirectSoundCreate8 missing - skipping all tests\n");
FreeLibrary(hDsound); } else - skip("dsound.dll not found!\n"); + skip("dsound.dll not found - skipping all tests\n");
CoUninitialize(); }
Modified: trunk/rostests/winetests/dsound/dsound.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dsound/dsound.c?... ============================================================================== --- trunk/rostests/winetests/dsound/dsound.c [iso-8859-1] (original) +++ trunk/rostests/winetests/dsound/dsound.c [iso-8859-1] Mon Sep 30 11:39:02 2013 @@ -26,15 +26,20 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include <windows.h> - -#include "wine/test.h" -#include "dsound.h" -#include "dsconf.h" -#include "mmreg.h" -#include "initguid.h" -#include "ks.h" -#include "ksmedia.h" +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +//#include <windows.h> + +#include <wine/test.h> +#include <wingdi.h> +#include <mmreg.h> +#include <dsound.h> +#include <dsconf.h> +//#include "initguid.h" +//#include "ks.h" +#include <ksmedia.h>
#include "dsound_test.h"
@@ -173,7 +178,7 @@ static void IDirectSound_tests(void) { HRESULT rc; - LPDIRECTSOUND dso=NULL; + IDirectSound *dso=(IDirectSound*)0xdeadbeef; LPCLASSFACTORY cf=NULL;
trace("Testing IDirectSound\n"); @@ -187,6 +192,12 @@ &IID_IUnknown, (void**)&cf); ok(rc==S_OK,"CoGetClassObject(CLSID_DirectSound, IID_IUnknown) " "failed: %08x\n", rc); + + /* COM aggregation */ + rc=CoCreateInstance(&CLSID_DirectSound, (IUnknown*)&dso, CLSCTX_INPROC_SERVER, + &IID_IDirectSound, (void**)&dso); + ok(rc==CLASS_E_NOAGGREGATION || broken(rc==DSERR_INVALIDPARAM), + "DirectMusicPerformance create failed: %08x, expected CLASS_E_NOAGGREGATION\n", rc);
/* try the COM class factory method of creation with no device specified */ rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, @@ -326,7 +337,7 @@ wfx.nBlockAlign); bufdesc.lpwfxFormat=&wfx; rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); - ok(rc==DS_OK && secondary!=NULL, + ok((rc==DS_OK && secondary!=NULL) || broken(rc == DSERR_CONTROLUNAVAIL), /* vmware drivers on w2k */ "IDirectSound_CreateSoundBuffer() failed to create a secondary " "buffer %08x\n",rc); if (rc==DS_OK && secondary!=NULL) { @@ -493,6 +504,15 @@ !(dscaps.dwFlags & DSCAPS_EMULDRIVER),5.0,0,0,0,0,FALSE,0);
ref=IDirectSoundBuffer_Release(primary); + ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references\n",ref); + + ref=IDirectSoundBuffer_AddRef(primary); + ok(ref==1,"IDirectSoundBuffer_AddRef() primary has %d references\n",ref); + + ref=IDirectSoundBuffer_Release(primary); + ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references\n",ref); + + ref=IDirectSoundBuffer_Release(primary); ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, " "should have 0\n",ref); } @@ -523,7 +543,7 @@ DSBUFFERDESC bufdesc; DSCAPS dscaps; WAVEFORMATEX wfx, wfx2; - int f,ref; + int f,ref,tag;
/* Create the DirectSound object */ rc=pDirectSoundCreate(lpGuid,&dso,NULL); @@ -556,6 +576,11 @@
if (rc==DS_OK && primary!=NULL) { for (f=0;f<NB_FORMATS;f++) { + for (tag=0;tag<NB_TAGS;tag++) { + /* if float, we only want to test 32-bit */ + if ((format_tags[tag] == WAVE_FORMAT_IEEE_FLOAT) && (formats[f][1] != 32)) + continue; + /* We must call SetCooperativeLevel to be allowed to call * SetFormat */ /* DSOUND: Setting DirectSound cooperative level to @@ -565,7 +590,7 @@ if (rc!=DS_OK) goto EXIT;
- init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1], + init_format(&wfx,format_tags[tag],formats[f][0],formats[f][1], formats[f][2]); wfx2=wfx; rc=IDirectSoundBuffer_SetFormat(primary,&wfx); @@ -612,13 +637,13 @@ wfx.nBlockAlign); bufdesc.lpwfxFormat=&wfx2; if (winetest_interactive) { - trace(" Testing a primary buffer at %dx%dx%d with a " + trace(" Testing a primary buffer at %dx%dx%d (fmt=%d) with a " "secondary buffer at %dx%dx%d\n", - wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels, + wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,format_tags[tag], wfx2.nSamplesPerSec,wfx2.wBitsPerSample,wfx2.nChannels); } rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); - ok(rc==DS_OK && secondary!=NULL, + ok((rc==DS_OK && secondary!=NULL) || broken(rc == DSERR_CONTROLUNAVAIL), /* vmware drivers on w2k */ "IDirectSound_CreateSoundBuffer() failed to create a secondary buffer %08x\n",rc);
if (rc==DS_OK && secondary!=NULL) { @@ -629,6 +654,7 @@ ok(ref==0,"IDirectSoundBuffer_Release() has %d references, " "should have 0\n",ref); } + } }
ref=IDirectSoundBuffer_Release(primary); @@ -658,7 +684,7 @@ DSBUFFERDESC bufdesc; DSCAPS dscaps; WAVEFORMATEX wfx, wfx1; - DWORD f; + DWORD f, tag; int ref;
/* Create the DirectSound object */ @@ -697,8 +723,14 @@ goto EXIT1;
for (f=0;f<NB_FORMATS;f++) { + for (tag=0;tag<NB_TAGS;tag++) { WAVEFORMATEXTENSIBLE wfxe; - init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1], + + /* if float, we only want to test 32-bit */ + if ((format_tags[tag] == WAVE_FORMAT_IEEE_FLOAT) && (formats[f][1] != 32)) + continue; + + init_format(&wfx,format_tags[tag],formats[f][0],formats[f][1], formats[f][2]); secondary=NULL; ZeroMemory(&bufdesc, sizeof(bufdesc)); @@ -720,16 +752,16 @@ wfx.nBlockAlign); bufdesc.lpwfxFormat=&wfx; rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); - if (gotdx8 || wfx.wBitsPerSample <= 16) + if (gotdx8 || wfx.wBitsPerSample <= 16 || wfx.wFormatTag == WAVE_FORMAT_IEEE_FLOAT) { if (wfx.wBitsPerSample > 16) - ok(((rc == DSERR_CONTROLUNAVAIL || rc == DSERR_INVALIDCALL || rc == DSERR_INVALIDPARAM /* 2003 */) && !secondary) + ok(broken((rc == DSERR_CONTROLUNAVAIL || rc == DSERR_INVALIDCALL || rc == DSERR_INVALIDPARAM /* 2003 */) && !secondary) || rc == DS_OK, /* driver dependent? */ "IDirectSound_CreateSoundBuffer() " "should have returned (DSERR_CONTROLUNAVAIL or DSERR_INVALIDCALL) " "and NULL, returned: %08x %p\n", rc, secondary); else - ok(rc==DS_OK && secondary!=NULL, + ok((rc==DS_OK && secondary!=NULL) || broken(rc == DSERR_CONTROLUNAVAIL), /* vmware drivers on w2k */ "IDirectSound_CreateSoundBuffer() failed to create a secondary buffer %08x\n",rc); } else @@ -738,7 +770,7 @@
if (!gotdx8) { - skip("Not doing the WAVE_FORMAT_EXTENSIBLE tests\n"); + win_skip("Not doing the WAVE_FORMAT_EXTENSIBLE tests\n"); /* Apparently they succeed with bogus values, * which means that older dsound doesn't look at them */ @@ -752,7 +784,7 @@ bufdesc.lpwfxFormat=(WAVEFORMATEX*)&wfxe; wfxe.Format = wfx; wfxe.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - wfxe.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + wfxe.SubFormat = (format_tags[tag] == WAVE_FORMAT_PCM ? KSDATAFORMAT_SUBTYPE_PCM : KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); wfxe.Format.cbSize = 1; wfxe.Samples.wValidBitsPerSample = wfx.wBitsPerSample; wfxe.dwChannelMask = (wfx.nChannels == 1 ? KSAUDIO_SPEAKER_MONO : KSAUDIO_SPEAKER_STEREO); @@ -792,7 +824,7 @@ IDirectSoundBuffer_Release(secondary); secondary=NULL; } - wfxe.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + wfxe.SubFormat = (format_tags[tag] == WAVE_FORMAT_PCM ? KSDATAFORMAT_SUBTYPE_PCM : KSDATAFORMAT_SUBTYPE_IEEE_FLOAT);
++wfxe.Samples.wValidBitsPerSample; rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); @@ -825,9 +857,9 @@ no_wfe: if (rc==DS_OK && secondary!=NULL) { if (winetest_interactive) { - trace(" Testing a secondary buffer at %dx%dx%d " + trace(" Testing a secondary buffer at %dx%dx%d (fmt=%d) " "with a primary buffer at %dx%dx%d\n", - wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels, + wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,format_tags[tag], wfx1.nSamplesPerSec,wfx1.wBitsPerSample,wfx1.nChannels); } test_buffer(dso,&secondary,0,FALSE,0,FALSE,0, @@ -837,6 +869,7 @@ ok(ref==0,"IDirectSoundBuffer_Release() has %d references, " "should have 0\n",ref); } + } } EXIT1: ref=IDirectSoundBuffer_Release(primary); @@ -883,8 +916,8 @@ bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec + 1; bufdesc.lpwfxFormat=&wfx; rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); - ok(rc==DS_OK,"IDirectSound_CreateSoundBuffer() " - "should have returned DS_OK, returned: %08x\n", rc); + ok(rc == DS_OK || broken(rc == DSERR_CONTROLUNAVAIL), /* vmware drivers on w2k */ + "IDirectSound_CreateSoundBuffer() should have returned DS_OK, returned: %08x\n", rc);
if (rc==DS_OK && secondary!=NULL) { ZeroMemory(&dsbcaps, sizeof(dsbcaps)); @@ -993,7 +1026,7 @@ wfx1.nSamplesPerSec,wfx1.wBitsPerSample,wfx1.nChannels); } rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); - ok(rc==DS_OK && secondary!=NULL, + ok((rc==DS_OK && secondary!=NULL) || broken(rc == DSERR_CONTROLUNAVAIL), /* vmware drivers on w2k */ "IDirectSound_CreateSoundBuffer() failed to create a secondary buffer %08x\n",rc);
if (rc==DS_OK && secondary!=NULL) { @@ -1024,6 +1057,438 @@ return DSERR_GENERIC;
return rc; +} + +static HRESULT test_notify(LPDIRECTSOUNDBUFFER dsb, + DWORD count, LPHANDLE event, + DWORD expected) +{ + HRESULT rc; + DWORD ret; + + rc=IDirectSoundBuffer_SetCurrentPosition(dsb,0); + ok(rc==DS_OK, + "IDirectSoundBuffer_SetCurrentPosition failed %08x\n",rc); + if(rc!=DS_OK) + return rc; + + rc=IDirectSoundBuffer_Play(dsb,0,0,0); + ok(rc==DS_OK,"IDirectSoundBuffer_Play failed %08x\n",rc); + if(rc!=DS_OK) + return rc; + + rc=IDirectSoundBuffer_Stop(dsb); + ok(rc==DS_OK,"IDirectSoundBuffer_Stop failed %08x\n",rc); + if(rc!=DS_OK) + return rc; + + ret=WaitForMultipleObjects(count,event,FALSE,0); + ok(ret==expected,"expected %d. got %d\n",expected,ret); + return rc; +} + +static HRESULT test_duplicate(LPGUID lpGuid) +{ + HRESULT rc; + LPDIRECTSOUND dso=NULL; + LPDIRECTSOUNDBUFFER primary=NULL; + DSBUFFERDESC bufdesc; + int ref; + + /* Create the DirectSound object */ + rc=pDirectSoundCreate(lpGuid,&dso,NULL); + ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED, + "DirectSoundCreate() failed: %08x\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=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %08x\n", rc); + if (rc!=DS_OK) + goto EXIT; + + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER; + rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); + ok(rc==DS_OK && primary!=NULL,"IDirectSound_CreateSoundBuffer() failed " + "to create a primary buffer %08x\n",rc); + + if (rc==DS_OK && primary!=NULL) { + LPDIRECTSOUNDBUFFER original=NULL; + WAVEFORMATEX wfx; + + init_format(&wfx,WAVE_FORMAT_PCM,22050,16,1); + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_CTRLPOSITIONNOTIFY; + bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec/100; /* very short buffer */ + bufdesc.lpwfxFormat=&wfx; + rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&original,NULL); + ok(rc==DS_OK && original!=NULL, + "IDirectSound_CreateSoundBuffer() failed to create a original " + "buffer %08x\n",rc); + if (rc==DS_OK && original!=NULL) { + LPDIRECTSOUNDBUFFER duplicated=NULL; + LPDIRECTSOUNDNOTIFY notify=NULL; + HANDLE event[2]; + LPVOID buf=NULL; + DWORD bufsize; + int i; + + /* Prepare notify events */ + for (i=0;i<sizeof(event)/sizeof(event[0]);i++) { + event[i] = CreateEvent(NULL,FALSE,FALSE,NULL); + } + + /* Make silent buffer */ + rc=IDirectSoundBuffer_Lock(original,0,0,&buf,&bufsize, + NULL,NULL,DSBLOCK_ENTIREBUFFER); + ok(rc==DS_OK && buf!=NULL, + "IDirectSoundBuffer_Lock failed to lock the buffer %08x\n",rc); + if (rc==DS_OK && buf!=NULL) { + ZeroMemory(buf,bufsize); + rc=IDirectSoundBuffer_Unlock(original,buf,bufsize, + NULL,0); + ok(rc==DS_OK,"IDirectSoundBuffer_Unlock failed to unlock " + "%08x\n",rc); + } + + rc=IDirectSoundBuffer_QueryInterface(original, + &IID_IDirectSoundNotify, + (void**)¬ify); + ok(rc==DS_OK && notify!=NULL, + "IDirectSoundBuffer_QueryInterface() failed to create a " + "notification %08x\n",rc); + if (rc==DS_OK && notify!=NULL) { + DSBPOSITIONNOTIFY dsbpn; + LPDIRECTSOUNDNOTIFY dup_notify=NULL; + + dsbpn.dwOffset=DSBPN_OFFSETSTOP; + dsbpn.hEventNotify=event[0]; + rc=IDirectSoundNotify_SetNotificationPositions(notify, + 1,&dsbpn); + ok(rc==DS_OK,"IDirectSoundNotify_SetNotificationPositions " + "failed %08x\n",rc); + + rc=IDirectSound_DuplicateSoundBuffer(dso,original,&duplicated); + ok(rc==DS_OK && duplicated!=NULL, + "IDirectSound_DuplicateSoundBuffer failed %08x\n",rc); + + trace("testing duplicated buffer without notifications.\n"); + test_notify(duplicated,sizeof(event)/sizeof(event[0]), + event,WAIT_TIMEOUT); + + rc=IDirectSoundBuffer_QueryInterface(duplicated, + &IID_IDirectSoundNotify, + (void**)&dup_notify); + ok(rc==DS_OK&&dup_notify!=NULL, + "IDirectSoundBuffer_QueryInterface() failed to create a " + "notification %08x\n",rc); + if(rc==DS_OK&&dup_notify!=NULL) { + dsbpn.dwOffset=DSBPN_OFFSETSTOP; + dsbpn.hEventNotify=event[1]; + rc=IDirectSoundNotify_SetNotificationPositions(dup_notify, + 1,&dsbpn); + ok(rc==DS_OK,"IDirectSoundNotify_SetNotificationPositions " + "failed %08x\n",rc); + + trace("testing duplicated buffer with a notification.\n"); + test_notify(duplicated,sizeof(event)/sizeof(event[0]), + event,WAIT_OBJECT_0+1); + + ref=IDirectSoundNotify_Release(dup_notify); + ok(ref==0,"IDirectSoundNotify_Release() has %d references, " + "should have 0\n",ref); + } + ref=IDirectSoundNotify_Release(notify); + ok(ref==0,"IDirectSoundNotify_Release() has %d references, " + "should have 0\n",ref); + + trace("testing original buffer with a notification.\n"); + test_notify(original,sizeof(event)/sizeof(event[0]), + event,WAIT_OBJECT_0); + + ref=IDirectSoundBuffer_Release(duplicated); + ok(ref==0,"IDirectSoundBuffer_Release() has %d references, " + "should have 0\n",ref); + } + ref=IDirectSoundBuffer_Release(original); + ok(ref==0,"IDirectSoundBuffer_Release() has %d references, " + "should have 0\n",ref); + } + ref=IDirectSoundBuffer_Release(primary); + ok(ref==0,"IDirectSoundBuffer_Release() 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,"IDirectSound_SetCooperativeLevel() failed: %08x\n", rc); + +EXIT: + ref=IDirectSound_Release(dso); + ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref); + if (ref!=0) + return DSERR_GENERIC; + + return rc; +} + +static HRESULT test_invalid_fmts(LPGUID lpGuid) +{ + HRESULT rc; + LPDIRECTSOUND dso=NULL; + LPDIRECTSOUNDBUFFER primary=NULL; + DSBUFFERDESC bufdesc; + + /* Create the DirectSound object */ + rc=pDirectSoundCreate(lpGuid,&dso,NULL); + ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED, + "DirectSoundCreate() failed: %08x\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=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY); + ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %08x\n", rc); + if (rc!=DS_OK){ + IDirectSound_Release(dso); + return rc; + } + + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize=sizeof(bufdesc); + bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER; + rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL); + ok(rc==DS_OK && primary!=NULL,"IDirectSound_CreateSoundBuffer() failed " + "to create a primary buffer %08x\n",rc); + + if (rc==DS_OK && primary!=NULL) { + WAVEFORMATEX wfx; + WAVEFORMATEXTENSIBLE fmtex; + + wfx.wFormatTag = WAVE_FORMAT_PCM; + wfx.nChannels = 0; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 0; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 2; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 12; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 0; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = 0; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = 0; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample / 8) - 1; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = (wfx.nChannels * wfx.wBitsPerSample / 8) + 1; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign + 1; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == S_OK, "SetFormat: %08x\n", rc); + + rc = IDirectSoundBuffer_GetFormat(primary, &wfx, sizeof(wfx), NULL); + ok(rc == S_OK, "GetFormat: %08x\n", rc); + ok(wfx.wFormatTag == WAVE_FORMAT_PCM, "format: 0x%x\n", wfx.wFormatTag); + ok(wfx.nChannels == 2, "channels: %u\n", wfx.nChannels); + ok(wfx.nSamplesPerSec == 44100, "rate: %u\n", wfx.nSamplesPerSec); + ok(wfx.wBitsPerSample == 16, "bps: %u\n", wfx.wBitsPerSample); + ok(wfx.nBlockAlign == 4, "blockalign: %u\n", wfx.nBlockAlign); + ok(wfx.nAvgBytesPerSec == 44100 * 4 + 1, "avgbytes: %u\n", wfx.nAvgBytesPerSec); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign - 1; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == S_OK, "SetFormat: %08x\n", rc); + + rc = IDirectSoundBuffer_GetFormat(primary, &wfx, sizeof(wfx), NULL); + ok(rc == S_OK, "GetFormat: %08x\n", rc); + ok(wfx.wFormatTag == WAVE_FORMAT_PCM, "format: 0x%x\n", wfx.wFormatTag); + ok(wfx.nChannels == 2, "channels: %u\n", wfx.nChannels); + ok(wfx.nSamplesPerSec == 44100, "rate: %u\n", wfx.nSamplesPerSec); + ok(wfx.wBitsPerSample == 16, "bps: %u\n", wfx.wBitsPerSample); + ok(wfx.nBlockAlign == 4, "blockalign: %u\n", wfx.nBlockAlign); + ok(wfx.nAvgBytesPerSec == 44100 * 4 - 1, "avgbytes: %u\n", wfx.nAvgBytesPerSec); + + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign + 1; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == S_OK, "SetFormat: %08x\n", rc); + + rc = IDirectSoundBuffer_GetFormat(primary, &wfx, sizeof(wfx), NULL); + ok(rc == S_OK, "GetFormat: %08x\n", rc); + ok(wfx.wFormatTag == WAVE_FORMAT_PCM, "format: 0x%x\n", wfx.wFormatTag); + ok(wfx.nChannels == 2, "channels: %u\n", wfx.nChannels); + ok(wfx.nSamplesPerSec == 44100, "rate: %u\n", wfx.nSamplesPerSec); + ok(wfx.wBitsPerSample == 16, "bps: %u\n", wfx.wBitsPerSample); + ok(wfx.nBlockAlign == 4, "blockalign: %u\n", wfx.nBlockAlign); + ok(wfx.nAvgBytesPerSec == 44100 * 4 + 1, "avgbytes: %u\n", wfx.nAvgBytesPerSec); + + wfx.wFormatTag = WAVE_FORMAT_ALAW; + wfx.nChannels = 2; + wfx.nSamplesPerSec = 44100; + wfx.wBitsPerSample = 16; + wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8; + wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign; + rc = IDirectSoundBuffer_SetFormat(primary, &wfx); + ok(rc == S_OK, "SetFormat: %08x\n", rc); + + rc = IDirectSoundBuffer_GetFormat(primary, &wfx, sizeof(wfx), NULL); + ok(rc == S_OK, "GetFormat: %08x\n", rc); + ok(wfx.wFormatTag == WAVE_FORMAT_ALAW, "format: 0x%x\n", wfx.wFormatTag); + ok(wfx.nChannels == 2, "channels: %u\n", wfx.nChannels); + ok(wfx.nSamplesPerSec == 44100, "rate: %u\n", wfx.nSamplesPerSec); + ok(wfx.wBitsPerSample == 16, "bps: %u\n", wfx.wBitsPerSample); + ok(wfx.nBlockAlign == 4, "blockalign: %u\n", wfx.nBlockAlign); + ok(wfx.nAvgBytesPerSec == 44100 * 4, "avgbytes: %u\n", wfx.nAvgBytesPerSec); + + if(!gotdx8){ + win_skip("Not doing the WAVE_FORMAT_EXTENSIBLE tests\n"); + goto done; + } + + fmtex.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); + fmtex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + fmtex.Format.nChannels = 2; + fmtex.Format.nSamplesPerSec = 44100; + fmtex.Format.wBitsPerSample = 16; + fmtex.Format.nBlockAlign = fmtex.Format.nChannels * fmtex.Format.wBitsPerSample / 8; + fmtex.Format.nAvgBytesPerSec = fmtex.Format.nSamplesPerSec * fmtex.Format.nBlockAlign; + fmtex.Samples.wValidBitsPerSample = 0; + fmtex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; + fmtex.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + rc = IDirectSoundBuffer_SetFormat(primary, (WAVEFORMATEX*)&fmtex); + ok(rc == S_OK, "SetFormat: %08x\n", rc); + + rc = IDirectSoundBuffer_GetFormat(primary, (WAVEFORMATEX*)&fmtex, sizeof(fmtex), NULL); + ok(rc == S_OK, "GetFormat: %08x\n", rc); + ok(fmtex.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "format: 0x%x\n", fmtex.Format.wFormatTag); + ok(fmtex.Format.nChannels == 2, "channels: %u\n", fmtex.Format.nChannels); + ok(fmtex.Format.nSamplesPerSec == 44100, "rate: %u\n", fmtex.Format.nSamplesPerSec); + ok(fmtex.Format.wBitsPerSample == 16, "bps: %u\n", fmtex.Format.wBitsPerSample); + ok(fmtex.Format.nBlockAlign == 4, "blockalign: %u\n", fmtex.Format.nBlockAlign); + ok(fmtex.Format.nAvgBytesPerSec == 44100 * 4, "avgbytes: %u\n", fmtex.Format.nAvgBytesPerSec); + ok(fmtex.Samples.wValidBitsPerSample == 0 || /* <= XP */ + fmtex.Samples.wValidBitsPerSample == 16, /* >= Vista */ + "validbits: %u\n", fmtex.Samples.wValidBitsPerSample); + ok(IsEqualGUID(&fmtex.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM), "subtype incorrect\n"); + + fmtex.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); + fmtex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + fmtex.Format.nChannels = 2; + fmtex.Format.nSamplesPerSec = 44100; + fmtex.Format.wBitsPerSample = 24; + fmtex.Format.nBlockAlign = fmtex.Format.nChannels * fmtex.Format.wBitsPerSample / 8; + fmtex.Format.nAvgBytesPerSec = fmtex.Format.nSamplesPerSec * fmtex.Format.nBlockAlign; + fmtex.Samples.wValidBitsPerSample = 20; + fmtex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; + fmtex.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + rc = IDirectSoundBuffer_SetFormat(primary, (WAVEFORMATEX*)&fmtex); + ok(rc == S_OK, "SetFormat: %08x\n", rc); + + rc = IDirectSoundBuffer_GetFormat(primary, (WAVEFORMATEX*)&fmtex, sizeof(fmtex), NULL); + ok(rc == S_OK, "GetFormat: %08x\n", rc); + ok(fmtex.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE, "format: 0x%x\n", fmtex.Format.wFormatTag); + ok(fmtex.Format.nChannels == 2, "channels: %u\n", fmtex.Format.nChannels); + ok(fmtex.Format.nSamplesPerSec == 44100, "rate: %u\n", fmtex.Format.nSamplesPerSec); + ok(fmtex.Format.wBitsPerSample == 24, "bps: %u\n", fmtex.Format.wBitsPerSample); + ok(fmtex.Format.nBlockAlign == 6, "blockalign: %u\n", fmtex.Format.nBlockAlign); + ok(fmtex.Format.nAvgBytesPerSec == 44100 * 6, "avgbytes: %u\n", fmtex.Format.nAvgBytesPerSec); + ok(fmtex.Samples.wValidBitsPerSample == 20, "validbits: %u\n", fmtex.Samples.wValidBitsPerSample); + ok(IsEqualGUID(&fmtex.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM), "subtype incorrect\n"); + + fmtex.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); + fmtex.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; + fmtex.Format.nChannels = 2; + fmtex.Format.nSamplesPerSec = 44100; + fmtex.Format.wBitsPerSample = 24; + fmtex.Format.nBlockAlign = fmtex.Format.nChannels * fmtex.Format.wBitsPerSample / 8; + fmtex.Format.nAvgBytesPerSec = fmtex.Format.nSamplesPerSec * fmtex.Format.nBlockAlign; + fmtex.Samples.wValidBitsPerSample = 32; + fmtex.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; + fmtex.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + rc = IDirectSoundBuffer_SetFormat(primary, (WAVEFORMATEX*)&fmtex); + ok(rc == E_INVALIDARG, "SetFormat: %08x\n", rc); + + IDirectSoundBuffer_Release(primary); + } + +done: + IDirectSound_Release(dso); + + return S_OK; }
static unsigned int number; @@ -1054,6 +1519,8 @@ test_primary_secondary(lpGuid); test_secondary(lpGuid); test_frequency(lpGuid); + test_duplicate(lpGuid); + test_invalid_fmts(lpGuid); }
return 1; @@ -1066,6 +1533,118 @@ ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %08x\n",rc); }
+static void test_hw_buffers(void) +{ + IDirectSound *ds; + IDirectSoundBuffer *primary, *primary2, **secondaries, *secondary; + IDirectSoundBuffer8 *buf8; + DSCAPS caps; + DSBCAPS bufcaps; + DSBUFFERDESC bufdesc; + WAVEFORMATEX fmt; + UINT i; + HRESULT hr; + + hr = pDirectSoundCreate(NULL, &ds, NULL); + ok(hr == S_OK || hr == DSERR_NODRIVER || hr == DSERR_ALLOCATED || hr == E_FAIL, + "DirectSoundCreate failed: %08x\n", hr); + if(hr != S_OK) + return; + + caps.dwSize = sizeof(caps); + + hr = IDirectSound_GetCaps(ds, &caps); + ok(hr == S_OK, "GetCaps failed: %08x\n", hr); + + ok(caps.dwPrimaryBuffers == 1, "Got wrong number of primary buffers: %u\n", + caps.dwPrimaryBuffers); + + /* DSBCAPS_LOC* is ignored for primary buffers */ + bufdesc.dwSize = sizeof(bufdesc); + bufdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCHARDWARE | + DSBCAPS_PRIMARYBUFFER; + bufdesc.dwBufferBytes = 0; + bufdesc.dwReserved = 0; + bufdesc.lpwfxFormat = NULL; + bufdesc.guid3DAlgorithm = GUID_NULL; + + hr = IDirectSound_CreateSoundBuffer(ds, &bufdesc, &primary, NULL); + ok(hr == S_OK, "CreateSoundBuffer failed: %08x\n", hr); + if(hr != S_OK){ + IDirectSound_Release(ds); + return; + } + + bufdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCSOFTWARE | + DSBCAPS_PRIMARYBUFFER; + + hr = IDirectSound_CreateSoundBuffer(ds, &bufdesc, &primary2, NULL); + ok(hr == S_OK, "CreateSoundBuffer failed: %08x\n", hr); + ok(primary == primary2, "Got different primary buffers: %p, %p\n", primary, primary2); + if(hr == S_OK) + IDirectSoundBuffer_Release(primary2); + + buf8 = (IDirectSoundBuffer8 *)0xDEADBEEF; + hr = IDirectSoundBuffer_QueryInterface(primary, &IID_IDirectSoundBuffer8, + (void**)&buf8); + ok(hr == E_NOINTERFACE, "QueryInterface gave wrong failure: %08x\n", hr); + ok(buf8 == NULL, "Pointer didn't get set to NULL\n"); + + fmt.wFormatTag = WAVE_FORMAT_PCM; + fmt.nChannels = 2; + fmt.nSamplesPerSec = 48000; + fmt.wBitsPerSample = 16; + fmt.nBlockAlign = fmt.nChannels * fmt.wBitsPerSample / 8; + fmt.nAvgBytesPerSec = fmt.nBlockAlign * fmt.nSamplesPerSec; + fmt.cbSize = 0; + + bufdesc.lpwfxFormat = &fmt; + bufdesc.dwBufferBytes = fmt.nSamplesPerSec * fmt.nBlockAlign / 10; + bufdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCHARDWARE | + DSBCAPS_CTRLVOLUME; + + secondaries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(IDirectSoundBuffer *) * caps.dwMaxHwMixingAllBuffers); + + /* try to fill all of the hw buffers */ + trace("dwMaxHwMixingAllBuffers: %u\n", caps.dwMaxHwMixingAllBuffers); + trace("dwMaxHwMixingStaticBuffers: %u\n", caps.dwMaxHwMixingStaticBuffers); + trace("dwMaxHwMixingStreamingBuffers: %u\n", caps.dwMaxHwMixingStreamingBuffers); + for(i = 0; i < caps.dwMaxHwMixingAllBuffers; ++i){ + hr = IDirectSound_CreateSoundBuffer(ds, &bufdesc, &secondaries[i], NULL); + ok(hr == S_OK || hr == E_NOTIMPL || broken(hr == DSERR_CONTROLUNAVAIL) || broken(hr == E_FAIL), + "CreateSoundBuffer(%u) failed: %08x\n", i, hr); + if(hr != S_OK) + break; + + bufcaps.dwSize = sizeof(bufcaps); + hr = IDirectSoundBuffer_GetCaps(secondaries[i], &bufcaps); + ok(hr == S_OK, "GetCaps failed: %08x\n", hr); + ok((bufcaps.dwFlags & DSBCAPS_LOCHARDWARE) != 0, + "Buffer wasn't allocated in hardware, dwFlags: %x\n", bufcaps.dwFlags); + } + + /* see if we can create one more */ + hr = IDirectSound_CreateSoundBuffer(ds, &bufdesc, &secondary, NULL); + ok((i == caps.dwMaxHwMixingAllBuffers && hr == DSERR_ALLOCATED) || /* out of hw buffers */ + (caps.dwMaxHwMixingAllBuffers == 0 && hr == DSERR_INVALIDCALL) || /* no hw buffers at all */ + hr == E_NOTIMPL || /* don't support hw buffers */ + broken(hr == DSERR_CONTROLUNAVAIL) || /* vmware winxp, others? */ + broken(hr == E_FAIL) || /* broken AC97 driver */ + broken(hr == S_OK) /* broken driver allows more hw bufs than dscaps claims */, + "CreateSoundBuffer(%u) gave wrong error: %08x\n", i, hr); + if(hr == S_OK) + IDirectSoundBuffer_Release(secondary); + + for(i = 0; i < caps.dwMaxHwMixingAllBuffers; ++i) + if(secondaries[i]) + IDirectSoundBuffer_Release(secondaries[i]); + HeapFree(GetProcessHeap(), 0, secondaries); + + IDirectSoundBuffer_Release(primary); + IDirectSound_Release(ds); +} + START_TEST(dsound) { HMODULE hDsound; @@ -1077,14 +1656,8 @@ { BOOL ret;
- ok( FreeLibrary(hDsound), "FreeLibrary(1) returned %d\n", GetLastError()); - SetLastError(0xdeadbeef); ret = FreeLibrary(hDsound); - ok( ret || - broken(!ret && GetLastError() == ERROR_MOD_NOT_FOUND) || /* NT4 */ - broken(!ret && GetLastError() == ERROR_INVALID_HANDLE), /* Win9x */ - "FreeLibrary(2) returned %d\n", GetLastError()); - ok(!FreeLibrary(hDsound), "DirectSound DLL still loaded\n"); + ok( ret, "FreeLibrary(1) returned %d\n", GetLastError()); }
hDsound = LoadLibrary("dsound.dll"); @@ -1100,11 +1673,12 @@
IDirectSound_tests(); dsound_tests(); + test_hw_buffers();
FreeLibrary(hDsound); } else - skip("dsound.dll not found!\n"); + win_skip("dsound.dll not found - skipping all tests\n");
CoUninitialize(); }
Modified: trunk/rostests/winetests/dsound/dsound8.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dsound/dsound8.c... ============================================================================== --- trunk/rostests/winetests/dsound/dsound8.c [iso-8859-1] (original) +++ trunk/rostests/winetests/dsound/dsound8.c [iso-8859-1] Mon Sep 30 11:39:02 2013 @@ -25,15 +25,27 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include <windows.h> -#include <stdio.h> - -#include "wine/test.h" -#include "dsound.h" -#include "dsconf.h" -#include "mmreg.h" -#include "ks.h" -#include "ksmedia.h" +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#define COBJMACROS +#define NONAMELESSUNION +//#include <windows.h> +//#include <stdio.h> + +#include <wine/test.h> +#include <wingdi.h> +#include <mmreg.h> +#include <dsound.h> +#include <dsconf.h> +//#include "ks.h" +#include <ksmedia.h> +#include <initguid.h> +#include <mmdeviceapi.h> +//#include "audioclient.h" +//#include "propkey.h" +//#include "devpkey.h"
#include "dsound_test.h"
@@ -356,6 +368,8 @@ &IID_IDirectSoundBuffer8, (void **)&buffer8); if (rc==DS_OK && buffer8!=NULL) { + ok(buffer8==(IDirectSoundBuffer8*)secondary, + "IDirectSoundBuffer8 iface different from IDirectSoundBuffer.\n"); ref=IDirectSoundBuffer8_AddRef(buffer8); ok(ref==3,"IDirectSoundBuffer8_AddRef() has %d references, " "should have 3\n",ref); @@ -534,7 +548,7 @@ DSCAPS dscaps; WAVEFORMATEX wfx, wfx2; int ref; - unsigned int f; + unsigned int f, tag;
/* Create the DirectSound object */ rc=pDirectSoundCreate8(lpGuid,&dso,NULL); @@ -568,6 +582,11 @@
if (rc==DS_OK && primary!=NULL) { for (f=0;f<NB_FORMATS;f++) { + for (tag=0;tag<NB_TAGS;tag++) { + /* if float, we only want to test 32-bit */ + if ((format_tags[tag] == WAVE_FORMAT_IEEE_FLOAT) && (formats[f][1] != 32)) + continue; + /* We must call SetCooperativeLevel to be allowed to call * SetFormat */ /* DSOUND: Setting DirectSound cooperative level to @@ -577,7 +596,7 @@ if (rc!=DS_OK) goto EXIT;
- init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1], + init_format(&wfx,format_tags[tag],formats[f][0],formats[f][1], formats[f][2]); wfx2=wfx; rc=IDirectSoundBuffer_SetFormat(primary,&wfx); @@ -621,9 +640,9 @@ wfx.nBlockAlign); bufdesc.lpwfxFormat=&wfx2; if (winetest_interactive) { - trace(" Testing a primary buffer at %dx%dx%d with a " + trace(" Testing a primary buffer at %dx%dx%d (fmt=%d) with a " "secondary buffer at %dx%dx%d\n", - wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels, + wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,format_tags[tag], wfx2.nSamplesPerSec,wfx2.wBitsPerSample,wfx2.nChannels); } rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); @@ -639,6 +658,7 @@ ok(ref==0,"IDirectSoundBuffer_Release() has %d references, " "should have 0\n",ref); } + } }
ref=IDirectSoundBuffer_Release(primary); @@ -668,7 +688,7 @@ DSBUFFERDESC bufdesc; DSCAPS dscaps; WAVEFORMATEX wfx, wfx1; - DWORD f; + DWORD f, tag; int ref;
/* Create the DirectSound object */ @@ -708,8 +728,14 @@ goto EXIT1;
for (f=0;f<NB_FORMATS;f++) { + for (tag=0;tag<NB_TAGS;tag++) { WAVEFORMATEXTENSIBLE wfxe; - init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1], + + /* if float, we only want to test 32-bit */ + if ((format_tags[tag] == WAVE_FORMAT_IEEE_FLOAT) && (formats[f][1] != 32)) + continue; + + init_format(&wfx,format_tags[tag],formats[f][0],formats[f][1], formats[f][2]); secondary=NULL; ZeroMemory(&bufdesc, sizeof(bufdesc)); @@ -748,7 +774,7 @@ bufdesc.lpwfxFormat=(WAVEFORMATEX*)&wfxe; wfxe.Format = wfx; wfxe.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - wfxe.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + wfxe.SubFormat = (format_tags[tag] == WAVE_FORMAT_PCM ? KSDATAFORMAT_SUBTYPE_PCM : KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); wfxe.Format.cbSize = 1; wfxe.Samples.wValidBitsPerSample = wfx.wBitsPerSample; wfxe.dwChannelMask = (wfx.nChannels == 1 ? KSAUDIO_SPEAKER_MONO : KSAUDIO_SPEAKER_STEREO); @@ -799,7 +825,7 @@ secondary=NULL; }
- wfxe.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; + wfxe.SubFormat = (format_tags[tag] == WAVE_FORMAT_PCM ? KSDATAFORMAT_SUBTYPE_PCM : KSDATAFORMAT_SUBTYPE_IEEE_FLOAT); rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); ok(rc==DS_OK && secondary, "IDirectSound_CreateSoundBuffer() returned: %08x %p\n", @@ -854,9 +880,9 @@
if (rc==DS_OK && secondary!=NULL) { if (winetest_interactive) { - trace(" Testing a secondary buffer at %dx%dx%d " + trace(" Testing a secondary buffer at %dx%dx%d (fmt=%d) " "with a primary buffer at %dx%dx%d\n", - wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels, + wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,format_tags[tag], wfx1.nSamplesPerSec,wfx1.wBitsPerSample,wfx1.nChannels); } test_buffer8(dso,&secondary,0,FALSE,0,FALSE,0, @@ -866,6 +892,7 @@ ok(ref==0,"IDirectSoundBuffer_Release() has %d references, " "should have 0\n",ref); } + } } EXIT1: ref=IDirectSoundBuffer_Release(primary); @@ -915,6 +942,236 @@ ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %08x\n",rc); }
+static void test_hw_buffers(void) +{ + IDirectSound8 *ds; + IDirectSoundBuffer *primary, *primary2, **secondaries, *secondary; + IDirectSoundBuffer8 *buf8; + DSCAPS caps; + DSBCAPS bufcaps; + DSBUFFERDESC bufdesc; + WAVEFORMATEX fmt; + UINT i; + HRESULT hr; + + hr = pDirectSoundCreate8(NULL, &ds, NULL); + ok(hr == S_OK || hr == DSERR_NODRIVER || hr == DSERR_ALLOCATED || hr == E_FAIL, + "DirectSoundCreate8 failed: %08x\n", hr); + if(hr != S_OK) + return; + + caps.dwSize = sizeof(caps); + + hr = IDirectSound8_GetCaps(ds, &caps); + ok(hr == S_OK, "GetCaps failed: %08x\n", hr); + + ok(caps.dwPrimaryBuffers == 1, "Got wrong number of primary buffers: %u\n", + caps.dwPrimaryBuffers); + + /* DSBCAPS_LOC* is ignored for primary buffers */ + bufdesc.dwSize = sizeof(bufdesc); + bufdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCHARDWARE | + DSBCAPS_PRIMARYBUFFER; + bufdesc.dwBufferBytes = 0; + bufdesc.dwReserved = 0; + bufdesc.lpwfxFormat = NULL; + bufdesc.guid3DAlgorithm = GUID_NULL; + + hr = IDirectSound8_CreateSoundBuffer(ds, &bufdesc, &primary, NULL); + ok(hr == S_OK, "CreateSoundBuffer failed: %08x\n", hr); + if(hr != S_OK){ + IDirectSound8_Release(ds); + return; + } + + bufdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCSOFTWARE | + DSBCAPS_PRIMARYBUFFER; + + hr = IDirectSound8_CreateSoundBuffer(ds, &bufdesc, &primary2, NULL); + ok(hr == S_OK, "CreateSoundBuffer failed: %08x\n", hr); + ok(primary == primary2, "Got different primary buffers: %p, %p\n", primary, primary2); + if(hr == S_OK) + IDirectSoundBuffer_Release(primary2); + + buf8 = (IDirectSoundBuffer8 *)0xDEADBEEF; + hr = IDirectSoundBuffer_QueryInterface(primary, &IID_IDirectSoundBuffer8, + (void**)&buf8); + ok(hr == E_NOINTERFACE, "QueryInterface gave wrong failure: %08x\n", hr); + ok(buf8 == NULL, "Pointer didn't get set to NULL\n"); + + fmt.wFormatTag = WAVE_FORMAT_PCM; + fmt.nChannels = 2; + fmt.nSamplesPerSec = 48000; + fmt.wBitsPerSample = 16; + fmt.nBlockAlign = fmt.nChannels * fmt.wBitsPerSample / 8; + fmt.nAvgBytesPerSec = fmt.nBlockAlign * fmt.nSamplesPerSec; + fmt.cbSize = 0; + + bufdesc.lpwfxFormat = &fmt; + bufdesc.dwBufferBytes = fmt.nSamplesPerSec * fmt.nBlockAlign / 10; + bufdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_LOCHARDWARE | + DSBCAPS_CTRLVOLUME; + + secondaries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(IDirectSoundBuffer *) * caps.dwMaxHwMixingAllBuffers); + + /* try to fill all of the hw buffers */ + trace("dwMaxHwMixingAllBuffers: %u\n", caps.dwMaxHwMixingAllBuffers); + trace("dwMaxHwMixingStaticBuffers: %u\n", caps.dwMaxHwMixingStaticBuffers); + trace("dwMaxHwMixingStreamingBuffers: %u\n", caps.dwMaxHwMixingStreamingBuffers); + for(i = 0; i < caps.dwMaxHwMixingAllBuffers; ++i){ + hr = IDirectSound8_CreateSoundBuffer(ds, &bufdesc, &secondaries[i], NULL); + ok(hr == S_OK || hr == E_NOTIMPL || broken(hr == DSERR_CONTROLUNAVAIL) || broken(hr == E_FAIL), + "CreateSoundBuffer(%u) failed: %08x\n", i, hr); + if(hr != S_OK) + break; + + bufcaps.dwSize = sizeof(bufcaps); + hr = IDirectSoundBuffer_GetCaps(secondaries[i], &bufcaps); + ok(hr == S_OK, "GetCaps failed: %08x\n", hr); + ok((bufcaps.dwFlags & DSBCAPS_LOCHARDWARE) != 0, + "Buffer wasn't allocated in hardware, dwFlags: %x\n", bufcaps.dwFlags); + } + + /* see if we can create one more */ + hr = IDirectSound8_CreateSoundBuffer(ds, &bufdesc, &secondary, NULL); + ok((i == caps.dwMaxHwMixingAllBuffers && hr == DSERR_ALLOCATED) || /* out of hw buffers */ + (caps.dwMaxHwMixingAllBuffers == 0 && hr == DSERR_INVALIDCALL) || /* no hw buffers at all */ + hr == E_NOTIMPL || /* don't support hw buffers */ + broken(hr == DSERR_CONTROLUNAVAIL) || /* vmware winxp, others? */ + broken(hr == E_FAIL) || /* broken AC97 driver */ + broken(hr == S_OK) /* broken driver allows more hw bufs than dscaps claims */, + "CreateSoundBuffer(%u) gave wrong error: %08x\n", i, hr); + if(hr == S_OK) + IDirectSoundBuffer_Release(secondary); + + for(i = 0; i < caps.dwMaxHwMixingAllBuffers; ++i) + if(secondaries[i]) + IDirectSoundBuffer_Release(secondaries[i]); + + HeapFree(GetProcessHeap(), 0, secondaries); + + IDirectSoundBuffer_Release(primary); + IDirectSound8_Release(ds); +} + +static struct { + UINT dev_count; + GUID guid; +} default_info = { 0 }; + +static BOOL WINAPI default_device_cb(GUID *guid, const char *desc, + const char *module, void *user) +{ + trace("guid: %p, desc: %s\n", guid, desc); + if(!guid) + ok(default_info.dev_count == 0, "Got NULL GUID not in first position\n"); + else{ + if(default_info.dev_count == 0){ + ok(IsEqualGUID(guid, &default_info.guid), "Expected default device GUID\n"); + }else{ + ok(!IsEqualGUID(guid, &default_info.guid), "Got default GUID at unexpected location: %u\n", + default_info.dev_count); + } + + /* only count real devices */ + ++default_info.dev_count; + } + + return TRUE; +} + +static void test_first_device(void) +{ + IMMDeviceEnumerator *devenum; + IMMDevice *defdev; + IPropertyStore *ps; + PROPVARIANT pv; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, + CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&devenum); + if(FAILED(hr)){ + win_skip("MMDevAPI is not available, skipping default device test\n"); + return; + } + + hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(devenum, eRender, + eMultimedia, &defdev); + if (hr == E_NOTFOUND) { + win_skip("No default device found\n"); + return; + } + ok(hr == S_OK, "GetDefaultAudioEndpoint failed: %08x\n", hr); + + hr = IMMDevice_OpenPropertyStore(defdev, STGM_READ, &ps); + ok(hr == S_OK, "OpenPropertyStore failed: %08x\n", hr); + + PropVariantInit(&pv); + + hr = IPropertyStore_GetValue(ps, &PKEY_AudioEndpoint_GUID, &pv); + ok(hr == S_OK, "GetValue failed: %08x\n", hr); + + CLSIDFromString(pv.u.pwszVal, &default_info.guid); + + PropVariantClear(&pv); + IPropertyStore_Release(ps); + IMMDevice_Release(defdev); + IMMDeviceEnumerator_Release(devenum); + + hr = pDirectSoundEnumerateA(&default_device_cb, NULL); + ok(hr == S_OK, "DirectSoundEnumerateA failed: %08x\n", hr); +} + +static void test_COM(void) +{ + IDirectSound *ds; + IDirectSound8 *ds8 = (IDirectSound8*)0xdeadbeef; + IUnknown *unk, *unk8; + ULONG refcount; + HRESULT hr; + + /* COM aggregation */ + hr = CoCreateInstance(&CLSID_DirectSound8, (IUnknown*)&ds, CLSCTX_INPROC_SERVER, + &IID_IUnknown, (void**)&ds8); + ok(hr == CLASS_E_NOAGGREGATION, + "DirectSound create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr); + ok(!ds8, "ds8 = %p\n", ds8); + + /* Invalid RIID */ + hr = CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound3DBuffer, (void**)&ds8); + ok(hr == E_NOINTERFACE, + "DirectSound create failed: %08x, expected E_NOINTERFACE\n", hr); + + /* Same refcount for IDirectSound and IDirectSound8 */ + hr = CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound8, + (void**)&ds8); + ok(hr == S_OK, "DirectSound create failed: %08x, expected S_OK\n", hr); + refcount = IDirectSound8_AddRef(ds8); + ok(refcount == 2, "refcount == %u, expected 2\n", refcount); + hr = IDirectSound8_QueryInterface(ds8, &IID_IDirectSound, (void**)&ds); + ok(hr == S_OK, "QueryInterface for IID_IDirectSound failed: %08x\n", hr); + refcount = IDirectSound8_AddRef(ds8); + ok(refcount == 4, "refcount == %u, expected 4\n", refcount); + refcount = IDirectSound_AddRef(ds); + ok(refcount == 5, "refcount == %u, expected 5\n", refcount); + + /* Separate refcount for IUnknown */ + hr = IDirectSound_QueryInterface(ds, &IID_IUnknown, (void**)&unk); + ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); + refcount = IUnknown_AddRef(unk); + ok(refcount == 2, "refcount == %u, expected 2\n", refcount); + hr = IDirectSound_QueryInterface(ds8, &IID_IUnknown, (void**)&unk8); + ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); + refcount = IUnknown_AddRef(unk8); + ok(refcount == 4, "refcount == %u, expected 4\n", refcount); + refcount = IDirectSound_AddRef(ds); + ok(refcount == 6, "refcount == %u, expected 6\n", refcount); + + while (IDirectSound_Release(ds)); + while (IUnknown_Release(unk)); +}
START_TEST(dsound8) { @@ -932,16 +1189,19 @@ "DirectSoundCreate8"); if (pDirectSoundCreate8) { + test_COM(); IDirectSound8_tests(); dsound8_tests(); + test_hw_buffers(); + test_first_device(); } else - skip("dsound8 test skipped\n"); + skip("DirectSoundCreate8 missing - skipping all tests\n");
FreeLibrary(hDsound); } else - skip("dsound.dll not found!\n"); + skip("dsound.dll not found - skipping all tests\n");
CoUninitialize(); }
Modified: trunk/rostests/winetests/dsound/dsound_test.h URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dsound/dsound_te... ============================================================================== --- trunk/rostests/winetests/dsound/dsound_test.h [iso-8859-1] (original) +++ trunk/rostests/winetests/dsound/dsound_test.h [iso-8859-1] Mon Sep 30 11:39:02 2013 @@ -17,6 +17,10 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + +#include <wingdi.h> +#include <mmreg.h> +#include <mmsystem.h>
static const unsigned int formats[][4]={ { 8000, 8, 1, 0 }, @@ -70,11 +74,14 @@ }; #define NB_FORMATS (sizeof(formats)/sizeof(*formats))
+static const unsigned int format_tags[] = {WAVE_FORMAT_PCM, WAVE_FORMAT_IEEE_FLOAT}; +#define NB_TAGS (sizeof(format_tags)/sizeof(*format_tags)) + /* The time slice determines how often we will service the buffer */ #define TIME_SLICE 31 #define BUFFER_LEN 400
-extern char* wave_generate_la(WAVEFORMATEX*,double,DWORD*); +extern char* wave_generate_la(WAVEFORMATEX*,double,DWORD*,BOOL); extern HWND get_hwnd(void); extern void init_format(WAVEFORMATEX*,int,int,int,int); extern void test_buffer(LPDIRECTSOUND,LPDIRECTSOUNDBUFFER*,
Modified: trunk/rostests/winetests/dsound/duplex.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dsound/duplex.c?... ============================================================================== --- trunk/rostests/winetests/dsound/duplex.c [iso-8859-1] (original) +++ trunk/rostests/winetests/dsound/duplex.c [iso-8859-1] Mon Sep 30 11:39:02 2013 @@ -18,14 +18,19 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include <windows.h> - -#include <stdio.h> - -#include "wine/test.h" -#include "dsound.h" -#include "mmreg.h" -#include "dsconf.h" +#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + +#define COBJMACROS +//#include <windows.h> +//#include <stdio.h> + +#include <wine/test.h> +#include <wingdi.h> +#include <mmreg.h> +#include <dsound.h> +#include <dsconf.h>
#include "dsound_test.h"
@@ -93,8 +98,9 @@ ok(rc==DS_OK,"IDirectSoundFullDuplex_QueryInterface(IID_IDirectSoundFullDuplex) " "failed: %08x\n",rc); if (rc==DS_OK) { - ok (dsfdo==dsfd, "different interfaces\n"); + ok(dsfdo==dsfd, "different interfaces\n"); ref=IDirectSound8_Release(dsfd); + ok(ref==1, "IDirectSoundFullDuplex_Release() has %d references, should have 1\n", ref); }
ref=IDirectSoundFullDuplex_Release(dsfdo); @@ -222,6 +228,117 @@ IDirectSoundFullDuplex_Release(dsfdo); }
+static void test_COM(void) +{ + IDirectSoundFullDuplex *dsfd = (IDirectSoundFullDuplex*)0xdeadbeef; + IDirectSound *ds; + IDirectSound8 *ds8; + IDirectSoundCapture *dsc; + IUnknown *unk, *unk8; + IDirectSoundBuffer8 *dsb8; + IDirectSoundCaptureBuffer8 *dscb8; + DSBUFFERDESC bufdesc; + DSCBUFFERDESC cbufdesc; + WAVEFORMATEX wfx; + ULONG refcount; + HRESULT hr; + + /* COM aggregation */ + hr = CoCreateInstance(&CLSID_DirectSoundFullDuplex, (IUnknown*)&dsfd, CLSCTX_INPROC_SERVER, + &IID_IUnknown, (void**)&dsfd); + ok(hr == CLASS_E_NOAGGREGATION, + "DirectSoundFullDuplex create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr); + ok(!dsfd, "dsfd = %p\n", dsfd); + + /* Invalid RIID */ + hr = CoCreateInstance(&CLSID_DirectSoundFullDuplex, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSound3DBuffer, (void**)&dsfd); + ok(hr == E_NOINTERFACE, + "DirectSoundFullDuplex create failed: %08x, expected E_NOINTERFACE\n", hr); + + /* Different refcount for IDirectSoundFullDuplex and for IUnknown */ + hr = CoCreateInstance(&CLSID_DirectSoundFullDuplex, NULL, CLSCTX_INPROC_SERVER, + &IID_IDirectSoundFullDuplex, (void**)&dsfd); + ok(hr == S_OK, "DirectSoundFullDuplex create failed: %08x, expected S_OK\n", hr); + refcount = IDirectSoundFullDuplex_AddRef(dsfd); + ok(refcount == 2, "refcount == %u, expected 2\n", refcount); + hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IUnknown, (void**)&unk); + ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); + refcount = IUnknown_AddRef(unk); + ok(refcount == 2, "refcount == %u, expected 2\n", refcount); + + /* Not initialized */ + hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IDirectSound8, (void**)&ds8); + ok(hr == E_NOINTERFACE, + "QueryInterface for IID_IDirectSound8 failed: %08x, expected E_NOINTERFACE\n", hr); + hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IDirectSoundCapture, (void**)&dsc); + ok(hr == E_NOINTERFACE, + "QueryInterface for IID_IDirectSoundCapture failed: %08x, expected E_NOINTERFACE\n", hr); + + init_format(&wfx, WAVE_FORMAT_PCM, 44100, 16, 1); + ZeroMemory(&bufdesc, sizeof(bufdesc)); + bufdesc.dwSize = sizeof(bufdesc); + bufdesc.dwBufferBytes = wfx.nAvgBytesPerSec; + bufdesc.lpwfxFormat = &wfx; + ZeroMemory(&cbufdesc, sizeof(cbufdesc)); + cbufdesc.dwSize = sizeof(cbufdesc); + cbufdesc.dwBufferBytes = wfx.nAvgBytesPerSec; + cbufdesc.lpwfxFormat = &wfx; + hr = IDirectSoundFullDuplex_Initialize(dsfd, NULL, NULL, &cbufdesc, &bufdesc, get_hwnd(), + DSSCL_EXCLUSIVE, NULL, NULL); + ok(hr == E_INVALIDARG, + "IDirectSoundFullDuplex_Initialize failed: %08x, expected E_INVALIDARG\n", hr); + hr = IDirectSoundFullDuplex_Initialize(dsfd, NULL, NULL, &cbufdesc, &bufdesc, get_hwnd(), + DSSCL_EXCLUSIVE, &dscb8, &dsb8); + if (hr == DSERR_NODRIVER || hr == DSERR_INVALIDCALL) { + skip("No driver\n"); + return; + } + ok(hr == S_OK, "IDirectSoundFullDuplex_Initialize failed: %08x\n", hr); + + /* IDirectSound and IDirectSound8 */ + hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IDirectSound8, (void**)&ds8); + ok(hr == S_OK, "QueryInterface for IID_IDirectSound8 failed: %08x\n", hr); + refcount = IDirectSound8_AddRef(ds8); + ok(refcount == 2, "refcount == %u, expected 2\n", refcount); + hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IDirectSound, (void**)&ds); + ok(hr == S_OK, "QueryInterface for IID_IDirectSound failed: %08x\n", hr); + refcount = IDirectSound8_AddRef(ds8); + ok(refcount == 4, "refcount == %u, expected 4\n", refcount); + refcount = IDirectSound_AddRef(ds); + ok(refcount == 5, "refcount == %u, expected 5\n", refcount); + hr = IDirectSound8_QueryInterface(ds8, &IID_IUnknown, (void**)&unk8); + ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); + ok(unk == unk8, "Got different IUnknown when QI'ing IDirectSoundFullDuplex and IDirectSound\n"); + refcount = IUnknown_AddRef(unk8); + ok(refcount == 4, "refcount == %u, expected 4\n", refcount); + refcount = IDirectSound_AddRef(ds); + ok(refcount == 6, "refcount == %u, expected 6\n", refcount); + refcount = IDirectSoundFullDuplex_AddRef(dsfd); + ok(refcount == 3, "refcount == %u, expected 3\n", refcount); + + /* IDirectSoundCapture */ + hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IDirectSoundCapture, (void**)&dsc); + ok(hr == S_OK, "QueryInterface for IID_IDirectSoundCapture failed: %08x\n", hr); + refcount = IDirectSoundCapture_AddRef(dsc); + ok(refcount == 2, "refcount == %u, expected 2\n", refcount); + refcount = IDirectSoundFullDuplex_AddRef(dsfd); + ok(refcount == 4, "refcount == %u, expected 4\n", refcount); + hr = IDirectSoundCapture_QueryInterface(ds8, &IID_IUnknown, (void**)&unk8); + ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); + ok(unk == unk8, + "Got different IUnknown when QI'ing IDirectSoundFullDuplex and IDirectSoundCapture\n"); + refcount = IUnknown_AddRef(unk8); + ok(refcount == 6, "refcount == %u, expected 6\n", refcount); + + IDirectSoundBuffer8_Release(dsb8); + IDirectSoundCaptureBuffer8_Release(dscb8); + while (IDirectSound8_Release(ds8)); + while (IDirectSoundCapture_Release(dsc)); + while (IDirectSoundFullDuplex_Release(dsfd)); + while (IUnknown_Release(unk)); +} + START_TEST(duplex) { HMODULE hDsound; @@ -234,15 +351,16 @@
pDirectSoundFullDuplexCreate=(void*)GetProcAddress(hDsound, "DirectSoundFullDuplexCreate"); - if (pDirectSoundFullDuplexCreate) + if (pDirectSoundFullDuplexCreate) { + test_COM(); IDirectSoundFullDuplex_tests(); - else - skip("duplex test skipped\n"); + } else + skip("DirectSoundFullDuplexCreate missing - skipping all tests\n");
FreeLibrary(hDsound); } else - skip("dsound.dll not found!\n"); + skip("dsound.dll not found - skipping all tests\n");
CoUninitialize(); }
Modified: trunk/rostests/winetests/dsound/propset.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dsound/propset.c... ============================================================================== --- trunk/rostests/winetests/dsound/propset.c [iso-8859-1] (original) +++ trunk/rostests/winetests/dsound/propset.c [iso-8859-1] Mon Sep 30 11:39:02 2013 @@ -19,12 +19,19 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#define WIN32_NO_STATUS +#define _INC_WINDOWS +#define COM_NO_WINDOWS_H + #define COBJMACROS -#include <windows.h> - -#include "wine/test.h" -#include "dsound.h" -#include "dsconf.h" +//#include <windows.h> + +#include <wine/test.h> +#include <wingdi.h> +#include <winnls.h> +#include <mmreg.h> +#include <dsound.h> +#include <dsconf.h>
#include "dsound_test.h"
@@ -553,6 +560,8 @@ IKsPropertySet_Release(pps); }
+static unsigned driver_count = 0; + static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription, LPCSTR lpcstrModule, LPVOID lpContext) { @@ -564,6 +573,7 @@ int ref;
trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule); + driver_count++;
rc=pDirectSoundCreate(lpGuid,&dso,NULL); ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL, @@ -616,8 +626,8 @@ trace(" Testing a secondary buffer at %dx%dx%d\n", wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels); rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); - ok(rc==DS_OK&&secondary!=NULL,"IDirectSound_CreateSoundBuffer() " - "failed to create a secondary buffer: %08x\n",rc); + ok((rc==DS_OK && secondary!=NULL) || broken(rc == DSERR_CONTROLUNAVAIL), /* vmware drivers on w2k */ + "IDirectSound_CreateSoundBuffer() failed to create a secondary buffer: %08x\n",rc); if (rc==DS_OK&&secondary!=NULL) { IKsPropertySet * pPropertySet=NULL; rc=IDirectSoundBuffer_QueryInterface(secondary, @@ -710,6 +720,7 @@ HRESULT rc; rc=pDirectSoundEnumerateA(&dsenum_callback,NULL); ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %08x\n",rc); + trace("tested %u DirectSound drivers\n", driver_count); }
START_TEST(propset) @@ -743,7 +754,7 @@ FreeLibrary(hDsound); } else - skip("dsound.dll not found!\n"); + skip("dsound.dll not found - skipping all tests\n");
CoUninitialize(); }
Modified: trunk/rostests/winetests/dsound/testlist.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/dsound/testlist.... ============================================================================== --- trunk/rostests/winetests/dsound/testlist.c [iso-8859-1] (original) +++ trunk/rostests/winetests/dsound/testlist.c [iso-8859-1] Mon Sep 30 11:39:02 2013 @@ -1,10 +1,7 @@ /* Automatically generated file; DO NOT EDIT!! */
-#define WIN32_LEAN_AND_MEAN -#include <windows.h> - #define STANDALONE -#include "wine/test.h" +#include <wine/test.h>
extern void func_capture(void); extern void func_ds3d8(void);