2 * Tests the panning and 3D functions of DirectSound
4 * Part of this test involves playing test tones. But this only makes
5 * sense if someone is going to carefully listen to it, and would only
6 * bother everyone else.
7 * So this is only done if the test is being run in interactive mode.
9 * Copyright (c) 2002-2004 Francois Gouget
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #define NONAMELESSSTRUCT
27 #define NONAMELESSUNION
32 #include "wine/test.h"
36 #include "dsound_test.h"
38 static HRESULT (WINAPI
*pDirectSoundCreate8
)(LPCGUID
,LPDIRECTSOUND8
*,LPUNKNOWN
)=NULL
;
44 LPDIRECTSOUNDBUFFER dsbo
;
52 static int buffer_refill8(play_state_t
* state
, DWORD size
)
58 if (size
>state
->wave_len
-state
->written
)
59 size
=state
->wave_len
-state
->written
;
61 rc
=IDirectSoundBuffer_Lock(state
->dsbo
,state
->offset
,size
,
62 &ptr1
,&len1
,&ptr2
,&len2
,0);
63 ok(rc
==DS_OK
,"IDirectSoundBuffer_Lock() failed: %s\n",
64 DXGetErrorString8(rc
));
68 memcpy(ptr1
,state
->wave
+state
->written
,len1
);
71 memcpy(ptr2
,state
->wave
+state
->written
,len2
);
74 state
->offset
=state
->written
% state
->buffer_size
;
75 rc
=IDirectSoundBuffer_Unlock(state
->dsbo
,ptr1
,len1
,ptr2
,len2
);
76 ok(rc
==DS_OK
,"IDirectSoundBuffer_Unlock() failed: %s\n",
77 DXGetErrorString8(rc
));
83 static int buffer_silence8(play_state_t
* state
, DWORD size
)
90 rc
=IDirectSoundBuffer_Lock(state
->dsbo
,state
->offset
,size
,
91 &ptr1
,&len1
,&ptr2
,&len2
,0);
92 ok(rc
==DS_OK
,"IDirectSoundBuffer_Lock() failed: %s\n",
93 DXGetErrorString8(rc
));
97 s
=(state
->wfx
->wBitsPerSample
==8?0x80:0);
102 state
->offset
=(state
->offset
+size
) % state
->buffer_size
;
103 rc
=IDirectSoundBuffer_Unlock(state
->dsbo
,ptr1
,len1
,ptr2
,len2
);
104 ok(rc
==DS_OK
,"IDirectSoundBuffer_Unlock() failed: %s\n",
105 DXGetErrorString8(rc
));
111 static int buffer_service8(play_state_t
* state
)
113 DWORD last_play_pos
,play_pos
,buf_free
;
116 rc
=IDirectSoundBuffer_GetCurrentPosition(state
->dsbo
,&play_pos
,NULL
);
117 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetCurrentPosition() failed: %s\n",
118 DXGetErrorString8(rc
));
123 /* Update the amount played */
124 last_play_pos
=state
->played
% state
->buffer_size
;
125 if (play_pos
<last_play_pos
)
126 state
->played
+=state
->buffer_size
-last_play_pos
+play_pos
;
128 state
->played
+=play_pos
-last_play_pos
;
130 if (winetest_debug
> 1)
131 trace("buf size=%ld last_play_pos=%ld play_pos=%ld played=%ld / %ld\n",
132 state
->buffer_size
,last_play_pos
,play_pos
,state
->played
,
135 if (state
->played
>state
->wave_len
)
137 /* Everything has been played */
141 /* Refill the buffer */
142 if (state
->offset
<=play_pos
)
143 buf_free
=play_pos
-state
->offset
;
145 buf_free
=state
->buffer_size
-state
->offset
+play_pos
;
147 if (winetest_debug
> 1)
148 trace("offset=%ld free=%ld written=%ld / %ld\n",
149 state
->offset
,buf_free
,state
->written
,state
->wave_len
);
153 if (state
->written
<state
->wave_len
)
155 int w
=buffer_refill8(state
,buf_free
);
159 if (state
->written
==state
->wave_len
&& winetest_debug
> 1)
160 trace("last sound byte at %ld\n",
161 (state
->written
% state
->buffer_size
));
165 /* Fill with silence */
166 if (winetest_debug
> 1)
167 trace("writing %ld bytes of silence\n",buf_free
);
168 if (buffer_silence8(state
,buf_free
)==-1)
174 if (winetest_debug
> 1)
175 trace("stopping playback\n");
176 rc
=IDirectSoundBuffer_Stop(state
->dsbo
);
177 ok(rc
==DS_OK
,"IDirectSoundBuffer_Stop() failed: %s\n",
178 DXGetErrorString8(rc
));
182 void test_buffer8(LPDIRECTSOUND8 dso
, LPDIRECTSOUNDBUFFER dsbo
,
183 BOOL is_primary
, BOOL set_volume
, LONG volume
,
184 BOOL set_pan
, LONG pan
, BOOL play
, double duration
,
185 BOOL buffer3d
, LPDIRECTSOUND3DLISTENER listener
,
186 BOOL move_listener
, BOOL move_sound
)
190 WAVEFORMATEX wfx
,wfx2
;
191 DWORD size
,status
,freq
;
194 /* DSOUND: Error: Invalid caps pointer */
195 rc
=IDirectSoundBuffer_GetCaps(dsbo
,0);
196 ok(rc
==DSERR_INVALIDPARAM
,"IDirectSoundBuffer_GetCaps() should have "
197 "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc
));
199 ZeroMemory(&dsbcaps
, sizeof(dsbcaps
));
201 /* DSOUND: Error: Invalid caps pointer */
202 rc
=IDirectSoundBuffer_GetCaps(dsbo
,&dsbcaps
);
203 ok(rc
==DSERR_INVALIDPARAM
,"IDirectSoundBuffer_GetCaps() should have "
204 "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc
));
206 dsbcaps
.dwSize
=sizeof(dsbcaps
);
207 rc
=IDirectSoundBuffer_GetCaps(dsbo
,&dsbcaps
);
208 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetCaps() failed: %s\n",
209 DXGetErrorString8(rc
));
210 if (rc
==DS_OK
&& winetest_debug
> 1) {
211 trace(" Caps: flags=0x%08lx size=%ld\n",dsbcaps
.dwFlags
,
212 dsbcaps
.dwBufferBytes
);
215 /* Query the format size. Note that it may not match sizeof(wfx) */
217 rc
=IDirectSoundBuffer_GetFormat(dsbo
,NULL
,0,&size
);
218 ok(rc
==DS_OK
&& size
!=0,"IDirectSoundBuffer_GetFormat() should have "
219 "returned the needed size: rc=%s size=%ld\n",DXGetErrorString8(rc
),size
);
221 rc
=IDirectSoundBuffer_GetFormat(dsbo
,&wfx
,sizeof(wfx
),NULL
);
222 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetFormat() failed: %s\n",
223 DXGetErrorString8(rc
));
224 if (rc
==DS_OK
&& winetest_debug
> 1) {
225 trace(" Format: %s tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
226 is_primary
? "Primary" : "Secondary",
227 wfx
.wFormatTag
,wfx
.nSamplesPerSec
,wfx
.wBitsPerSample
,
228 wfx
.nChannels
,wfx
.nAvgBytesPerSec
,wfx
.nBlockAlign
);
231 /* DSOUND: Error: Invalid frequency buffer */
232 rc
=IDirectSoundBuffer_GetFrequency(dsbo
,0);
233 ok(rc
==DSERR_INVALIDPARAM
,"IDirectSoundBuffer_GetFrequency() should have "
234 "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc
));
236 /* DSOUND: Error: Primary buffers don't support CTRLFREQUENCY */
237 rc
=IDirectSoundBuffer_GetFrequency(dsbo
,&freq
);
238 ok((rc
==DS_OK
&& !is_primary
) || (rc
==DSERR_CONTROLUNAVAIL
&&is_primary
) ||
239 (rc
==DSERR_CONTROLUNAVAIL
&&!(dsbcaps
.dwFlags
&DSBCAPS_CTRLFREQUENCY
)),
240 "IDirectSoundBuffer_GetFrequency() failed: %s\n",DXGetErrorString8(rc
));
242 ok(freq
==wfx
.nSamplesPerSec
,"The frequency returned by GetFrequency "
243 "%ld does not match the format %ld\n",freq
,wfx
.nSamplesPerSec
);
246 /* DSOUND: Error: Invalid status pointer */
247 rc
=IDirectSoundBuffer_GetStatus(dsbo
,0);
248 ok(rc
==DSERR_INVALIDPARAM
,"IDirectSoundBuffer_GetStatus() should have "
249 "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc
));
251 rc
=IDirectSoundBuffer_GetStatus(dsbo
,&status
);
252 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetStatus() failed: %s\n",
253 DXGetErrorString8(rc
));
254 ok(status
==0,"status=0x%lx instead of 0\n",status
);
257 /* We must call SetCooperativeLevel to be allowed to call SetFormat */
258 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
259 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_PRIORITY
);
260 ok(rc
==DS_OK
,"IDirectSound8_SetCooperativeLevel(DSSCL_PRIORITY) "
261 "failed: %s\n",DXGetErrorString8(rc
));
265 /* DSOUND: Error: Invalid format pointer */
266 rc
=IDirectSoundBuffer_SetFormat(dsbo
,0);
267 ok(rc
==DSERR_INVALIDPARAM
,"IDirectSoundBuffer_SetFormat() should have "
268 "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc
));
270 init_format(&wfx2
,WAVE_FORMAT_PCM
,11025,16,2);
271 rc
=IDirectSoundBuffer_SetFormat(dsbo
,&wfx2
);
272 ok(rc
==DS_OK
,"IDirectSoundBuffer_SetFormat() failed: %s\n",
273 DXGetErrorString8(rc
));
275 /* There is no garantee that SetFormat will actually change the
276 * format to what we asked for. It depends on what the soundcard
277 * supports. So we must re-query the format.
279 rc
=IDirectSoundBuffer_GetFormat(dsbo
,&wfx
,sizeof(wfx
),NULL
);
280 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetFormat() failed: %s\n",
281 DXGetErrorString8(rc
));
283 (wfx
.wFormatTag
!=wfx2
.wFormatTag
||
284 wfx
.nSamplesPerSec
!=wfx2
.nSamplesPerSec
||
285 wfx
.wBitsPerSample
!=wfx2
.wBitsPerSample
||
286 wfx
.nChannels
!=wfx2
.nChannels
)) {
287 trace("Requested format tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
288 wfx2
.wFormatTag
,wfx2
.nSamplesPerSec
,wfx2
.wBitsPerSample
,
289 wfx2
.nChannels
,wfx2
.nAvgBytesPerSec
,wfx2
.nBlockAlign
);
290 trace("Got tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
291 wfx
.wFormatTag
,wfx
.nSamplesPerSec
,wfx
.wBitsPerSample
,
292 wfx
.nChannels
,wfx
.nAvgBytesPerSec
,wfx
.nBlockAlign
);
295 /* Set the CooperativeLevel back to normal */
296 /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
297 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_NORMAL
);
298 ok(rc
==DS_OK
,"IDirectSound8_SetCooperativeLevel(DSSCL_NORMAL) "
299 "failed: %s\n",DXGetErrorString8(rc
));
304 DS3DLISTENER listener_param
;
305 LPDIRECTSOUND3DBUFFER buffer
=NULL
;
306 DS3DBUFFER buffer_param
;
307 DWORD start_time
,now
;
309 if (winetest_interactive
) {
310 trace(" Playing %g second 440Hz tone at %ldx%dx%d\n", duration
,
311 wfx
.nSamplesPerSec
, wfx
.wBitsPerSample
,wfx
.nChannels
);
315 /* We must call SetCooperativeLevel to be allowed to call Lock */
316 /* DSOUND: Setting DirectSound cooperative level to
317 * DSSCL_WRITEPRIMARY */
318 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),
321 "IDirectSound8_SetCooperativeLevel(DSSCL_WRITEPRIMARY) failed: "
322 "%s\n",DXGetErrorString8(rc
));
327 LPDIRECTSOUNDBUFFER temp_buffer
;
329 rc
=IDirectSoundBuffer_QueryInterface(dsbo
,&IID_IDirectSound3DBuffer
,
331 ok(rc
==DS_OK
,"IDirectSoundBuffer_QueryInterface() failed: %s\n",
332 DXGetErrorString8(rc
));
336 /* check the COM interface */
337 rc
=IDirectSoundBuffer_QueryInterface(dsbo
, &IID_IDirectSoundBuffer
,
338 (LPVOID
*)&temp_buffer
);
339 ok(rc
==DS_OK
&& temp_buffer
!=NULL
,
340 "IDirectSoundBuffer_QueryInterface() failed: %s\n",
341 DXGetErrorString8(rc
));
342 ok(temp_buffer
==dsbo
,"COM interface broken: 0x%08lx != 0x%08lx\n",
343 (DWORD
)temp_buffer
,(DWORD
)dsbo
);
344 ref
=IDirectSoundBuffer_Release(temp_buffer
);
345 ok(ref
==1,"IDirectSoundBuffer_Release() has %d references, "
346 "should have 1\n",ref
);
349 rc
=IDirectSound3DBuffer_QueryInterface(dsbo
, &IID_IDirectSoundBuffer
,
350 (LPVOID
*)&temp_buffer
);
351 ok(rc
==DS_OK
&& temp_buffer
!=NULL
,
352 "IDirectSound3DBuffer_QueryInterface() failed: %s\n",
353 DXGetErrorString8(rc
));
354 ok(temp_buffer
==dsbo
,"COM interface broken: 0x%08lx != 0x%08lx\n",
355 (DWORD
)temp_buffer
,(DWORD
)dsbo
);
356 ref
=IDirectSoundBuffer_Release(temp_buffer
);
357 ok(ref
==1,"IDirectSoundBuffer_Release() has %d references, "
358 "should have 1\n",ref
);
361 /* FIXME: this works on windows */
362 ref
=IDirectSoundBuffer_Release(dsbo
);
363 ok(ref
==0,"IDirectSoundBuffer_Release() has %d references, "
364 "should have 0\n",ref
);
366 rc
=IDirectSound3DBuffer_QueryInterface(buffer
,
367 &IID_IDirectSoundBuffer
,
369 ok(rc
==DS_OK
&& dsbo
!=NULL
,"IDirectSound3DBuffer_QueryInterface() "
370 "failed: %s\n",DXGetErrorString8(rc
),
373 /* DSOUND: Error: Invalid buffer */
374 rc
=IDirectSound3DBuffer_GetAllParameters(buffer
,0);
375 ok(rc
==DSERR_INVALIDPARAM
,"IDirectSound3DBuffer_GetAllParameters() "
376 "failed: %s\n",DXGetErrorString8(rc
));
378 ZeroMemory(&buffer_param
, sizeof(buffer_param
));
380 /* DSOUND: Error: Invalid buffer */
381 rc
=IDirectSound3DBuffer_GetAllParameters(buffer
,&buffer_param
);
382 ok(rc
==DSERR_INVALIDPARAM
,"IDirectSound3DBuffer_GetAllParameters() "
383 "failed: %s\n",DXGetErrorString8(rc
));
385 buffer_param
.dwSize
=sizeof(buffer_param
);
386 rc
=IDirectSound3DBuffer_GetAllParameters(buffer
,&buffer_param
);
387 ok(rc
==DS_OK
,"IDirectSound3DBuffer_GetAllParameters() failed: %s\n",
388 DXGetErrorString8(rc
));
391 if (dsbcaps
.dwFlags
& DSBCAPS_CTRLVOLUME
) {
393 rc
=IDirectSoundBuffer_GetVolume(dsbo
,&val
);
394 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetVolume() failed: %s\n",
395 DXGetErrorString8(rc
));
397 rc
=IDirectSoundBuffer_SetVolume(dsbo
,volume
);
398 ok(rc
==DS_OK
,"IDirectSoundBuffer_SetVolume() failed: %s\n",
399 DXGetErrorString8(rc
));
401 /* DSOUND: Error: Buffer does not have CTRLVOLUME */
402 rc
=IDirectSoundBuffer_GetVolume(dsbo
,&volume
);
403 ok(rc
==DSERR_CONTROLUNAVAIL
,"IDirectSoundBuffer_GetVolume() "
404 "should have returned DSERR_CONTROLUNAVAIL, returned: %s\n",
405 DXGetErrorString8(rc
));
410 if (dsbcaps
.dwFlags
& DSBCAPS_CTRLPAN
) {
412 rc
=IDirectSoundBuffer_GetPan(dsbo
,&val
);
413 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetPan() failed: %s\n",
414 DXGetErrorString8(rc
));
416 rc
=IDirectSoundBuffer_SetPan(dsbo
,pan
);
417 ok(rc
==DS_OK
,"IDirectSoundBuffer_SetPan() failed: %s\n",
418 DXGetErrorString8(rc
));
420 /* DSOUND: Error: Buffer does not have CTRLPAN */
421 rc
=IDirectSoundBuffer_GetPan(dsbo
,&pan
);
422 ok(rc
==DSERR_CONTROLUNAVAIL
,"IDirectSoundBuffer_GetPan() "
423 "should have returned DSERR_CONTROLUNAVAIL, returned: %s\n",
424 DXGetErrorString8(rc
));
428 state
.wave
=wave_generate_la(&wfx
,duration
,&state
.wave_len
);
432 state
.buffer_size
=dsbcaps
.dwBufferBytes
;
433 state
.played
=state
.written
=state
.offset
=0;
434 buffer_refill8(&state
,state
.buffer_size
);
436 rc
=IDirectSoundBuffer_Play(dsbo
,0,0,DSBPLAY_LOOPING
);
437 ok(rc
==DS_OK
,"IDirectSoundBuffer_Play() failed: %s\n",
438 DXGetErrorString8(rc
));
440 rc
=IDirectSoundBuffer_GetStatus(dsbo
,&status
);
441 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetStatus() failed: %s\n",
442 DXGetErrorString8(rc
));
443 ok(status
==(DSBSTATUS_PLAYING
|DSBSTATUS_LOOPING
),
444 "GetStatus: bad status: %lx\n",status
);
447 ZeroMemory(&listener_param
,sizeof(listener_param
));
448 listener_param
.dwSize
=sizeof(listener_param
);
449 rc
=IDirectSound3DListener_GetAllParameters(listener
,&listener_param
);
450 ok(rc
==DS_OK
,"IDirectSound3dListener_GetAllParameters() "
451 "failed: %s\n",DXGetErrorString8(rc
));
453 listener_param
.vPosition
.x
= -5.0;
454 listener_param
.vVelocity
.x
= 10.0/duration
;
456 rc
=IDirectSound3DListener_SetAllParameters(listener
,
459 ok(rc
==DS_OK
,"IDirectSound3dListener_SetPosition() failed: %s\n",
460 DXGetErrorString8(rc
));
464 buffer_param
.vPosition
.x
= 100.0;
465 buffer_param
.vVelocity
.x
= -200.0/duration
;
467 buffer_param
.flMinDistance
= 10;
468 rc
=IDirectSound3DBuffer_SetAllParameters(buffer
,&buffer_param
,
470 ok(rc
==DS_OK
,"IDirectSound3dBuffer_SetPosition() failed: %s\n",
471 DXGetErrorString8(rc
));
474 start_time
=GetTickCount();
475 while (buffer_service8(&state
)) {
476 WaitForSingleObject(GetCurrentProcess(),TIME_SLICE
);
478 if (listener
&& move_listener
) {
479 listener_param
.vPosition
.x
= -5.0+10.0*(now
-start_time
)/
481 if (winetest_debug
>2)
482 trace("listener position=%g\n",listener_param
.vPosition
.x
);
483 rc
=IDirectSound3DListener_SetPosition(listener
,
484 listener_param
.vPosition
.x
,listener_param
.vPosition
.y
,
485 listener_param
.vPosition
.z
,DS3D_IMMEDIATE
);
486 ok(rc
==DS_OK
,"IDirectSound3dListener_SetPosition() failed: "
487 "%s\n",DXGetErrorString8(rc
));
489 if (buffer3d
&& move_sound
) {
490 buffer_param
.vPosition
.x
= 100-200.0*(now
-start_time
)/
492 if (winetest_debug
>2)
493 trace("sound position=%g\n",buffer_param
.vPosition
.x
);
494 rc
=IDirectSound3DBuffer_SetPosition(buffer
,
495 buffer_param
.vPosition
.x
,buffer_param
.vPosition
.y
,
496 buffer_param
.vPosition
.z
,DS3D_IMMEDIATE
);
497 ok(rc
==DS_OK
,"IDirectSound3dBuffer_SetPosition() failed: %s\n",
498 DXGetErrorString8(rc
));
501 /* Check the sound duration was within 10% of the expected value */
503 ok(fabs(1000*duration
-now
+start_time
)<=100*duration
,
504 "The sound played for %ld ms instead of %g ms\n",
505 now
-start_time
,1000*duration
);
509 /* Set the CooperativeLevel back to normal */
510 /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
511 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_NORMAL
);
512 ok(rc
==DS_OK
,"IDirectSound8_SetCooperativeLevel(DSSCL_NORMAL) "
513 "failed: %s\n",DXGetErrorString8(rc
));
516 ref
=IDirectSound3DBuffer_Release(buffer
);
517 ok(ref
==0,"IDirectSound3DBuffer_Release() has %d references, "
518 "should have 0\n",ref
);
523 static HRESULT
test_secondary8(LPGUID lpGuid
, int play
,
524 int has_3d
, int has_3dbuffer
,
525 int has_listener
, int has_duplicate
,
526 int move_listener
, int move_sound
)
529 LPDIRECTSOUND8 dso
=NULL
;
530 LPDIRECTSOUNDBUFFER primary
=NULL
,secondary
=NULL
;
531 LPDIRECTSOUND3DLISTENER listener
=NULL
;
532 DSBUFFERDESC bufdesc
;
533 WAVEFORMATEX wfx
, wfx1
;
536 /* Create the DirectSound object */
537 rc
=pDirectSoundCreate8(lpGuid
,&dso
,NULL
);
538 ok(rc
==DS_OK
||rc
==DSERR_NODRIVER
,"DirectSoundCreate8() failed: %s\n",
539 DXGetErrorString8(rc
));
543 /* We must call SetCooperativeLevel before creating primary buffer */
544 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
545 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_PRIORITY
);
546 ok(rc
==DS_OK
,"IDirectSound8_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
547 "%s\n",DXGetErrorString8(rc
));
551 ZeroMemory(&bufdesc
, sizeof(bufdesc
));
552 bufdesc
.dwSize
=sizeof(bufdesc
);
553 bufdesc
.dwFlags
=DSBCAPS_PRIMARYBUFFER
;
555 bufdesc
.dwFlags
|=DSBCAPS_CTRL3D
;
557 bufdesc
.dwFlags
|=(DSBCAPS_CTRLVOLUME
|DSBCAPS_CTRLPAN
);
558 rc
=IDirectSound8_CreateSoundBuffer(dso
,&bufdesc
,&primary
,NULL
);
559 ok(rc
==DS_OK
&& primary
!=NULL
,"IDirectSound8_CreateSoundBuffer() "
560 "failed to create a %sprimary buffer: %s\n",has_3d
?"3D ":"",
561 DXGetErrorString8(rc
));
563 if (rc
==DS_OK
&& primary
!=NULL
) {
564 rc
=IDirectSoundBuffer_GetFormat(primary
,&wfx1
,sizeof(wfx1
),NULL
);
565 ok(rc
==DS_OK
,"IDirectSoundBuffer8_Getformat() failed: %s\n",
566 DXGetErrorString8(rc
));
571 rc
=IDirectSoundBuffer_QueryInterface(primary
,
572 &IID_IDirectSound3DListener
,
574 ok(rc
==DS_OK
&& listener
!=NULL
,
575 "IDirectSoundBuffer_QueryInterface() failed to get a 3D "
576 "listener %s\n",DXGetErrorString8(rc
));
577 ref
=IDirectSoundBuffer_Release(primary
);
578 ok(ref
==0,"IDirectSoundBuffer_Release() primary has %d references, "
579 "should have 0\n",ref
);
580 if (rc
==DS_OK
&& listener
!=NULL
) {
581 DS3DLISTENER listener_param
;
582 ZeroMemory(&listener_param
,sizeof(listener_param
));
583 /* DSOUND: Error: Invalid buffer */
584 rc
=IDirectSound3DListener_GetAllParameters(listener
,0);
585 ok(rc
==DSERR_INVALIDPARAM
,
586 "IDirectSound3dListener_GetAllParameters() should have "
587 "returned DSERR_INVALIDPARAM, returned: %s\n",
588 DXGetErrorString8(rc
));
590 /* DSOUND: Error: Invalid buffer */
591 rc
=IDirectSound3DListener_GetAllParameters(listener
,
593 ok(rc
==DSERR_INVALIDPARAM
,
594 "IDirectSound3dListener_GetAllParameters() should have "
595 "returned DSERR_INVALIDPARAM, returned: %s\n",
596 DXGetErrorString8(rc
));
598 listener_param
.dwSize
=sizeof(listener_param
);
599 rc
=IDirectSound3DListener_GetAllParameters(listener
,
601 ok(rc
==DS_OK
,"IDirectSound3dListener_GetAllParameters() "
602 "failed: %s\n",DXGetErrorString8(rc
));
608 init_format(&wfx
,WAVE_FORMAT_PCM
,22050,16,2);
610 ZeroMemory(&bufdesc
, sizeof(bufdesc
));
611 bufdesc
.dwSize
=sizeof(bufdesc
);
612 bufdesc
.dwFlags
=DSBCAPS_GETCURRENTPOSITION2
;
614 bufdesc
.dwFlags
|=DSBCAPS_CTRL3D
;
617 (DSBCAPS_CTRLFREQUENCY
|DSBCAPS_CTRLVOLUME
|DSBCAPS_CTRLPAN
);
618 bufdesc
.dwBufferBytes
=align(wfx
.nAvgBytesPerSec
*BUFFER_LEN
/1000,
620 bufdesc
.lpwfxFormat
=&wfx
;
622 /* a stereo 3D buffer should fail */
623 rc
=IDirectSound8_CreateSoundBuffer(dso
,&bufdesc
,&secondary
,NULL
);
624 ok(rc
==DSERR_INVALIDPARAM
,
625 "IDirectSound8_CreateSoundBuffer(secondary) should have "
626 "returned DSERR_INVALIDPARAM, returned %s\n",
627 DXGetErrorString8(rc
));
629 ref
=IDirectSoundBuffer_Release(secondary
);
630 init_format(&wfx
,WAVE_FORMAT_PCM
,22050,16,1);
633 if (winetest_interactive
) {
634 trace(" Testing a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d "
635 "with a primary buffer at %ldx%dx%d\n",
636 has_3dbuffer
?"3D ":"",
637 has_duplicate
?"duplicated ":"",
638 listener
!=NULL
||move_sound
?"with ":"",
639 move_listener
?"moving ":"",
640 listener
!=NULL
?"listener ":"",
641 listener
&&move_sound
?"and moving sound ":move_sound
?
643 wfx
.nSamplesPerSec
,wfx
.wBitsPerSample
,wfx
.nChannels
,
644 wfx1
.nSamplesPerSec
,wfx1
.wBitsPerSample
,wfx1
.nChannels
);
646 rc
=IDirectSound8_CreateSoundBuffer(dso
,&bufdesc
,&secondary
,NULL
);
647 ok(rc
==DS_OK
&& secondary
!=NULL
,"IDirectSound8_CreateSoundBuffer() "
648 "failed to create a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d (%s): %s\n",
649 has_3dbuffer
?"3D ":"", has_duplicate
?"duplicated ":"",
650 listener
!=NULL
||move_sound
?"with ":"", move_listener
?"moving ":"",
651 listener
!=NULL
?"listener ":"",
652 listener
&&move_sound
?"and moving sound ":move_sound
?
654 wfx
.nSamplesPerSec
,wfx
.wBitsPerSample
,wfx
.nChannels
,
655 getDSBCAPS(bufdesc
.dwFlags
),DXGetErrorString8(rc
));
656 if (rc
==DS_OK
&& secondary
!=NULL
) {
661 /* Check the initial secondary buffer's volume and pan */
662 rc
=IDirectSoundBuffer_GetVolume(secondary
,&vol
);
663 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetVolume(secondary) failed: "
664 "%s\n",DXGetErrorString8(rc
));
665 ok(vol
==0,"wrong volume for a new secondary buffer: %ld\n",vol
);
666 rc
=IDirectSoundBuffer_GetPan(secondary
,&pan
);
667 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetPan(secondary) failed: "
668 "%s\n",DXGetErrorString8(rc
));
669 ok(pan
==0,"wrong pan for a new secondary buffer: %ld\n",pan
);
671 /* Check that changing the secondary buffer's volume and pan
672 * does not impact the primary buffer's volume and pan
674 rc
=IDirectSoundBuffer_GetVolume(primary
,&refvol
);
675 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetVolume(primary) failed: "
676 "%s\n",DXGetErrorString8(rc
));
677 rc
=IDirectSoundBuffer_GetPan(primary
,&refpan
);
678 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetPan(primary) failed: "
679 "%s\n",DXGetErrorString8(rc
));
681 rc
=IDirectSoundBuffer_SetVolume(secondary
,-1000);
682 ok(rc
==DS_OK
,"IDirectSoundBuffer_SetVolume(secondary) failed: "
683 "%s\n",DXGetErrorString8(rc
));
684 rc
=IDirectSoundBuffer_GetVolume(secondary
,&vol
);
685 ok(rc
==DS_OK
,"IDirectSoundBuffer_SetVolume(secondary) failed: "
686 "%s\n",DXGetErrorString8(rc
));
687 ok(vol
==-1000,"secondary: wrong volume %ld instead of -1000\n",
689 rc
=IDirectSoundBuffer_SetPan(secondary
,-1000);
690 ok(rc
==DS_OK
,"IDirectSoundBuffer_SetPan(secondary) failed: "
691 "%s\n",DXGetErrorString8(rc
));
692 rc
=IDirectSoundBuffer_GetPan(secondary
,&pan
);
693 ok(rc
==DS_OK
,"IDirectSoundBuffer_SetPan(secondary) failed: "
694 "%s\n",DXGetErrorString8(rc
));
695 ok(pan
==-1000,"secondary: wrong pan %ld instead of -1000\n",
698 rc
=IDirectSoundBuffer_GetVolume(primary
,&vol
);
699 ok(rc
==DS_OK
,"IDirectSoundBuffer_`GetVolume(primary) failed: i"
700 "%s\n",DXGetErrorString8(rc
));
701 ok(vol
==refvol
,"The primary volume changed from %ld to %ld\n",
703 rc
=IDirectSoundBuffer_GetPan(primary
,&pan
);
704 ok(rc
==DS_OK
,"IDirectSoundBuffer_GetPan(primary) failed: "
705 "%s\n",DXGetErrorString8(rc
));
706 ok(pan
==refpan
,"The primary pan changed from %ld to %ld\n",
709 rc
=IDirectSoundBuffer_SetVolume(secondary
,0);
710 ok(rc
==DS_OK
,"IDirectSoundBuffer_SetVolume(secondary) failed: "
711 "%s\n",DXGetErrorString8(rc
));
712 rc
=IDirectSoundBuffer_SetPan(secondary
,0);
713 ok(rc
==DS_OK
,"IDirectSoundBuffer_SetPan(secondary) failed: "
714 "%s\n",DXGetErrorString8(rc
));
717 LPDIRECTSOUNDBUFFER duplicated
=NULL
;
719 /* DSOUND: Error: Invalid source buffer */
720 rc
=IDirectSound8_DuplicateSoundBuffer(dso
,0,0);
721 ok(rc
==DSERR_INVALIDPARAM
,
722 "IDirectSound8_DuplicateSoundBuffer() should have returned "
723 "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc
));
725 /* DSOUND: Error: Invalid dest buffer */
726 rc
=IDirectSound8_DuplicateSoundBuffer(dso
,secondary
,0);
727 ok(rc
==DSERR_INVALIDPARAM
,
728 "IDirectSound8_DuplicateSoundBuffer() should have returned "
729 "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc
));
731 /* DSOUND: Error: Invalid source buffer */
732 rc
=IDirectSound8_DuplicateSoundBuffer(dso
,0,&duplicated
);
733 ok(rc
==DSERR_INVALIDPARAM
,
734 "IDirectSound8_DuplicateSoundBuffer() should have returned "
735 "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc
));
738 rc
=IDirectSound8_DuplicateSoundBuffer(dso
,secondary
,
740 ok(rc
==DS_OK
&& duplicated
!=NULL
,
741 "IDirectSound8_DuplicateSoundBuffer() failed to duplicate "
742 "a secondary buffer: %s\n",DXGetErrorString8(rc
));
744 if (rc
==DS_OK
&& duplicated
!=NULL
) {
745 ref
=IDirectSoundBuffer_Release(secondary
);
746 ok(ref
==0,"IDirectSoundBuffer_Release() secondary has %d "
747 "references, should have 0\n",ref
);
748 secondary
=duplicated
;
752 if (rc
==DS_OK
&& secondary
!=NULL
) {
754 duration
=(move_listener
|| move_sound
?4.0:1.0);
755 test_buffer8(dso
,secondary
,0,FALSE
,0,FALSE
,0,
756 winetest_interactive
,duration
,has_3dbuffer
,
757 listener
,move_listener
,move_sound
);
758 ref
=IDirectSoundBuffer_Release(secondary
);
759 ok(ref
==0,"IDirectSoundBuffer_Release() %s has %d references, "
760 "should have 0\n",has_duplicate
?"duplicated":"secondary",
767 ref
=IDirectSound3DListener_Release(listener
);
768 ok(ref
==0,"IDirectSound3dListener_Release() listener has %d "
769 "references, should have 0\n",ref
);
771 ref
=IDirectSoundBuffer_Release(primary
);
772 ok(ref
==0,"IDirectSoundBuffer_Release() primary has %d references, "
773 "should have 0\n",ref
);
776 /* Set the CooperativeLevel back to normal */
777 /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
778 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_NORMAL
);
779 ok(rc
==DS_OK
,"IDirectSound8_SetCooperativeLevel(DSSCL_NORMAL) failed: "
780 "%s\n",DXGetErrorString8(rc
));
783 ref
=IDirectSound8_Release(dso
);
784 ok(ref
==0,"IDirectSound8_Release() has %d references, should have 0\n",ref
);
786 return DSERR_GENERIC
;
791 static HRESULT
test_for_driver8(LPGUID lpGuid
)
794 LPDIRECTSOUND8 dso
=NULL
;
797 /* Create the DirectSound object */
798 rc
=pDirectSoundCreate8(lpGuid
,&dso
,NULL
);
799 ok(rc
==DS_OK
||rc
==DSERR_NODRIVER
||rc
==DSERR_ALLOCATED
||rc
==E_FAIL
,
800 "DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc
));
804 ref
=IDirectSound8_Release(dso
);
805 ok(ref
==0,"IDirectSound8_Release() has %d references, should have 0\n",ref
);
807 return DSERR_GENERIC
;
812 static HRESULT
test_primary8(LPGUID lpGuid
)
815 LPDIRECTSOUND8 dso
=NULL
;
816 LPDIRECTSOUNDBUFFER primary
=NULL
;
817 DSBUFFERDESC bufdesc
;
821 /* Create the DirectSound object */
822 rc
=pDirectSoundCreate8(lpGuid
,&dso
,NULL
);
823 ok(rc
==DS_OK
||rc
==DSERR_NODRIVER
,"DirectSoundCreate8() failed: %s\n",
824 DXGetErrorString8(rc
));
828 /* Get the device capabilities */
829 ZeroMemory(&dscaps
, sizeof(dscaps
));
830 dscaps
.dwSize
=sizeof(dscaps
);
831 rc
=IDirectSound8_GetCaps(dso
,&dscaps
);
832 ok(rc
==DS_OK
,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc
));
836 /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
837 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
838 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_PRIORITY
);
839 ok(rc
==DS_OK
,"IDirectSound8_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
840 "%s\n",DXGetErrorString8(rc
));
844 /* Testing the primary buffer */
846 ZeroMemory(&bufdesc
, sizeof(bufdesc
));
847 bufdesc
.dwSize
=sizeof(bufdesc
);
848 bufdesc
.dwFlags
=DSBCAPS_PRIMARYBUFFER
|DSBCAPS_CTRLVOLUME
|DSBCAPS_CTRLPAN
;
849 rc
=IDirectSound8_CreateSoundBuffer(dso
,&bufdesc
,&primary
,NULL
);
850 ok(rc
==DS_OK
&& primary
!=NULL
,"IDirectSound8_CreateSoundBuffer() failed "
851 "to create a primary buffer: 0x%lx\n",rc
);
852 if (rc
==DS_OK
&& primary
!=NULL
) {
853 test_buffer8(dso
,primary
,1,TRUE
,0,TRUE
,0,winetest_interactive
&&
854 !(dscaps
.dwFlags
& DSCAPS_EMULDRIVER
),1.0,0,NULL
,0,0);
855 if (winetest_interactive
) {
858 volume
= DSBVOLUME_MAX
;
859 for (i
= 0; i
< 6; i
++) {
860 test_buffer8(dso
,primary
,1,TRUE
,volume
,TRUE
,0,
861 winetest_interactive
&&
862 !(dscaps
.dwFlags
& DSCAPS_EMULDRIVER
),
864 volume
-= ((DSBVOLUME_MAX
-DSBVOLUME_MIN
) / 40);
868 for (i
= 0; i
< 7; i
++) {
869 test_buffer8(dso
,primary
,1,TRUE
,0,TRUE
,pan
,
870 winetest_interactive
&&
871 !(dscaps
.dwFlags
& DSCAPS_EMULDRIVER
),1.0,0,0,0,0);
872 pan
+= ((DSBPAN_RIGHT
-DSBPAN_LEFT
) / 6);
875 ref
=IDirectSoundBuffer_Release(primary
);
876 ok(ref
==0,"IDirectSoundBuffer_Release() primary has %d references, "
877 "should have 0\n",ref
);
880 /* Set the CooperativeLevel back to normal */
881 /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
882 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_NORMAL
);
883 ok(rc
==DS_OK
,"IDirectSound8_SetCooperativeLevel(DSSCL_NORMAL) failed: "
884 "%s\n",DXGetErrorString8(rc
));
887 ref
=IDirectSound8_Release(dso
);
888 ok(ref
==0,"IDirectSound8_Release() has %d references, should have 0\n",ref
);
890 return DSERR_GENERIC
;
895 static HRESULT
test_primary_3d8(LPGUID lpGuid
)
898 LPDIRECTSOUND8 dso
=NULL
;
899 LPDIRECTSOUNDBUFFER primary
=NULL
;
900 DSBUFFERDESC bufdesc
;
904 /* Create the DirectSound object */
905 rc
=pDirectSoundCreate8(lpGuid
,&dso
,NULL
);
906 ok(rc
==DS_OK
||rc
==DSERR_NODRIVER
,"DirectSoundCreate8() failed: %s\n",
907 DXGetErrorString8(rc
));
911 /* Get the device capabilities */
912 ZeroMemory(&dscaps
, sizeof(dscaps
));
913 dscaps
.dwSize
=sizeof(dscaps
);
914 rc
=IDirectSound8_GetCaps(dso
,&dscaps
);
915 ok(rc
==DS_OK
,"IDirectSound8_GetCaps failed: %s\n",DXGetErrorString8(rc
));
919 /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
920 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
921 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_PRIORITY
);
922 ok(rc
==DS_OK
,"IDirectSound8_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
923 "%s\n",DXGetErrorString8(rc
));
928 ZeroMemory(&bufdesc
, sizeof(bufdesc
));
929 bufdesc
.dwSize
=sizeof(bufdesc
);
930 bufdesc
.dwFlags
=DSBCAPS_PRIMARYBUFFER
;
931 rc
=IDirectSound8_CreateSoundBuffer(dso
,&bufdesc
,&primary
,NULL
);
932 ok(rc
==DS_OK
&& primary
!=NULL
,"IDirectSound8_CreateSoundBuffer() failed "
933 "to create a primary buffer: %s\n",DXGetErrorString8(rc
));
934 if (rc
==DS_OK
&& primary
!=NULL
) {
935 ref
=IDirectSoundBuffer_Release(primary
);
936 ok(ref
==0,"IDirectSoundBuffer_Release() primary has %d references, "
937 "should have 0\n",ref
);
939 ZeroMemory(&bufdesc
, sizeof(bufdesc
));
940 bufdesc
.dwSize
=sizeof(bufdesc
);
941 bufdesc
.dwFlags
=DSBCAPS_PRIMARYBUFFER
|DSBCAPS_CTRL3D
;
942 rc
=IDirectSound8_CreateSoundBuffer(dso
,&bufdesc
,&primary
,NULL
);
943 ok(rc
==DS_OK
&& primary
!=NULL
,"IDirectSound8_CreateSoundBuffer() "
944 "failed to create a 3D primary buffer: %s\n",DXGetErrorString8(rc
));
945 if (rc
==DS_OK
&& primary
!=NULL
) {
946 test_buffer8(dso
,primary
,1,FALSE
,0,FALSE
,0,
947 winetest_interactive
&&
948 !(dscaps
.dwFlags
& DSCAPS_EMULDRIVER
),1.0,0,0,0,0);
949 ref
=IDirectSoundBuffer_Release(primary
);
950 ok(ref
==0,"IDirectSoundBuffer_Release() primary has %d references, "
951 "should have 0\n",ref
);
954 /* Set the CooperativeLevel back to normal */
955 /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
956 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_NORMAL
);
957 ok(rc
==DS_OK
,"IDirectSound8_SetCooperativeLevel(DSSCL_NORMAL) failed: "
958 "%s\n",DXGetErrorString8(rc
));
961 ref
=IDirectSound8_Release(dso
);
962 ok(ref
==0,"IDirectSound8_Release() has %d references, should have 0\n",ref
);
964 return DSERR_GENERIC
;
969 static HRESULT
test_primary_3d_with_listener8(LPGUID lpGuid
)
972 LPDIRECTSOUND8 dso
=NULL
;
973 LPDIRECTSOUNDBUFFER primary
=NULL
;
974 DSBUFFERDESC bufdesc
;
978 /* Create the DirectSound object */
979 rc
=pDirectSoundCreate8(lpGuid
,&dso
,NULL
);
980 ok(rc
==DS_OK
||rc
==DSERR_NODRIVER
,"DirectSoundCreate8() failed: %s\n",
981 DXGetErrorString8(rc
));
985 /* Get the device capabilities */
986 ZeroMemory(&dscaps
, sizeof(dscaps
));
987 dscaps
.dwSize
=sizeof(dscaps
);
988 rc
=IDirectSound8_GetCaps(dso
,&dscaps
);
989 ok(rc
==DS_OK
,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc
));
993 /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
994 /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
995 rc
=IDirectSound8_SetCooperativeLevel(dso
,get_hwnd(),DSSCL_PRIORITY
);
996 ok(rc
==DS_OK
,"IDirectSound8_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
997 "%s\n",DXGetErrorString8(rc
));
1001 ZeroMemory(&bufdesc
, sizeof(bufdesc
));
1002 bufdesc
.dwSize
=sizeof(bufdesc
);
1003 bufdesc
.dwFlags
=DSBCAPS_PRIMARYBUFFER
|DSBCAPS_CTRL3D
;
1004 rc
=IDirectSound8_CreateSoundBuffer(dso
,&bufdesc
,&primary
,NULL
);
1005 ok(rc
==DS_OK
&& primary
!=NULL
,"IDirectSound8_CreateSoundBuffer() failed "
1006 "to create a 3D primary buffer %s\n",DXGetErrorString8(rc
));
1007 if (rc
==DS_OK
&& primary
!=NULL
) {
1008 LPDIRECTSOUND3DLISTENER listener
=NULL
;
1009 rc
=IDirectSoundBuffer_QueryInterface(primary
,
1010 &IID_IDirectSound3DListener
,
1011 (void **)&listener
);
1012 ok(rc
==DS_OK
&& listener
!=NULL
,"IDirectSoundBuffer_QueryInterface() "
1013 "failed to get a 3D listener: %s\n",DXGetErrorString8(rc
));
1014 if (rc
==DS_OK
&& listener
!=NULL
) {
1015 LPDIRECTSOUNDBUFFER temp_buffer
=NULL
;
1017 /* Checking the COM interface */
1018 rc
=IDirectSoundBuffer_QueryInterface(primary
,
1019 &IID_IDirectSoundBuffer
,
1020 (LPVOID
*)&temp_buffer
);
1021 ok(rc
==DS_OK
&& temp_buffer
!=NULL
,
1022 "IDirectSoundBuffer_QueryInterface() failed: %s\n",
1023 DXGetErrorString8(rc
));
1024 ok(temp_buffer
==primary
,"COM interface broken: 0x%08lx != "
1025 "0x%08lx\n",(DWORD
)temp_buffer
,(DWORD
)primary
);
1026 if (rc
==DS_OK
&& temp_buffer
!=NULL
) {
1027 ref
=IDirectSoundBuffer_Release(temp_buffer
);
1028 ok(ref
==1,"IDirectSoundBuffer_Release() has %d references, "
1029 "should have 1\n",ref
);
1032 rc
=IDirectSound3DListener_QueryInterface(listener
,
1033 &IID_IDirectSoundBuffer
,(LPVOID
*)&temp_buffer
);
1034 ok(rc
==DS_OK
&& temp_buffer
!=NULL
,
1035 "IDirectSoundBuffer_QueryInterface() failed: %s\n",
1036 DXGetErrorString8(rc
));
1037 ok(temp_buffer
==primary
,"COM interface broken: 0x%08lx != "
1038 "0x%08lx\n",(DWORD
)temp_buffer
,(DWORD
)primary
);
1039 ref
=IDirectSoundBuffer_Release(temp_buffer
);
1040 ok(ref
==1,"IDirectSoundBuffer_Release() has %d references, "
1041 "should have 1\n",ref
);
1043 /* Testing the buffer */
1044 test_buffer8(dso
,primary
,1,FALSE
,0,FALSE
,0,
1045 winetest_interactive
&&
1046 !(dscaps
.dwFlags
& DSCAPS_EMULDRIVER
),
1047 1.0,0,listener
,0,0);
1050 /* Testing the reference counting */
1051 ref
=IDirectSound3DListener_Release(listener
);
1052 ok(ref
==0,"IDirectSound3DListener_Release() listener has %d "
1053 "references, should have 0\n",ref
);
1056 /* Testing the reference counting */
1057 ref
=IDirectSoundBuffer_Release(primary
);
1058 ok(ref
==0,"IDirectSoundBuffer_Release() primary has %d references, "
1059 "should have 0\n",ref
);
1063 ref
=IDirectSound8_Release(dso
);
1064 ok(ref
==0,"IDirectSound8_Release() has %d references, should have 0\n",ref
);
1066 return DSERR_GENERIC
;
1071 static BOOL WINAPI
dsenum_callback(LPGUID lpGuid
, LPCSTR lpcstrDescription
,
1072 LPCSTR lpcstrModule
, LPVOID lpContext
)
1075 trace("*** Testing %s - %s ***\n",lpcstrDescription
,lpcstrModule
);
1077 rc
= test_for_driver8(lpGuid
);
1078 if (rc
== DSERR_NODRIVER
) {
1079 trace(" No Driver\n");
1081 } else if (rc
== DSERR_ALLOCATED
) {
1082 trace(" Already In Use\n");
1084 } else if (rc
== E_FAIL
) {
1085 trace(" No Device\n");
1089 trace(" Testing the primary buffer\n");
1090 test_primary8(lpGuid
);
1092 trace(" Testing 3D primary buffer\n");
1093 test_primary_3d8(lpGuid
);
1095 trace(" Testing 3D primary buffer with listener\n");
1096 test_primary_3d_with_listener8(lpGuid
);
1098 /* Testing secondary buffers */
1099 test_secondary8(lpGuid
,winetest_interactive
,0,0,0,0,0,0);
1100 test_secondary8(lpGuid
,winetest_interactive
,0,0,0,1,0,0);
1102 /* Testing 3D secondary buffers */
1103 test_secondary8(lpGuid
,winetest_interactive
,1,0,0,0,0,0);
1104 test_secondary8(lpGuid
,winetest_interactive
,1,1,0,0,0,0);
1105 test_secondary8(lpGuid
,winetest_interactive
,1,1,0,1,0,0);
1106 test_secondary8(lpGuid
,winetest_interactive
,1,0,1,0,0,0);
1107 test_secondary8(lpGuid
,winetest_interactive
,1,0,1,1,0,0);
1108 test_secondary8(lpGuid
,winetest_interactive
,1,1,1,0,0,0);
1109 test_secondary8(lpGuid
,winetest_interactive
,1,1,1,1,0,0);
1110 test_secondary8(lpGuid
,winetest_interactive
,1,1,1,0,1,0);
1111 test_secondary8(lpGuid
,winetest_interactive
,1,1,1,0,0,1);
1112 test_secondary8(lpGuid
,winetest_interactive
,1,1,1,0,1,1);
1117 static void ds3d8_tests()
1120 rc
=DirectSoundEnumerateA(&dsenum_callback
,NULL
);
1121 ok(rc
==DS_OK
,"DirectSoundEnumerateA() failed: %s\n",DXGetErrorString8(rc
));
1130 hDsound
= LoadLibraryA("dsound.dll");
1132 trace("dsound.dll not found\n");
1136 trace("DLL Version: %s\n", get_file_version("dsound.dll"));
1138 pDirectSoundCreate8
= (void*)GetProcAddress(hDsound
, "DirectSoundCreate8");
1139 if (!pDirectSoundCreate8
) {
1140 trace("ds3d8 test skipped\n");