2 * Tests basic sound playback in DirectSound.
3 * In particular we test each standard Windows sound format to make sure
4 * we handle the sound card/driver quirks correctly.
6 * Part of this test involves playing test tones. But this only makes
7 * sense if someone is going to carefully listen to it, and would only
8 * bother everyone else.
9 * So this is only done if the test is being run in interactive mode.
11 * Copyright (c) 2002-2004 Francois Gouget
13 * This library is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2.1 of the License, or (at your option) any later version.
18 * This library is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with this library; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #define NONAMELESSSTRUCT
29 #define NONAMELESSUNION
35 #include "wine/test.h"
41 #include "dsound_test.h"
43 static void dsound_dsound_tests()
46 LPDIRECTSOUND dso=NULL;
53 rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound, (void**)&dso);
54 ok(rc==S_OK,"CoCreateInstance failed: %s\n",DXGetErrorString9(rc));
56 /* Try to Query for objects */
57 rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
58 ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
60 IDirectSound_Release(unknown);
62 rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
63 ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
65 IDirectSound_Release(ds);
67 rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
68 ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString9(rc));
70 IDirectSound8_Release(ds8);
72 rc=IDirectSound_Initialize(dso,NULL);
73 ok(rc==DS_OK,"IDirectSound_Initialize(NULL) failed: %s\n",DXGetErrorString9(rc));
75 /* DSOUND: Error: Invalid caps buffer */
76 rc=IDirectSound_GetCaps(dso,0);
77 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
79 ZeroMemory(&dscaps, sizeof(dscaps));
81 /* DSOUND: Error: Invalid caps buffer */
82 rc=IDirectSound_GetCaps(dso,&dscaps);
83 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
85 dscaps.dwSize=sizeof(dscaps);
87 /* DSOUND: Running on a certified driver */
88 rc=IDirectSound_GetCaps(dso,&dscaps);
89 ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
91 trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
92 dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
93 dscaps.dwMaxSecondarySampleRate);
96 ref=IDirectSound_Release(dso);
97 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
100 rc=DirectSoundCreate(NULL,&dso,NULL);
101 ok(rc==S_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString9(rc));
103 /* Try to Query for objects */
104 rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
105 ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
107 IDirectSound_Release(unknown);
109 rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
110 ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
112 IDirectSound_Release(ds);
114 rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
115 ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString9(rc));
117 IDirectSound8_Release(ds8);
119 /* DSOUND: Error: Invalid caps buffer */
120 rc=IDirectSound_GetCaps(dso,0);
121 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
123 ZeroMemory(&dscaps, sizeof(dscaps));
125 /* DSOUND: Error: Invalid caps buffer */
126 rc=IDirectSound_GetCaps(dso,&dscaps);
127 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
129 dscaps.dwSize=sizeof(dscaps);
131 /* DSOUND: Running on a certified driver */
132 rc=IDirectSound_GetCaps(dso,&dscaps);
133 ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
135 trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
136 dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
137 dscaps.dwMaxSecondarySampleRate);
140 ref=IDirectSound_Release(dso);
141 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
145 static void dsound_dsound8_tests()
148 LPDIRECTSOUND8 dso=NULL;
155 rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound8, (void**)&dso);
156 ok(rc==S_OK,"CoCreateInstance failed: %s\n",DXGetErrorString9(rc));
158 /* Try to Query for objects */
159 rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
160 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
162 IDirectSound8_Release(unknown);
164 rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
165 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
167 IDirectSound_Release(ds);
169 rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
170 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString9(rc));
172 IDirectSound8_Release(ds8);
174 rc=IDirectSound8_Initialize(dso,NULL);
175 ok(rc==DS_OK,"IDirectSound_Initialize(NULL) failed: %s\n",DXGetErrorString9(rc));
177 /* DSOUND: Error: Invalid caps buffer */
178 rc=IDirectSound8_GetCaps(dso,0);
179 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
181 ZeroMemory(&dscaps, sizeof(dscaps));
183 /* DSOUND: Error: Invalid caps buffer */
184 rc=IDirectSound8_GetCaps(dso,&dscaps);
185 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
187 dscaps.dwSize=sizeof(dscaps);
189 /* DSOUND: Running on a certified driver */
190 rc=IDirectSound8_GetCaps(dso,&dscaps);
191 ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
193 trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
194 dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
195 dscaps.dwMaxSecondarySampleRate);
198 ref=IDirectSound8_Release(dso);
199 ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref);
202 rc=DirectSoundCreate8(NULL,&dso,NULL);
203 ok(rc==S_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString9(rc));
205 /* Try to Query for objects */
206 rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
207 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
209 IDirectSound8_Release(unknown);
211 rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
212 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
214 IDirectSound_Release(ds);
216 rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
217 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString9(rc));
219 IDirectSound8_Release(ds8);
221 /* DSOUND: Error: Invalid caps buffer */
222 rc=IDirectSound8_GetCaps(dso,0);
223 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
225 ZeroMemory(&dscaps, sizeof(dscaps));
227 /* DSOUND: Error: Invalid caps buffer */
228 rc=IDirectSound8_GetCaps(dso,&dscaps);
229 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
231 dscaps.dwSize=sizeof(dscaps);
233 /* DSOUND: Running on a certified driver */
234 rc=IDirectSound8_GetCaps(dso,&dscaps);
235 ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
237 trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
238 dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
239 dscaps.dwMaxSecondarySampleRate);
242 ref=IDirectSound8_Release(dso);
243 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
247 static HRESULT test_dsound(LPGUID lpGuid)
250 LPDIRECTSOUND dso=NULL;
257 /* DSOUND: Error: Invalid interface buffer */
258 rc=DirectSoundCreate(lpGuid,0,NULL);
259 ok(rc==DSERR_INVALIDPARAM,"DirectSoundCreate should have failed: %s\n",DXGetErrorString9(rc));
261 /* Create the DirectSound object */
262 rc=DirectSoundCreate(lpGuid,&dso,NULL);
263 ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString9(rc));
267 /* Try to Query for objects */
268 rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
269 ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
271 IDirectSound_Release(unknown);
273 rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
274 ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
276 IDirectSound_Release(ds);
278 rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
279 ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) should have failed: %s\n",DXGetErrorString9(rc));
281 IDirectSound8_Release(ds8);
283 /* DSOUND: Error: Invalid caps buffer */
284 rc=IDirectSound_GetCaps(dso,0);
285 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
287 ZeroMemory(&dscaps, sizeof(dscaps));
289 /* DSOUND: Error: Invalid caps buffer */
290 rc=IDirectSound_GetCaps(dso,&dscaps);
291 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
293 dscaps.dwSize=sizeof(dscaps);
295 /* DSOUND: Running on a certified driver */
296 rc=IDirectSound_GetCaps(dso,&dscaps);
297 ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
299 trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
300 dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
301 dscaps.dwMaxSecondarySampleRate);
304 /* Release the DirectSound object */
305 ref=IDirectSound_Release(dso);
306 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
308 return DSERR_GENERIC;
310 /* Create a DirectSound object */
311 rc=DirectSoundCreate(lpGuid,&dso,NULL);
312 ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString9(rc));
314 LPDIRECTSOUND dso1=NULL;
316 /* Create a second DirectSound object */
317 rc=DirectSoundCreate(lpGuid,&dso1,NULL);
318 ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString9(rc));
320 /* Release the second DirectSound object */
321 ref=IDirectSound_Release(dso1);
322 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
323 ok(dso!=dso1,"DirectSound objects should be unique: dso=0x%08lx,dso1=0x%08lx\n",(DWORD)dso,(DWORD)dso1);
326 /* Release the first DirectSound object */
327 ref=IDirectSound_Release(dso);
328 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
330 return DSERR_GENERIC;
334 /* Create a DirectSound object */
335 rc=DirectSoundCreate(lpGuid,&dso,NULL);
336 ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString9(rc));
338 LPDIRECTSOUNDBUFFER secondary;
339 DSBUFFERDESC bufdesc;
342 init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1);
343 ZeroMemory(&bufdesc, sizeof(bufdesc));
344 bufdesc.dwSize=sizeof(bufdesc);
345 bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME;
346 bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
347 bufdesc.lpwfxFormat=&wfx;
348 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
349 ok(rc==DS_OK && secondary!=NULL,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n", rc);
350 if (rc==DS_OK && secondary!=NULL) {
351 /* add some more refs */
352 IDirectSoundBuffer_AddRef(secondary);
354 /* release with buffer */
355 ref=IDirectSound_Release(dso);
356 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
358 return DSERR_GENERIC;
365 static HRESULT test_dsound8(LPGUID lpGuid)
368 LPDIRECTSOUND8 dso=NULL;
375 /* DSOUND: Error: Invalid interface buffer */
376 rc=DirectSoundCreate8(lpGuid,0,NULL);
377 ok(rc==DSERR_INVALIDPARAM,"DirectSoundCreate8 should have failed: %s\n",DXGetErrorString9(rc));
379 /* Create the DirectSound8 object */
380 rc=DirectSoundCreate8(lpGuid,&dso,NULL);
381 ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString9(rc));
385 /* Try to Query for objects */
386 rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
387 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
389 IDirectSound8_Release(unknown);
391 rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
392 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
394 IDirectSound_Release(ds);
396 rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
397 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) failed: %s\n",DXGetErrorString9(rc));
399 IDirectSound8_Release(ds8);
401 /* DSOUND: Error: Invalid caps buffer */
402 rc=IDirectSound8_GetCaps(dso,0);
403 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
405 ZeroMemory(&dscaps, sizeof(dscaps));
407 /* DSOUND: Error: Invalid caps buffer */
408 rc=IDirectSound8_GetCaps(dso,&dscaps);
409 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
411 dscaps.dwSize=sizeof(dscaps);
413 /* DSOUND: Running on a certified driver */
414 rc=IDirectSound8_GetCaps(dso,&dscaps);
415 ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
417 trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
418 dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
419 dscaps.dwMaxSecondarySampleRate);
422 /* Release the DirectSound8 object */
423 ref=IDirectSound8_Release(dso);
424 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
426 return DSERR_GENERIC;
428 /* Create a DirectSound8 object */
429 rc=DirectSoundCreate8(lpGuid,&dso,NULL);
430 ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString9(rc));
432 LPDIRECTSOUND8 dso1=NULL;
434 /* Create a second DirectSound8 object */
435 rc=DirectSoundCreate8(lpGuid,&dso1,NULL);
436 ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString9(rc));
438 /* Release the second DirectSound8 object */
439 ref=IDirectSound8_Release(dso1);
440 ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref);
441 ok(dso!=dso1,"DirectSound8 objects should be unique: dso=0x%08lx,dso1=0x%08lx\n",(DWORD)dso,(DWORD)dso1);
444 /* Release the first DirectSound8 object */
445 ref=IDirectSound8_Release(dso);
446 ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref);
448 return DSERR_GENERIC;
452 /* Create a DirectSound8 object */
453 rc=DirectSoundCreate8(lpGuid,&dso,NULL);
454 ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString9(rc));
456 LPDIRECTSOUNDBUFFER secondary;
457 DSBUFFERDESC bufdesc;
460 init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1);
461 ZeroMemory(&bufdesc, sizeof(bufdesc));
462 bufdesc.dwSize=sizeof(bufdesc);
463 bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRLVOLUME;
464 bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
465 bufdesc.lpwfxFormat=&wfx;
466 rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
467 ok(rc==DS_OK && secondary!=NULL,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n", rc);
468 if (rc==DS_OK && secondary!=NULL) {
469 /* add some more refs */
470 IDirectSoundBuffer8_AddRef(secondary);
472 /* release with buffer */
473 ref=IDirectSound8_Release(dso);
474 ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref);
476 return DSERR_GENERIC;
483 static HRESULT test_primary(LPGUID lpGuid)
486 LPDIRECTSOUND dso=NULL;
487 LPDIRECTSOUNDBUFFER primary=NULL,second=NULL,third=NULL;
488 DSBUFFERDESC bufdesc;
492 /* Create the DirectSound object */
493 rc=DirectSoundCreate(lpGuid,&dso,NULL);
494 ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc);
498 /* Get the device capabilities */
499 ZeroMemory(&dscaps, sizeof(dscaps));
500 dscaps.dwSize=sizeof(dscaps);
501 rc=IDirectSound_GetCaps(dso,&dscaps);
502 ok(rc==DS_OK,"GetCaps failed: 0x%lx\n",rc);
506 /* DSOUND: Error: Invalid buffer description pointer */
507 rc=IDirectSound_CreateSoundBuffer(dso,0,0,NULL);
508 ok(rc==DSERR_INVALIDPARAM,"CreateSoundBuffer should have failed: 0x%lx\n",rc);
510 /* DSOUND: Error: Invalid buffer description pointer */
511 rc=IDirectSound_CreateSoundBuffer(dso,0,&primary,NULL);
512 ok(rc==DSERR_INVALIDPARAM && primary==0,"CreateSoundBuffer should have failed: rc=0x%lx,dsbo=0x%lx\n",rc,(DWORD)primary);
514 /* DSOUND: Error: Invalid buffer description pointer */
515 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,0,NULL);
516 ok(rc==DSERR_INVALIDPARAM && primary==0,"CreateSoundBuffer should have failed: rc=0x%lx,dsbo=0x%lx\n",rc,(DWORD)primary);
518 ZeroMemory(&bufdesc, sizeof(bufdesc));
520 /* DSOUND: Error: Invalid size */
521 /* DSOUND: Error: Invalid buffer description */
522 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
523 ok(rc==DSERR_INVALIDPARAM && primary==0,"CreateSoundBuffer should have failed: rc=0x%lx,primary=0x%lx\n",rc,(DWORD)primary);
525 /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
526 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
527 rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
528 ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc);
532 /* Testing the primary buffer */
534 ZeroMemory(&bufdesc, sizeof(bufdesc));
535 bufdesc.dwSize=sizeof(bufdesc);
536 bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME;
537 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
538 ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a primary buffer: 0x%lx\n",rc);
539 if (rc==DS_OK && primary!=NULL) {
542 /* Try to create a second primary buffer */
543 /* DSOUND: Error: The primary buffer already exists. Any changes made to the buffer description will be ignored. */
544 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&second,NULL);
545 ok(rc==DS_OK && second==primary,"CreateSoundBuffer should have returned original primary buffer: 0x%lx\n",rc);
546 ref=IDirectSoundBuffer_Release(second);
547 ok(ref==1,"IDirectSoundBuffer_Release primary has %d references, should have 1\n",ref);
549 /* Try to duplicate a primary buffer */
550 /* DSOUND: Error: Can't duplicate primary buffers */
551 rc=IDirectSound_DuplicateSoundBuffer(dso,primary,&third);
553 ok(rc!=DS_OK,"IDirectSound_DuplicateSoundBuffer primary buffer should have failed 0x%lx\n",rc);
555 rc=IDirectSoundBuffer_GetVolume(primary,&vol);
556 ok(rc==DS_OK,"GetVolume failed: 0x%lx\n",rc);
558 if (winetest_interactive)
560 trace("Playing a 5 seconds reference tone at the current volume.\n");
562 trace("(the current volume is %ld according to DirectSound)\n",vol);
563 trace("All subsequent tones should be identical to this one.\n");
564 trace("Listen for stutter, changes in pitch, volume, etc.\n");
566 test_buffer(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive && !(dscaps.dwFlags & DSCAPS_EMULDRIVER),5.0,0,0,0,0);
568 ref=IDirectSoundBuffer_Release(primary);
569 ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref);
572 /* Set the CooperativeLevel back to normal */
573 /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
574 rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
575 ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc);
578 ref=IDirectSound_Release(dso);
579 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
581 return DSERR_GENERIC;
586 static HRESULT test_secondary(LPGUID lpGuid)
589 LPDIRECTSOUND dso=NULL;
590 LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
591 DSBUFFERDESC bufdesc;
596 /* Create the DirectSound object */
597 rc=DirectSoundCreate(lpGuid,&dso,NULL);
598 ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc);
602 /* Get the device capabilities */
603 ZeroMemory(&dscaps, sizeof(dscaps));
604 dscaps.dwSize=sizeof(dscaps);
605 rc=IDirectSound_GetCaps(dso,&dscaps);
606 ok(rc==DS_OK,"GetCaps failed: 0x%lx\n",rc);
610 /* We must call SetCooperativeLevel before creating primary buffer */
611 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
612 rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
613 ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc);
617 ZeroMemory(&bufdesc, sizeof(bufdesc));
618 bufdesc.dwSize=sizeof(bufdesc);
619 bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
620 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
621 ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a primary buffer 0x%lx\n", rc);
623 if (rc==DS_OK && primary!=NULL) {
624 for (f=0;f<NB_FORMATS;f++) {
625 init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],formats[f][2]);
627 ZeroMemory(&bufdesc, sizeof(bufdesc));
628 bufdesc.dwSize=sizeof(bufdesc);
629 bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
630 bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
631 bufdesc.lpwfxFormat=&wfx;
632 trace(" Testing a secondary buffer at %ldx%dx%d\n",
633 wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
634 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
635 ok(rc==DS_OK && secondary!=NULL,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n",rc);
637 if (rc==DS_OK && secondary!=NULL) {
638 test_buffer(dso,secondary,0,FALSE,0,FALSE,0,winetest_interactive,1.0,0,NULL,0,0);
640 ref=IDirectSoundBuffer_Release(secondary);
641 ok(ref==0,"IDirectSoundBuffer_Release has %d references, should have 0\n",ref);
645 ref=IDirectSoundBuffer_Release(primary);
646 ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref);
649 /* Set the CooperativeLevel back to normal */
650 /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
651 rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
652 ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc);
655 ref=IDirectSound_Release(dso);
656 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
658 return DSERR_GENERIC;
663 static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
664 LPCSTR lpcstrModule, LPVOID lpContext)
666 trace("*** Testing %s - %s\n",lpcstrDescription,lpcstrModule);
668 test_dsound8(lpGuid);
669 test_primary(lpGuid);
670 test_secondary(lpGuid);
675 static void dsound_tests()
678 rc=DirectSoundEnumerateA(&dsenum_callback,NULL);
679 ok(rc==DS_OK,"DirectSoundEnumerate failed: %ld\n",rc);
686 dsound_dsound_tests();
687 dsound_dsound8_tests();