[DSOUND] add secondary buffer SetFrequency test
Robert Reif
reif at earthlink.net
Fri Feb 25 10:46:42 CST 2005
Add secondary buffer SetFrequency test.
-------------- next part --------------
Index: dlls/dsound/tests/ds3d.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/ds3d.c,v
retrieving revision 1.21
diff -u -p -r1.21 ds3d.c
--- dlls/dsound/tests/ds3d.c 23 Feb 2005 12:43:38 -0000 1.21
+++ dlls/dsound/tests/ds3d.c 25 Feb 2005 16:43:08 -0000
@@ -280,7 +280,8 @@ void test_buffer(LPDIRECTSOUND dso, LPDI
BOOL is_primary, BOOL set_volume, LONG volume,
BOOL set_pan, LONG pan, BOOL play, double duration,
BOOL buffer3d, LPDIRECTSOUND3DLISTENER listener,
- BOOL move_listener, BOOL move_sound)
+ BOOL move_listener, BOOL move_sound,
+ BOOL set_frequency, DWORD frequency)
{
HRESULT rc;
DSBCAPS dsbcaps;
@@ -288,6 +289,15 @@ void test_buffer(LPDIRECTSOUND dso, LPDI
DWORD size,status,freq;
int ref;
+ if (set_frequency) {
+ rc=IDirectSoundBuffer_SetFrequency(dsbo,frequency);
+ ok(rc==DS_OK||rc==DSERR_CONTROLUNAVAIL,
+ "IDirectSoundBuffer_SetFrequency() failed to set frequency "
+ "%s\n",DXGetErrorString8(rc));
+ if (rc!=DS_OK)
+ return;
+ }
+
/* DSOUND: Error: Invalid caps pointer */
rc=IDirectSoundBuffer_GetCaps(dsbo,0);
ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetCaps() should have "
@@ -336,8 +346,9 @@ void test_buffer(LPDIRECTSOUND dso, LPDI
(rc==DSERR_CONTROLUNAVAIL&&!(dsbcaps.dwFlags&DSBCAPS_CTRLFREQUENCY)),
"IDirectSoundBuffer_GetFrequency() failed: %s\n",DXGetErrorString8(rc));
if (rc==DS_OK) {
- ok(freq==wfx.nSamplesPerSec,"The frequency returned by GetFrequency "
- "%ld does not match the format %ld\n",freq,wfx.nSamplesPerSec);
+ DWORD f = set_frequency?frequency:wfx.nSamplesPerSec;
+ ok(freq==f,"The frequency returned by GetFrequency "
+ "%ld does not match the format %ld\n",freq,f);
}
/* DSOUND: Error: Invalid status pointer */
@@ -404,8 +415,14 @@ void test_buffer(LPDIRECTSOUND dso, LPDI
DWORD start_time,now;
if (winetest_interactive) {
- trace(" Playing %g second 440Hz tone at %ldx%dx%d\n", duration,
- wfx.nSamplesPerSec, wfx.wBitsPerSample,wfx.nChannels);
+ if (set_frequency)
+ trace(" Playing %g second 440Hz tone at %ldx%dx%d with a "
+ "frequency of %ld (%ldHz)\n", duration,
+ wfx.nSamplesPerSec, wfx.wBitsPerSample, wfx.nChannels,
+ frequency, (440 * frequency) / wfx.nSamplesPerSec);
+ else
+ trace(" Playing %g second 440Hz tone at %ldx%dx%d\n", duration,
+ wfx.nSamplesPerSec, wfx.wBitsPerSample, wfx.nChannels);
}
if (is_primary) {
@@ -522,7 +539,10 @@ void test_buffer(LPDIRECTSOUND dso, LPDI
}
}
- state.wave=wave_generate_la(&wfx,duration,&state.wave_len);
+ if (set_frequency)
+ state.wave=wave_generate_la(&wfx,(duration*frequency)/wfx.nSamplesPerSec,&state.wave_len);
+ else
+ state.wave=wave_generate_la(&wfx,duration,&state.wave_len);
state.dsbo=dsbo;
state.wfx=&wfx;
@@ -840,7 +860,7 @@ static HRESULT test_secondary(LPGUID lpG
duration=(move_listener || move_sound?4.0:1.0);
test_buffer(dso,secondary,0,FALSE,0,FALSE,0,
winetest_interactive,duration,has_3dbuffer,
- listener,move_listener,move_sound);
+ listener,move_listener,move_sound,FALSE,0);
ref=IDirectSoundBuffer_Release(secondary);
ok(ref==0,"IDirectSoundBuffer_Release() %s has %d references, "
"should have 0\n",has_duplicate?"duplicated":"secondary",
@@ -937,7 +957,8 @@ static HRESULT test_primary(LPGUID lpGui
"to create a primary buffer: %s\n",DXGetErrorString8(rc));
if (rc==DS_OK && primary!=NULL) {
test_buffer(dso,primary,1,TRUE,0,TRUE,0,winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,NULL,0,0);
+ !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,NULL,0,0,
+ FALSE,0);
if (winetest_interactive) {
LONG volume,pan;
@@ -946,7 +967,7 @@ static HRESULT test_primary(LPGUID lpGui
test_buffer(dso,primary,1,TRUE,volume,TRUE,0,
winetest_interactive &&
!(dscaps.dwFlags & DSCAPS_EMULDRIVER),
- 1.0,0,NULL,0,0);
+ 1.0,0,NULL,0,0,FALSE,0);
volume -= ((DSBVOLUME_MAX-DSBVOLUME_MIN) / 40);
}
@@ -954,7 +975,7 @@ static HRESULT test_primary(LPGUID lpGui
for (i = 0; i < 7; i++) {
test_buffer(dso,primary,1,TRUE,0,TRUE,pan,
winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,0,0,0);
+ !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,0,0,0,FALSE,0);
pan += ((DSBPAN_RIGHT-DSBPAN_LEFT) / 6);
}
}
@@ -1030,7 +1051,8 @@ static HRESULT test_primary_3d(LPGUID lp
"failed to create a 3D primary buffer: %s\n",DXGetErrorString8(rc));
if (rc==DS_OK && primary!=NULL) {
test_buffer(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,0,0,0);
+ !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,0,0,0,
+ FALSE,0);
ref=IDirectSoundBuffer_Release(primary);
ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
"should have 0\n",ref);
@@ -1129,7 +1151,7 @@ static HRESULT test_primary_3d_with_list
test_buffer(dso,primary,1,FALSE,0,FALSE,0,
winetest_interactive &&
!(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,
- listener,0,0);
+ listener,0,0,FALSE,0);
}
/* Testing the reference counting */
Index: dlls/dsound/tests/dsound.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/dsound.c,v
retrieving revision 1.48
diff -u -p -r1.48 dsound.c
--- dlls/dsound/tests/dsound.c 23 Feb 2005 12:43:38 -0000 1.48
+++ dlls/dsound/tests/dsound.c 25 Feb 2005 16:43:09 -0000
@@ -455,7 +455,7 @@ static HRESULT test_primary(LPGUID lpGui
trace("Listen for stutter, changes in pitch, volume, etc.\n");
}
test_buffer(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),5.0,0,0,0,0);
+ !(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, "
@@ -590,7 +590,7 @@ static HRESULT test_primary_secondary(LP
if (rc==DS_OK && secondary!=NULL) {
test_buffer(dso,secondary,0,FALSE,0,FALSE,0,
- winetest_interactive,1.0,0,NULL,0,0);
+ winetest_interactive,1.0,0,NULL,0,0,FALSE,0);
ref=IDirectSoundBuffer_Release(secondary);
ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
@@ -703,7 +703,7 @@ static HRESULT test_secondary(LPGUID lpG
if (rc==DS_OK && secondary!=NULL) {
test_buffer(dso,secondary,0,FALSE,0,FALSE,0,
- winetest_interactive,1.0,0,NULL,0,0);
+ winetest_interactive,1.0,0,NULL,0,0,FALSE,0);
ref=IDirectSoundBuffer_Release(secondary);
ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
@@ -783,6 +783,115 @@ static HRESULT test_block_align(LPGUID l
return rc;
}
+static struct fmt {
+ int bits;
+ int channels;
+} fmts[] = { { 8, 1 }, { 8, 2 }, { 16, 1 }, {16, 2 } };
+
+static HRESULT test_frequency(LPGUID lpGuid)
+{
+ HRESULT rc;
+ LPDIRECTSOUND dso=NULL;
+ LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
+ DSBUFFERDESC bufdesc;
+ DSCAPS dscaps;
+ WAVEFORMATEX wfx, wfx1;
+ DWORD f, r;
+ int ref;
+ int rates[] = { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100,
+ 48000, 96000 };
+
+ /* Create the DirectSound object */
+ rc=DirectSoundCreate(lpGuid,&dso,NULL);
+ ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
+ "DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
+ if (rc!=DS_OK)
+ return rc;
+
+ /* Get the device capabilities */
+ ZeroMemory(&dscaps, sizeof(dscaps));
+ dscaps.dwSize=sizeof(dscaps);
+ rc=IDirectSound_GetCaps(dso,&dscaps);
+ ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc));
+ if (rc!=DS_OK)
+ goto EXIT;
+
+ /* We must call SetCooperativeLevel before creating primary buffer */
+ /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
+ rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
+ ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
+ DXGetErrorString8(rc));
+ if (rc!=DS_OK)
+ goto EXIT;
+
+ ZeroMemory(&bufdesc, sizeof(bufdesc));
+ bufdesc.dwSize=sizeof(bufdesc);
+ bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
+ rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
+ ok(rc==DS_OK && primary!=NULL,
+ "IDirectSound_CreateSoundBuffer() failed to create a primary buffer "
+ "%s\n",DXGetErrorString8(rc));
+
+ if (rc==DS_OK && primary!=NULL) {
+ rc=IDirectSoundBuffer_GetFormat(primary,&wfx1,sizeof(wfx1),NULL);
+ ok(rc==DS_OK,"IDirectSoundBuffer8_Getformat() failed: %s\n",
+ DXGetErrorString8(rc));
+ if (rc!=DS_OK)
+ goto EXIT1;
+
+ for (f=0;f<sizeof(fmts)/sizeof(fmts[0]);f++) {
+ for (r=0;r<sizeof(rates)/sizeof(rates[0]);r++) {
+ init_format(&wfx,WAVE_FORMAT_PCM,11025,fmts[f].bits,
+ fmts[f].channels);
+ secondary=NULL;
+ ZeroMemory(&bufdesc, sizeof(bufdesc));
+ bufdesc.dwSize=sizeof(bufdesc);
+ bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_CTRLFREQUENCY;
+ bufdesc.dwBufferBytes=align((wfx.nAvgBytesPerSec*rates[r]/11025)*
+ BUFFER_LEN/1000,wfx.nBlockAlign);
+ bufdesc.lpwfxFormat=&wfx;
+ if (winetest_interactive) {
+ trace(" Testing a secondary buffer at %ldx%dx%d "
+ "with a primary buffer at %ldx%dx%d\n",
+ wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
+ 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 secondary "
+ "buffer %s\n",DXGetErrorString8(rc));
+
+ if (rc==DS_OK && secondary!=NULL) {
+ test_buffer(dso,secondary,0,FALSE,0,FALSE,0,
+ winetest_interactive,1.0,0,NULL,0,0,TRUE,rates[r]);
+
+ ref=IDirectSoundBuffer_Release(secondary);
+ ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
+ "should have 0\n",ref);
+ }
+ }
+ }
+EXIT1:
+ ref=IDirectSoundBuffer_Release(primary);
+ ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
+ "should have 0\n",ref);
+ }
+
+ /* Set the CooperativeLevel back to normal */
+ /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
+ rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
+ ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
+ DXGetErrorString8(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 BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
LPCSTR lpcstrModule, LPVOID lpContext)
{
@@ -800,6 +909,7 @@ static BOOL WINAPI dsenum_callback(LPGUI
test_primary(lpGuid);
test_primary_secondary(lpGuid);
test_secondary(lpGuid);
+ test_frequency(lpGuid);
}
return 1;
Index: dlls/dsound/tests/dsound_test.h
===================================================================
RCS file: /home/wine/wine/dlls/dsound/tests/dsound_test.h,v
retrieving revision 1.7
diff -u -p -r1.7 dsound_test.h
--- dlls/dsound/tests/dsound_test.h 16 Feb 2005 16:09:02 -0000 1.7
+++ dlls/dsound/tests/dsound_test.h 25 Feb 2005 16:43:09 -0000
@@ -55,7 +55,7 @@ extern HWND get_hwnd(void);
extern void init_format(WAVEFORMATEX*,int,int,int,int);
extern void test_buffer(LPDIRECTSOUND,LPDIRECTSOUNDBUFFER,
BOOL,BOOL,LONG,BOOL,LONG,BOOL,double,BOOL,
- LPDIRECTSOUND3DLISTENER,BOOL,BOOL);
+ LPDIRECTSOUND3DLISTENER,BOOL,BOOL,BOOL,DWORD);
extern void test_buffer8(LPDIRECTSOUND8,LPDIRECTSOUNDBUFFER,
BOOL,BOOL,LONG,BOOL,LONG,BOOL,double,BOOL,
LPDIRECTSOUND3DLISTENER,BOOL,BOOL);
More information about the wine-patches
mailing list