[DSOUND_WINETEST]

* Sync with Wine 1.7.1.
CORE-7469

svn path=/trunk/; revision=60475
This commit is contained in:
Amine Khaldi 2013-09-30 11:39:02 +00:00
parent d11690b2ae
commit 5dbec815ce
10 changed files with 1278 additions and 184 deletions

View file

@ -1,8 +1,4 @@
add_definitions(
-D__ROS_LONG64__
-D_DLL -D__USE_CRTIMP)
list(APPEND SOURCE
capture.c
ds3d8.c
@ -14,7 +10,7 @@ list(APPEND SOURCE
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)

View file

@ -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 @@ EXIT:
"should have 0\n", ref);
}
static void IDirectSoundCapture_tests(void)
static void test_capture(void)
{
HRESULT rc;
LPDIRECTSOUNDCAPTURE dsco=NULL;
@ -379,8 +387,6 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
(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 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
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 @@ static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
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 @@ EXIT:
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**)&notify);
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 @@ START_TEST(capture)
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);
if (!hDsound) {
skip("dsound.dll not found - skipping all tests\n");
return;
}
else
skip("dsound.dll not found!\n");
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();
}

View file

@ -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 *pDirectSoundEnumerateA)(LPDSENUMCALLBACKA,LPVOID)=NULL;
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 @@ char* wave_generate_la(WAVEFORMATEX* wfx, double duration, DWORD* size)
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 @@ char* wave_generate_la(WAVEFORMATEX* wfx, double duration, DWORD* size)
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 @@ char* wave_generate_la(WAVEFORMATEX* wfx, double duration, DWORD* size)
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 @@ void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER *dsbo,
DSBCAPS dsbcaps;
WAVEFORMATEX wfx,wfx2;
DWORD size,status,freq;
BOOL ieee = FALSE;
int ref;
if (set_frequency) {
@ -358,12 +380,16 @@ void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER *dsbo,
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 @@ void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER *dsbo,
"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 @@ static HRESULT test_secondary(LPGUID lpGuid, int play,
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 @@ static HRESULT test_secondary(LPGUID lpGuid, int play,
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 @@ static HRESULT test_secondary(LPGUID lpGuid, int play,
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 @@ static HRESULT test_primary_3d_with_listener(LPGUID lpGuid)
!(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 @@ static HRESULT test_primary_3d_with_listener(LPGUID lpGuid)
"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 DSERR_GENERIC;
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 @@ static void ds3d_tests(void)
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 @@ START_TEST(ds3d)
FreeLibrary(hDsound);
}
else
skip("dsound.dll not found!\n");
skip("dsound.dll not found - skipping all tests\n");
CoUninitialize();
}

View file

@ -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 @@ void test_buffer8(LPDIRECTSOUND8 dso, LPDIRECTSOUNDBUFFER * dsbo,
DSBCAPS dsbcaps;
WAVEFORMATEX wfx,wfx2;
DWORD size,status,freq;
BOOL ieee = FALSE;
int ref;
/* DSOUND: Error: Invalid caps pointer */
@ -214,11 +222,15 @@ void test_buffer8(LPDIRECTSOUND8 dso, LPDIRECTSOUNDBUFFER * dsbo,
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 @@ void test_buffer8(LPDIRECTSOUND8 dso, LPDIRECTSOUNDBUFFER * dsbo,
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 @@ static HRESULT test_secondary8(LPGUID lpGuid, int play,
"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 @@ static HRESULT test_secondary8(LPGUID lpGuid, int play,
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 DSERR_GENERIC;
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 @@ static void ds3d8_tests(void)
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 @@ START_TEST(ds3d8)
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();
}

View file

@ -26,15 +26,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 "wine/test.h"
#include "dsound.h"
#include "dsconf.h"
#include "mmreg.h"
#include "initguid.h"
#include "ks.h"
#include "ksmedia.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 @@ EXIT:
static void IDirectSound_tests(void)
{
HRESULT rc;
LPDIRECTSOUND dso=NULL;
IDirectSound *dso=(IDirectSound*)0xdeadbeef;
LPCLASSFACTORY cf=NULL;
trace("Testing IDirectSound\n");
@ -188,6 +193,12 @@ static void IDirectSound_tests(void)
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,
&IID_IDirectSound, (void**)&dso);
@ -326,7 +337,7 @@ static HRESULT test_dsound(LPGUID lpGuid)
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) {
@ -492,6 +503,15 @@ static HRESULT test_primary(LPGUID lpGuid)
test_buffer(dso,&primary,1,FALSE,0,FALSE,0,winetest_interactive &&
!(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 @@ static HRESULT test_primary_secondary(LPGUID lpGuid)
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 @@ static HRESULT test_primary_secondary(LPGUID lpGuid)
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 @@ static HRESULT test_primary_secondary(LPGUID lpGuid)
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 @@ static HRESULT test_primary_secondary(LPGUID lpGuid)
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 @@ static HRESULT test_primary_secondary(LPGUID lpGuid)
ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
"should have 0\n",ref);
}
}
}
ref=IDirectSoundBuffer_Release(primary);
@ -658,7 +684,7 @@ static HRESULT test_secondary(LPGUID lpGuid)
DSBUFFERDESC bufdesc;
DSCAPS dscaps;
WAVEFORMATEX wfx, wfx1;
DWORD f;
DWORD f, tag;
int ref;
/* Create the DirectSound object */
@ -697,8 +723,14 @@ static HRESULT test_secondary(LPGUID lpGuid)
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 @@ static HRESULT test_secondary(LPGUID lpGuid)
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 @@ static HRESULT test_secondary(LPGUID lpGuid)
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 @@ static HRESULT test_secondary(LPGUID lpGuid)
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 @@ static HRESULT test_secondary(LPGUID lpGuid)
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 @@ static HRESULT test_secondary(LPGUID lpGuid)
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 @@ no_wfe:
ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
"should have 0\n",ref);
}
}
}
EXIT1:
ref=IDirectSoundBuffer_Release(primary);
@ -883,8 +916,8 @@ static HRESULT test_block_align(LPGUID lpGuid)
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 @@ static HRESULT test_frequency(LPGUID lpGuid)
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) {
@ -1026,6 +1059,438 @@ EXIT:
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**)&notify);
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;
static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
@ -1054,6 +1519,8 @@ static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
test_primary_secondary(lpGuid);
test_secondary(lpGuid);
test_frequency(lpGuid);
test_duplicate(lpGuid);
test_invalid_fmts(lpGuid);
}
return 1;
@ -1066,6 +1533,118 @@ static void dsound_tests(void)
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 @@ START_TEST(dsound)
{
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 @@ START_TEST(dsound)
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();
}

