Call IDirectSound::Initialize() as per MSDN before using the
[wine.git] / dlls / dsound / tests / dsound.c
blob97906e85ec3a50ffd257b00658cb406c64bd469e
1 /*
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
30 #include <windows.h>
32 #include <math.h>
33 #include <stdlib.h>
35 #include "wine/test.h"
36 #include "windef.h"
37 #include "wingdi.h"
38 #include "dsound.h"
39 #include "dxerr9.h"
41 #include "dsound_test.h"
43 static void dsound_dsound_tests()
45 HRESULT rc;
46 LPDIRECTSOUND dso=NULL;
47 DSCAPS dscaps;
48 int ref;
49 IUnknown * unknown;
50 IDirectSound * ds;
51 IDirectSound8 * ds8;
53 rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound, (void**)&dso);
54 ok(rc==S_OK,"CoCreateInstance failed: %s\n",DXGetErrorString9(rc));
55 if (dso) {
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));
59 if (rc==DS_OK)
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));
64 if (rc==DS_OK)
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));
69 if (rc==DS_OK)
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));
90 if (rc==DS_OK) {
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));
102 if (dso) {
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));
106 if (rc==DS_OK)
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));
111 if (rc==DS_OK)
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));
116 if (rc==DS_OK)
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));
134 if (rc==DS_OK) {
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()
147 HRESULT rc;
148 LPDIRECTSOUND8 dso=NULL;
149 DSCAPS dscaps;
150 int ref;
151 IUnknown * unknown;
152 IDirectSound * ds;
153 IDirectSound8 * ds8;
155 rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound8, (void**)&dso);
156 ok(rc==S_OK,"CoCreateInstance failed: %s\n",DXGetErrorString9(rc));
157 if (dso) {
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));
161 if (rc==DS_OK)
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));
166 if (rc==DS_OK)
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));
171 if (rc==DS_OK)
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));
192 if (rc==DS_OK) {
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));
204 if (dso) {
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));
208 if (rc==DS_OK)
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));
213 if (rc==DS_OK)
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));
218 if (rc==DS_OK)
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));
236 if (rc==DS_OK) {
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)
249 HRESULT rc;
250 LPDIRECTSOUND dso=NULL;
251 DSCAPS dscaps;
252 int ref;
253 IUnknown * unknown;
254 IDirectSound * ds;
255 IDirectSound8 * ds8;
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));
264 if (rc!=DS_OK)
265 return 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));
270 if (rc==DS_OK)
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));
275 if (rc==DS_OK)
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));
280 if (rc==DS_OK)
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));
298 if (rc==DS_OK) {
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);
307 if (ref!=0)
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));
313 if (rc==DS_OK) {
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));
319 if (rc==DS_OK) {
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);
329 if (ref!=0)
330 return DSERR_GENERIC;
331 } else
332 return rc;
334 /* Create a DirectSound object */
335 rc=DirectSoundCreate(lpGuid,&dso,NULL);
336 ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString9(rc));
337 if (rc==DS_OK) {
338 LPDIRECTSOUNDBUFFER secondary;
339 DSBUFFERDESC bufdesc;
340 WAVEFORMATEX wfx;
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;
346 bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
347 bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
348 bufdesc.lpwfxFormat=&wfx;
349 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
350 ok(rc==DS_OK && secondary!=NULL,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n", rc);
351 if (rc==DS_OK && secondary!=NULL) {
352 LPDIRECTSOUND3DBUFFER buffer3d;
353 rc=IDirectSound_QueryInterface(secondary, &IID_IDirectSound3DBuffer, (void **)&buffer3d);
354 ok(rc==DS_OK && buffer3d!=NULL,"QueryInterface failed: %s\n",DXGetErrorString9(rc));
355 /* add some more refs */
356 IDirectSound3DBuffer_AddRef(buffer3d);
357 IDirectSoundBuffer_AddRef(secondary);
359 /* release with buffer */
360 ref=IDirectSound_Release(dso);
361 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
362 if (ref!=0)
363 return DSERR_GENERIC;
364 } else
365 return rc;
367 return DS_OK;
370 static HRESULT test_dsound8(LPGUID lpGuid)
372 HRESULT rc;
373 LPDIRECTSOUND8 dso=NULL;
374 DSCAPS dscaps;
375 int ref;
376 IUnknown * unknown;
377 IDirectSound * ds;
378 IDirectSound8 * ds8;
380 /* DSOUND: Error: Invalid interface buffer */
381 rc=DirectSoundCreate8(lpGuid,0,NULL);
382 ok(rc==DSERR_INVALIDPARAM,"DirectSoundCreate8 should have failed: %s\n",DXGetErrorString9(rc));
384 /* Create the DirectSound8 object */
385 rc=DirectSoundCreate8(lpGuid,&dso,NULL);
386 ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString9(rc));
387 if (rc!=DS_OK)
388 return rc;
390 /* Try to Query for objects */
391 rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
392 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",DXGetErrorString9(rc));
393 if (rc==DS_OK)
394 IDirectSound8_Release(unknown);
396 rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
397 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",DXGetErrorString9(rc));
398 if (rc==DS_OK)
399 IDirectSound_Release(ds);
401 rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
402 ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) failed: %s\n",DXGetErrorString9(rc));
403 if (rc==DS_OK)
404 IDirectSound8_Release(ds8);
406 /* DSOUND: Error: Invalid caps buffer */
407 rc=IDirectSound8_GetCaps(dso,0);
408 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
410 ZeroMemory(&dscaps, sizeof(dscaps));
412 /* DSOUND: Error: Invalid caps buffer */
413 rc=IDirectSound8_GetCaps(dso,&dscaps);
414 ok(rc==DSERR_INVALIDPARAM,"GetCaps should have failed: %s\n",DXGetErrorString9(rc));
416 dscaps.dwSize=sizeof(dscaps);
418 /* DSOUND: Running on a certified driver */
419 rc=IDirectSound8_GetCaps(dso,&dscaps);
420 ok(rc==DS_OK,"GetCaps failed: %s\n",DXGetErrorString9(rc));
421 if (rc==DS_OK) {
422 trace(" DirectSound Caps: flags=0x%08lx secondary min=%ld max=%ld\n",
423 dscaps.dwFlags,dscaps.dwMinSecondarySampleRate,
424 dscaps.dwMaxSecondarySampleRate);
427 /* Release the DirectSound8 object */
428 ref=IDirectSound8_Release(dso);
429 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
430 if (ref!=0)
431 return DSERR_GENERIC;
433 /* Create a DirectSound8 object */
434 rc=DirectSoundCreate8(lpGuid,&dso,NULL);
435 ok(rc==DS_OK,"DirectSoundCreate failed: %s\n",DXGetErrorString9(rc));
436 if (rc==DS_OK) {
437 LPDIRECTSOUND8 dso1=NULL;
439 /* Create a second DirectSound8 object */
440 rc=DirectSoundCreate8(lpGuid,&dso1,NULL);
441 ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString9(rc));
442 if (rc==DS_OK) {
443 /* Release the second DirectSound8 object */
444 ref=IDirectSound8_Release(dso1);
445 ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref);
446 ok(dso!=dso1,"DirectSound8 objects should be unique: dso=0x%08lx,dso1=0x%08lx\n",(DWORD)dso,(DWORD)dso1);
449 /* Release the first DirectSound8 object */
450 ref=IDirectSound8_Release(dso);
451 ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref);
452 if (ref!=0)
453 return DSERR_GENERIC;
454 } else
455 return rc;
457 /* Create a DirectSound8 object */
458 rc=DirectSoundCreate8(lpGuid,&dso,NULL);
459 ok(rc==DS_OK,"DirectSoundCreate8 failed: %s\n",DXGetErrorString9(rc));
460 if (rc==DS_OK) {
461 LPDIRECTSOUNDBUFFER secondary;
462 DSBUFFERDESC bufdesc;
463 WAVEFORMATEX wfx;
465 init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1);
466 ZeroMemory(&bufdesc, sizeof(bufdesc));
467 bufdesc.dwSize=sizeof(bufdesc);
468 bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
469 bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
470 bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
471 bufdesc.lpwfxFormat=&wfx;
472 rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
473 ok(rc==DS_OK && secondary!=NULL,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n", rc);
474 if (rc==DS_OK && secondary!=NULL) {
475 LPDIRECTSOUND3DBUFFER buffer3d;
476 rc=IDirectSound8_QueryInterface(secondary, &IID_IDirectSound3DBuffer, (void **)&buffer3d);
477 ok(rc==DS_OK && buffer3d!=NULL,"QueryInterface failed: %s\n",DXGetErrorString9(rc));
478 /* add some more refs */
479 IDirectSound3DBuffer_AddRef(buffer3d);
480 IDirectSoundBuffer8_AddRef(secondary);
482 /* release with buffer */
483 ref=IDirectSound8_Release(dso);
484 ok(ref==0,"IDirectSound8_Release has %d references, should have 0\n",ref);
485 if (ref!=0)
486 return DSERR_GENERIC;
487 } else
488 return rc;
490 return DS_OK;
493 static HRESULT test_primary(LPGUID lpGuid)
495 HRESULT rc;
496 LPDIRECTSOUND dso=NULL;
497 LPDIRECTSOUNDBUFFER primary=NULL,second=NULL,third=NULL;
498 DSBUFFERDESC bufdesc;
499 DSCAPS dscaps;
500 int ref;
502 /* Create the DirectSound object */
503 rc=DirectSoundCreate(lpGuid,&dso,NULL);
504 ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc);
505 if (rc!=DS_OK)
506 return rc;
508 /* Get the device capabilities */
509 ZeroMemory(&dscaps, sizeof(dscaps));
510 dscaps.dwSize=sizeof(dscaps);
511 rc=IDirectSound_GetCaps(dso,&dscaps);
512 ok(rc==DS_OK,"GetCaps failed: 0x%lx\n",rc);
513 if (rc!=DS_OK)
514 goto EXIT;
516 /* DSOUND: Error: Invalid buffer description pointer */
517 rc=IDirectSound_CreateSoundBuffer(dso,0,0,NULL);
518 ok(rc==DSERR_INVALIDPARAM,"CreateSoundBuffer should have failed: 0x%lx\n",rc);
520 /* DSOUND: Error: Invalid buffer description pointer */
521 rc=IDirectSound_CreateSoundBuffer(dso,0,&primary,NULL);
522 ok(rc==DSERR_INVALIDPARAM && primary==0,"CreateSoundBuffer should have failed: rc=0x%lx,dsbo=0x%lx\n",rc,(DWORD)primary);
524 /* DSOUND: Error: Invalid buffer description pointer */
525 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,0,NULL);
526 ok(rc==DSERR_INVALIDPARAM && primary==0,"CreateSoundBuffer should have failed: rc=0x%lx,dsbo=0x%lx\n",rc,(DWORD)primary);
528 ZeroMemory(&bufdesc, sizeof(bufdesc));
530 /* DSOUND: Error: Invalid size */
531 /* DSOUND: Error: Invalid buffer description */
532 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
533 ok(rc==DSERR_INVALIDPARAM && primary==0,"CreateSoundBuffer should have failed: rc=0x%lx,primary=0x%lx\n",rc,(DWORD)primary);
535 /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
536 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
537 rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
538 ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc);
539 if (rc!=DS_OK)
540 goto EXIT;
542 /* Testing the primary buffer */
543 primary=NULL;
544 ZeroMemory(&bufdesc, sizeof(bufdesc));
545 bufdesc.dwSize=sizeof(bufdesc);
546 bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
547 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
548 ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a primary buffer: 0x%lx\n",rc);
549 if (rc==DS_OK && primary!=NULL) {
550 /* Try to create a second primary buffer */
551 /* DSOUND: Error: The primary buffer already exists. Any changes made to the buffer description will be ignored. */
552 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&second,NULL);
553 ok(rc==DS_OK && second==primary,"CreateSoundBuffer should have returned original primary buffer: 0x%lx\n",rc);
554 ref=IDirectSoundBuffer_Release(second);
555 ok(ref==1,"IDirectSoundBuffer_Release primary has %d references, should have 1\n",ref);
557 /* Try to duplicate a primary buffer */
558 /* DSOUND: Error: Can't duplicate primary buffers */
559 rc=IDirectSound_DuplicateSoundBuffer(dso,primary,&third);
560 /* rc=0x88780032 */
561 ok(rc!=DS_OK,"IDirectSound_DuplicateSoundBuffer primary buffer should have failed 0x%lx\n",rc);
563 if (winetest_interactive)
565 trace("Playing a 5 seconds reference tone.\n");
566 trace("All subsequent tones should be identical to this one.\n");
567 trace("Listen for stutter, changes in pitch, volume, etc.\n");
569 test_buffer(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive && !(dscaps.dwFlags & DSCAPS_EMULDRIVER),5.0,0,0,0,0);
571 ref=IDirectSoundBuffer_Release(primary);
572 ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref);
575 /* Set the CooperativeLevel back to normal */
576 /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
577 rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
578 ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%lx\n",rc);
580 EXIT:
581 ref=IDirectSound_Release(dso);
582 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
583 if (ref!=0)
584 return DSERR_GENERIC;
586 return rc;
589 static HRESULT test_secondary(LPGUID lpGuid)
591 HRESULT rc;
592 LPDIRECTSOUND dso=NULL;
593 LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
594 DSBUFFERDESC bufdesc;
595 DSCAPS dscaps;
596 WAVEFORMATEX wfx;
597 int f,ref;
599 /* Create the DirectSound object */
600 rc=DirectSoundCreate(lpGuid,&dso,NULL);
601 ok(rc==DS_OK,"DirectSoundCreate failed: 0x%lx\n",rc);
602 if (rc!=DS_OK)
603 return rc;
605 /* Get the device capabilities */
606 ZeroMemory(&dscaps, sizeof(dscaps));
607 dscaps.dwSize=sizeof(dscaps);
608 rc=IDirectSound_GetCaps(dso,&dscaps);
609 ok(rc==DS_OK,"GetCaps failed: 0x%lx\n",rc);
610 if (rc!=DS_OK)
611 goto EXIT;
613 /* We must call SetCooperativeLevel before creating primary buffer */
614 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
615 rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
616 ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc);
617 if (rc!=DS_OK)
618 goto EXIT;
620 ZeroMemory(&bufdesc, sizeof(bufdesc));
621 bufdesc.dwSize=sizeof(bufdesc);
622 bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
623 bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
624 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
625 ok(rc==DS_OK && primary!=NULL,"CreateSoundBuffer failed to create a primary buffer 0x%lx\n", rc);
627 if (rc==DS_OK && primary!=NULL) {
628 for (f=0;f<NB_FORMATS;f++) {
629 init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],formats[f][2]);
630 secondary=NULL;
631 ZeroMemory(&bufdesc, sizeof(bufdesc));
632 bufdesc.dwSize=sizeof(bufdesc);
633 bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
634 bufdesc.dwFlags|=(DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
635 bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec*BUFFER_LEN/1000;
636 bufdesc.lpwfxFormat=&wfx;
637 trace(" Testing a secondary buffer at %ldx%dx%d\n",
638 wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
639 rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
640 ok(rc==DS_OK && secondary!=NULL,"CreateSoundBuffer failed to create a secondary buffer 0x%lx\n",rc);
642 if (rc==DS_OK && secondary!=NULL) {
643 test_buffer(dso,secondary,0,FALSE,0,FALSE,0,winetest_interactive,1.0,0,NULL,0,0);
645 ref=IDirectSoundBuffer_Release(secondary);
646 ok(ref==0,"IDirectSoundBuffer_Release has %d references, should have 0\n",ref);
650 ref=IDirectSoundBuffer_Release(primary);
651 ok(ref==0,"IDirectSoundBuffer_Release primary has %d references, should have 0\n",ref);
654 /* Set the CooperativeLevel back to normal */
655 /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
656 rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
657 ok(rc==DS_OK,"SetCooperativeLevel failed: 0x%0lx\n",rc);
659 EXIT:
660 ref=IDirectSound_Release(dso);
661 ok(ref==0,"IDirectSound_Release has %d references, should have 0\n",ref);
662 if (ref!=0)
663 return DSERR_GENERIC;
665 return rc;
668 static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
669 LPCSTR lpcstrModule, LPVOID lpContext)
671 trace("*** Testing %s - %s\n",lpcstrDescription,lpcstrModule);
672 test_dsound(lpGuid);
673 test_dsound8(lpGuid);
674 test_primary(lpGuid);
675 test_secondary(lpGuid);
677 return 1;
680 static void dsound_tests()
682 HRESULT rc;
683 rc=DirectSoundEnumerateA(&dsenum_callback,NULL);
684 ok(rc==DS_OK,"DirectSoundEnumerate failed: %ld\n",rc);
687 START_TEST(dsound)
689 CoInitialize(NULL);
691 dsound_dsound_tests();
692 dsound_dsound8_tests();
693 dsound_tests();