View file

@ -25,15 +25,27 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <windows.h>
#include <stdio.h>
#define WIN32_NO_STATUS
#define _INC_WINDOWS
#define COM_NO_WINDOWS_H
#include "wine/test.h"
#include "dsound.h"
#include "dsconf.h"
#include "mmreg.h"
#include "ks.h"
#include "ksmedia.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 @@ static HRESULT test_dsound8(LPGUID lpGuid)
&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 @@ static HRESULT test_primary_secondary8(LPGUID lpGuid)
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 @@ static HRESULT test_primary_secondary8(LPGUID lpGuid)
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 @@ static HRESULT test_primary_secondary8(LPGUID lpGuid)
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 @@ static HRESULT test_primary_secondary8(LPGUID lpGuid)
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 @@ static HRESULT test_primary_secondary8(LPGUID lpGuid)
ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
"should have 0\n",ref);
}
}
}
ref=IDirectSoundBuffer_Release(primary);
@ -668,7 +688,7 @@ static HRESULT test_secondary8(LPGUID lpGuid)
DSBUFFERDESC bufdesc;
DSCAPS dscaps;
WAVEFORMATEX wfx, wfx1;
DWORD f;
DWORD f, tag;
int ref;
/* Create the DirectSound object */
@ -708,8 +728,14 @@ static HRESULT test_secondary8(LPGUID lpGuid)
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 @@ static HRESULT test_secondary8(LPGUID lpGuid)
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 @@ static HRESULT test_secondary8(LPGUID lpGuid)
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 @@ static HRESULT test_secondary8(LPGUID lpGuid)
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 @@ static HRESULT test_secondary8(LPGUID lpGuid)
ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
"should have 0\n",ref);
}
}
}
EXIT1:
ref=IDirectSoundBuffer_Release(primary);
@ -915,6 +942,236 @@ static void dsound8_tests(void)
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 @@ START_TEST(dsound8)
"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();
}

View file

@ -18,6 +18,10 @@
* 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 },
{ 8000, 8, 2, 0 },
@ -70,11 +74,14 @@ static const unsigned int formats[][4]={
};
#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*,

View file

@ -18,14 +18,19 @@
* 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 <stdio.h>
#define COBJMACROS
//#include <windows.h>
//#include <stdio.h>
#include "wine/test.h"
#include "dsound.h"
#include "mmreg.h"
#include "dsconf.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 @@ static void IDirectSoundFullDuplex_test(LPDIRECTSOUNDFULLDUPLEX dsfdo,
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 @@ static void IDirectSoundFullDuplex_tests(void)
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 @@ START_TEST(duplex)
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();
}

View file

@ -19,12 +19,19 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#define COBJMACROS
#include <windows.h>
#define WIN32_NO_STATUS
#define _INC_WINDOWS
#define COM_NO_WINDOWS_H
#include "wine/test.h"
#include "dsound.h"
#include "dsconf.h"
#define COBJMACROS
//#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 @@ static void propset_private_tests(void)
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 @@ static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
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 @@ static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
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 @@ static void propset_buffer_tests(void)
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 @@ START_TEST(propset)
FreeLibrary(hDsound);
}
else
skip("dsound.dll not found!\n");
skip("dsound.dll not found - skipping all tests\n");
CoUninitialize();
}

View file

@ -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);