2 * Copyright 2010 Maarten Lankhorst for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 /* This test is for audio playback specific mechanisms
21 * - IAudioClient with eRender and IAudioRenderClient
24 #include "wine/test.h"
34 #include "mmdeviceapi.h"
35 #include "audioclient.h"
36 #include "audiopolicy.h"
40 #define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
42 static IMMDeviceEnumerator *mme = NULL;
43 static IMMDevice *dev = NULL;
45 static inline const char *dbgstr_guid( const GUID *id )
48 sprintf(ret, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
49 id->Data1, id->Data2, id->Data3,
50 id->Data4[0], id->Data4[1], id->Data4[2], id->Data4[3],
51 id->Data4[4], id->Data4[5], id->Data4[6], id->Data4[7] );
55 static void test_uninitialized(IAudioClient *ac)
61 HANDLE handle = CreateEventW(NULL, FALSE, FALSE, NULL);
64 hr = IAudioClient_GetBufferSize(ac, &num);
65 ok(hr == AUDCLNT_E_NOT_INITIALIZED, "Uninitialized GetBufferSize call returns %08x\n", hr);
67 hr = IAudioClient_GetStreamLatency(ac, &t1);
68 ok(hr == AUDCLNT_E_NOT_INITIALIZED, "Uninitialized GetStreamLatency call returns %08x\n", hr);
70 hr = IAudioClient_GetCurrentPadding(ac, &num);
71 ok(hr == AUDCLNT_E_NOT_INITIALIZED, "Uninitialized GetCurrentPadding call returns %08x\n", hr);
73 hr = IAudioClient_Start(ac);
74 ok(hr == AUDCLNT_E_NOT_INITIALIZED, "Uninitialized Start call returns %08x\n", hr);
76 hr = IAudioClient_Stop(ac);
77 ok(hr == AUDCLNT_E_NOT_INITIALIZED, "Uninitialized Stop call returns %08x\n", hr);
79 hr = IAudioClient_Reset(ac);
80 ok(hr == AUDCLNT_E_NOT_INITIALIZED, "Uninitialized Reset call returns %08x\n", hr);
82 hr = IAudioClient_SetEventHandle(ac, handle);
83 ok(hr == AUDCLNT_E_NOT_INITIALIZED, "Uninitialized SetEventHandle call returns %08x\n", hr);
85 hr = IAudioClient_GetService(ac, &IID_IAudioStreamVolume, (void**)&unk);
86 ok(hr == AUDCLNT_E_NOT_INITIALIZED, "Uninitialized GetService call returns %08x\n", hr);
91 static void test_audioclient(void)
97 WAVEFORMATEX *pwfx, *pwfx2;
98 REFERENCE_TIME t1, t2;
101 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
103 ok(hr == S_OK, "Activation failed with %08x\n", hr);
107 handle = CreateEventW(NULL, FALSE, FALSE, NULL);
109 hr = IAudioClient_QueryInterface(ac, &IID_IUnknown, NULL);
110 ok(hr == E_POINTER, "QueryInterface(NULL) returned %08x\n", hr);
112 unk = (void*)(LONG_PTR)0x12345678;
113 hr = IAudioClient_QueryInterface(ac, &IID_NULL, (void**)&unk);
114 ok(hr == E_NOINTERFACE, "QueryInterface(IID_NULL) returned %08x\n", hr);
115 ok(!unk, "QueryInterface(IID_NULL) returned non-null pointer %p\n", unk);
117 hr = IAudioClient_QueryInterface(ac, &IID_IUnknown, (void**)&unk);
118 ok(hr == S_OK, "QueryInterface(IID_IUnknown) returned %08x\n", hr);
121 ref = IUnknown_Release(unk);
122 ok(ref == 1, "Released count is %u\n", ref);
125 hr = IAudioClient_QueryInterface(ac, &IID_IAudioClient, (void**)&unk);
126 ok(hr == S_OK, "QueryInterface(IID_IAudioClient) returned %08x\n", hr);
129 ref = IUnknown_Release(unk);
130 ok(ref == 1, "Released count is %u\n", ref);
133 hr = IAudioClient_GetDevicePeriod(ac, NULL, NULL);
134 ok(hr == E_POINTER, "Invalid GetDevicePeriod call returns %08x\n", hr);
136 hr = IAudioClient_GetDevicePeriod(ac, &t1, NULL);
137 ok(hr == S_OK, "Valid GetDevicePeriod call returns %08x\n", hr);
139 hr = IAudioClient_GetDevicePeriod(ac, NULL, &t2);
140 ok(hr == S_OK, "Valid GetDevicePeriod call returns %08x\n", hr);
142 hr = IAudioClient_GetDevicePeriod(ac, &t1, &t2);
143 ok(hr == S_OK, "Valid GetDevicePeriod call returns %08x\n", hr);
144 trace("Returned periods: %u.%05u ms %u.%05u ms\n",
145 (UINT)(t1/10000), (UINT)(t1 % 10000),
146 (UINT)(t2/10000), (UINT)(t2 % 10000));
148 hr = IAudioClient_GetMixFormat(ac, NULL);
149 ok(hr == E_POINTER, "GetMixFormat returns %08x\n", hr);
151 hr = IAudioClient_GetMixFormat(ac, &pwfx);
152 ok(hr == S_OK, "Valid GetMixFormat returns %08x\n", hr);
156 trace("pwfx: %p\n", pwfx);
157 trace("Tag: %04x\n", pwfx->wFormatTag);
158 trace("bits: %u\n", pwfx->wBitsPerSample);
159 trace("chan: %u\n", pwfx->nChannels);
160 trace("rate: %u\n", pwfx->nSamplesPerSec);
161 trace("align: %u\n", pwfx->nBlockAlign);
162 trace("extra: %u\n", pwfx->cbSize);
163 ok(pwfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE, "wFormatTag is %x\n", pwfx->wFormatTag);
164 if (pwfx->wFormatTag == WAVE_FORMAT_EXTENSIBLE)
166 WAVEFORMATEXTENSIBLE *pwfxe = (void*)pwfx;
167 trace("Res: %u\n", pwfxe->Samples.wReserved);
168 trace("Mask: %x\n", pwfxe->dwChannelMask);
170 IsEqualGUID(&pwfxe->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM)?"PCM":
171 (IsEqualGUID(&pwfxe->SubFormat,
172 &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)?"FLOAT":"Other"));
175 hr = IAudioClient_IsFormatSupported(ac, AUDCLNT_SHAREMODE_SHARED, pwfx, &pwfx2);
176 ok(hr == S_OK, "Valid IsFormatSupported(Shared) call returns %08x\n", hr);
177 ok(pwfx2 == NULL, "pwfx2 is non-null\n");
178 CoTaskMemFree(pwfx2);
180 hr = IAudioClient_IsFormatSupported(ac, AUDCLNT_SHAREMODE_SHARED, NULL, NULL);
181 ok(hr == E_POINTER, "IsFormatSupported(NULL) call returns %08x\n", hr);
183 hr = IAudioClient_IsFormatSupported(ac, AUDCLNT_SHAREMODE_SHARED, pwfx, NULL);
184 ok(hr == E_POINTER, "IsFormatSupported(Shared,NULL) call returns %08x\n", hr);
186 hr = IAudioClient_IsFormatSupported(ac, AUDCLNT_SHAREMODE_EXCLUSIVE, pwfx, NULL);
187 ok(hr == S_OK || hr == AUDCLNT_E_UNSUPPORTED_FORMAT, "IsFormatSupported(Exclusive) call returns %08x\n", hr);
189 hr = IAudioClient_IsFormatSupported(ac, AUDCLNT_SHAREMODE_EXCLUSIVE, pwfx, &pwfx2);
190 ok(hr == S_OK || hr == AUDCLNT_E_UNSUPPORTED_FORMAT, "IsFormatSupported(Exclusive) call returns %08x\n", hr);
191 ok(pwfx2 == NULL, "pwfx2 non-null on exclusive IsFormatSupported\n");
193 hr = IAudioClient_IsFormatSupported(ac, 0xffffffff, pwfx, NULL);
194 ok(hr == E_INVALIDARG ||
195 hr == AUDCLNT_E_UNSUPPORTED_FORMAT,
196 "IsFormatSupported(0xffffffff) call returns %08x\n", hr);
199 test_uninitialized(ac);
201 hr = IAudioClient_Initialize(ac, 3, 0, 5000000, 0, pwfx, NULL);
202 ok(hr == AUDCLNT_E_NOT_INITIALIZED, "Initialize with invalid sharemode returns %08x\n", hr);
204 hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED, 0xffffffff, 5000000, 0, pwfx, NULL);
205 ok(hr == E_INVALIDARG, "Initialize with invalid flags returns %08x\n", hr);
207 /* It seems that if length > 2s or periodicity != 0 the length is ignored and call succeeds
208 * Since we can only initialize successfully once, skip those tests.
210 hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED, 0, 5000000, 0, NULL, NULL);
211 ok(hr == E_POINTER, "Initialize with null format returns %08x\n", hr);
213 hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED, 0, 5000000, 0, pwfx, NULL);
214 ok(hr == S_OK, "Valid Initialize returns %08x\n", hr);
218 skip("Cannot initialize %08x, remainder of tests is useless\n", hr);
223 hr = IAudioClient_GetStreamLatency(ac, NULL);
224 ok(hr == E_POINTER, "GetStreamLatency(NULL) call returns %08x\n", hr);
226 hr = IAudioClient_GetStreamLatency(ac, &t1);
227 ok(hr == S_OK, "Valid GetStreamLatency call returns %08x\n", hr);
228 trace("Returned latency: %u.%05u ms\n",
229 (UINT)(t1/10000), (UINT)(t1 % 10000));
231 hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED, 0, 5000000, 0, pwfx, NULL);
232 ok(hr == AUDCLNT_E_ALREADY_INITIALIZED, "Calling Initialize twice returns %08x\n", hr);
234 hr = IAudioClient_SetEventHandle(ac, NULL);
235 ok(hr == E_INVALIDARG, "SetEventHandle(NULL) returns %08x\n", hr);
237 hr = IAudioClient_SetEventHandle(ac, handle);
238 ok(hr == AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED ||
239 broken(hr == HRESULT_FROM_WIN32(ERROR_INVALID_NAME)) ||
240 broken(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) /* Some 2k8 */ ||
241 broken(hr == HRESULT_FROM_WIN32(ERROR_BAD_PATHNAME)) /* Some Vista */
242 , "SetEventHandle returns %08x\n", hr);
244 hr = IAudioClient_Reset(ac);
245 ok(hr == S_OK, "Reset on a resetted stream returns %08x\n", hr);
247 hr = IAudioClient_Stop(ac);
248 ok(hr == S_FALSE, "Stop on a stopped stream returns %08x\n", hr);
250 hr = IAudioClient_Start(ac);
251 ok(hr == S_OK, "Start on a stopped stream returns %08x\n", hr);
253 IAudioClient_Release(ac);
259 static void test_references(void)
262 IAudioRenderClient *rc;
263 ISimpleAudioVolume *sav;
269 /* IAudioRenderClient */
270 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
272 ok(hr == S_OK, "Activation failed with %08x\n", hr);
276 hr = IAudioClient_GetMixFormat(ac, &pwfx);
277 ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
281 hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED, 0, 5000000,
283 ok(hr == S_OK, "Initialize failed: %08x\n", hr);
287 hr = IAudioClient_GetService(ac, &IID_IAudioRenderClient, (void**)&rc);
288 ok(hr == S_OK, "GetService failed: %08x\n", hr);
290 IAudioRenderClient_AddRef(rc);
291 ref = IAudioRenderClient_Release(rc);
292 ok(ref != 0, "RenderClient_Release gave wrong refcount: %u\n", ref);
294 ref = IAudioClient_Release(ac);
295 ok(ref != 0, "Client_Release gave wrong refcount: %u\n", ref);
297 ref = IAudioRenderClient_Release(rc);
298 ok(ref == 0, "RenderClient_Release gave wrong refcount: %u\n", ref);
300 /* ISimpleAudioVolume */
301 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
303 ok(hr == S_OK, "Activation failed with %08x\n", hr);
307 hr = IAudioClient_GetMixFormat(ac, &pwfx);
308 ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
310 hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED, 0, 5000000,
312 ok(hr == S_OK, "Initialize failed: %08x\n", hr);
316 hr = IAudioClient_GetService(ac, &IID_ISimpleAudioVolume, (void**)&sav);
317 ok(hr == S_OK, "GetService failed: %08x\n", hr);
319 ISimpleAudioVolume_AddRef(sav);
320 ref = ISimpleAudioVolume_Release(sav);
321 ok(ref != 0, "SimpleAudioVolume_Release gave wrong refcount: %u\n", ref);
323 ref = IAudioClient_Release(ac);
324 ok(ref != 0, "Client_Release gave wrong refcount: %u\n", ref);
326 ref = ISimpleAudioVolume_Release(sav);
327 ok(ref == 0, "SimpleAudioVolume_Release gave wrong refcount: %u\n", ref);
330 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
332 ok(hr == S_OK, "Activation failed with %08x\n", hr);
336 hr = IAudioClient_GetMixFormat(ac, &pwfx);
337 ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
339 hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED, 0, 5000000,
341 ok(hr == S_OK, "Initialize failed: %08x\n", hr);
345 hr = IAudioClient_GetService(ac, &IID_IAudioClock, (void**)&acl);
346 ok(hr == S_OK, "GetService failed: %08x\n", hr);
348 IAudioClock_AddRef(acl);
349 ref = IAudioClock_Release(acl);
350 ok(ref != 0, "AudioClock_Release gave wrong refcount: %u\n", ref);
352 ref = IAudioClient_Release(ac);
353 ok(ref != 0, "Client_Release gave wrong refcount: %u\n", ref);
355 ref = IAudioClock_Release(acl);
356 ok(ref == 0, "AudioClock_Release gave wrong refcount: %u\n", ref);
359 static void test_event(void)
366 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
368 ok(hr == S_OK, "Activation failed with %08x\n", hr);
372 hr = IAudioClient_GetMixFormat(ac, &pwfx);
373 ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
377 hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED,
378 AUDCLNT_STREAMFLAGS_EVENTCALLBACK, 5000000,
380 ok(hr == S_OK, "Initialize failed: %08x\n", hr);
384 event = CreateEventW(NULL, FALSE, FALSE, NULL);
385 ok(event != NULL, "CreateEvent failed\n");
387 hr = IAudioClient_Start(ac);
388 ok(hr == AUDCLNT_E_EVENTHANDLE_NOT_SET, "Start failed: %08x\n", hr);
390 hr = IAudioClient_SetEventHandle(ac, event);
391 ok(hr == S_OK, "SetEventHandle failed: %08x\n", hr);
393 hr = IAudioClient_Start(ac);
394 ok(hr == S_OK, "Start failed: %08x\n", hr);
396 hr = IAudioClient_Stop(ac);
397 ok(hr == S_OK, "Start failed: %08x\n", hr);
399 /* test releasing a playing stream */
400 hr = IAudioClient_Start(ac);
401 ok(hr == S_OK, "Start failed: %08x\n", hr);
402 IAudioClient_Release(ac);
407 static void test_padding(void)
411 IAudioRenderClient *arc;
413 REFERENCE_TIME minp, defp;
415 UINT32 psize, pad, written;
417 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
419 ok(hr == S_OK, "Activation failed with %08x\n", hr);
423 hr = IAudioClient_GetMixFormat(ac, &pwfx);
424 ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
428 hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED,
429 0, 5000000, 0, pwfx, NULL);
430 ok(hr == S_OK, "Initialize failed: %08x\n", hr);
432 hr = IAudioClient_GetDevicePeriod(ac, &defp, &minp);
433 ok(hr == S_OK, "GetDevicePeriod failed: %08x\n", hr);
434 ok(defp != 0, "Default period is 0\n");
435 ok(minp != 0, "Minimum period is 0\n");
436 ok(minp <= defp, "Mininum period is greater than default period\n");
438 hr = IAudioClient_GetService(ac, &IID_IAudioRenderClient, (void**)&arc);
439 ok(hr == S_OK, "GetService failed: %08x\n", hr);
441 psize = (defp / 10000000.) * pwfx->nSamplesPerSec * pwfx->nBlockAlign;
444 hr = IAudioClient_GetCurrentPadding(ac, &pad);
445 ok(hr == S_OK, "GetCurrentPadding failed: %08x\n", hr);
446 ok(pad == written, "GetCurrentPadding returned %u, should be %u\n", pad, written);
448 hr = IAudioRenderClient_GetBuffer(arc, psize, &buf);
449 ok(hr == S_OK, "GetBuffer failed: %08x\n", hr);
450 ok(buf != NULL, "NULL buffer returned\n");
452 hr = IAudioRenderClient_ReleaseBuffer(arc, psize,
453 AUDCLNT_BUFFERFLAGS_SILENT);
454 ok(hr == S_OK, "ReleaseBuffer failed: %08x\n", hr);
457 hr = IAudioClient_GetCurrentPadding(ac, &pad);
458 ok(hr == S_OK, "GetCurrentPadding failed: %08x\n", hr);
459 ok(pad == written, "GetCurrentPadding returned %u, should be %u\n", pad, written);
461 psize = (minp / 10000000.) * pwfx->nSamplesPerSec * pwfx->nBlockAlign;
463 hr = IAudioRenderClient_GetBuffer(arc, psize, &buf);
464 ok(hr == S_OK, "GetBuffer failed: %08x\n", hr);
465 ok(buf != NULL, "NULL buffer returned\n");
467 hr = IAudioRenderClient_ReleaseBuffer(arc, psize,
468 AUDCLNT_BUFFERFLAGS_SILENT);
469 ok(hr == S_OK, "ReleaseBuffer failed: %08x\n", hr);
472 hr = IAudioClient_GetCurrentPadding(ac, &pad);
473 ok(hr == S_OK, "GetCurrentPadding failed: %08x\n", hr);
474 ok(pad == written, "GetCurrentPadding returned %u, should be %u\n", pad, written);
476 /* overfull buffer. requested 1/2s buffer size, so try
477 * to get a 1/2s buffer, which should fail */
478 psize = pwfx->nSamplesPerSec / 2.;
479 hr = IAudioRenderClient_GetBuffer(arc, psize, &buf);
480 ok(hr == AUDCLNT_E_BUFFER_TOO_LARGE, "GetBuffer gave wrong error: %08x\n", hr);
482 hr = IAudioRenderClient_ReleaseBuffer(arc, psize, 0);
483 ok(hr == AUDCLNT_E_OUT_OF_ORDER, "ReleaseBuffer gave wrong error: %08x\n", hr);
485 hr = IAudioClient_GetCurrentPadding(ac, &pad);
486 ok(hr == S_OK, "GetCurrentPadding failed: %08x\n", hr);
487 ok(pad == written, "GetCurrentPadding returned %u, should be %u\n", pad, written);
491 IAudioRenderClient_Release(arc);
492 IAudioClient_Release(ac);
495 static void test_clock(void)
500 IAudioRenderClient *arc;
501 UINT64 freq, pos, pcpos, last;
505 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
507 ok(hr == S_OK, "Activation failed with %08x\n", hr);
511 hr = IAudioClient_GetMixFormat(ac, &pwfx);
512 ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
516 hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED,
517 0, 5000000, 0, pwfx, NULL);
518 ok(hr == S_OK, "Initialize failed: %08x\n", hr);
520 hr = IAudioClient_GetService(ac, &IID_IAudioClock, (void**)&acl);
521 ok(hr == S_OK, "GetService(IAudioClock) failed: %08x\n", hr);
523 hr = IAudioClock_GetFrequency(acl, &freq);
524 ok(hr == S_OK, "GetFrequency failed: %08x\n", hr);
526 hr = IAudioClock_GetPosition(acl, NULL, NULL);
527 ok(hr == E_POINTER, "GetPosition wrong error: %08x\n", hr);
530 hr = IAudioClock_GetPosition(acl, &pos, &pcpos);
531 ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
532 ok(pos == 0, "GetPosition returned non-zero pos before being started\n");
533 ok(pcpos != 0, "GetPosition returned zero pcpos\n");
536 hr = IAudioClient_GetService(ac, &IID_IAudioRenderClient, (void**)&arc);
537 ok(hr == S_OK, "GetService(IAudioRenderClient) failed: %08x\n", hr);
539 hr = IAudioRenderClient_GetBuffer(arc, pwfx->nSamplesPerSec / 2., &data);
540 ok(hr == S_OK, "GetBuffer failed: %08x\n", hr);
542 hr = IAudioRenderClient_ReleaseBuffer(arc, pwfx->nSamplesPerSec / 2., AUDCLNT_BUFFERFLAGS_SILENT);
543 ok(hr == S_OK, "ReleaseBuffer failed: %08x\n", hr);
545 hr = IAudioClock_GetPosition(acl, &pos, NULL);
546 ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
547 ok(pos == 0, "GetPosition returned non-zero pos before being started\n");
549 hr = IAudioClient_Start(ac);
550 ok(hr == S_OK, "Start failed: %08x\n", hr);
554 hr = IAudioClock_GetPosition(acl, &pos, NULL);
555 ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
556 ok(pos > 0, "Position should have been further along...\n");
559 hr = IAudioClient_Stop(ac);
560 ok(hr == S_OK, "Stop failed: %08x\n", hr);
562 hr = IAudioClock_GetPosition(acl, &pos, NULL);
563 ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
564 ok(pos >= last, "Position should have been further along...\n");
567 hr = IAudioClient_Start(ac);
568 ok(hr == S_OK, "Start failed: %08x\n", hr);
572 hr = IAudioClient_Stop(ac);
573 ok(hr == S_OK, "Stop failed: %08x\n", hr);
575 hr = IAudioClock_GetPosition(acl, &pos, NULL);
576 ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
577 ok(pos >= last, "Position should have been further along...\n");
580 hr = IAudioClock_GetPosition(acl, &pos, NULL);
581 ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
582 ok(pos == last, "Position should have been further along...\n");
584 hr = IAudioClient_Reset(ac);
585 ok(hr == S_OK, "Reset failed: %08x\n", hr);
587 hr = IAudioClock_GetPosition(acl, &pos, NULL);
588 ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
589 ok(pos == 0, "GetPosition returned non-zero pos after Reset\n");
592 hr = IAudioRenderClient_GetBuffer(arc, pwfx->nSamplesPerSec / 2., &data);
593 ok(hr == S_OK, "GetBuffer failed: %08x\n", hr);
595 hr = IAudioRenderClient_ReleaseBuffer(arc, pwfx->nSamplesPerSec / 2., AUDCLNT_BUFFERFLAGS_SILENT);
596 ok(hr == S_OK, "ReleaseBuffer failed: %08x\n", hr);
598 hr = IAudioClock_GetPosition(acl, &pos, NULL);
599 ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
600 ok(pos == 0, "GetPosition returned non-zero pos after Reset\n");
603 hr = IAudioClient_Start(ac);
604 ok(hr == S_OK, "Start failed: %08x\n", hr);
608 hr = IAudioClock_GetPosition(acl, &pos, NULL);
609 ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
610 ok(pos > last, "Position should have been further along...\n");
612 hr = IAudioClient_Stop(ac);
613 ok(hr == S_OK, "Stop failed: %08x\n", hr);
615 hr = IAudioClock_GetPosition(acl, &pos, NULL);
616 ok(hr == S_OK, "GetPosition failed: %08x\n", hr);
617 ok(pos >= last, "Position should have been further along...\n");
619 IAudioClock_Release(acl);
620 IAudioClient_Release(ac);
623 static void test_session(void)
625 IAudioClient *ses1_ac1, *ses1_ac2, *cap_ac = NULL;
626 IAudioSessionControl2 *ses1_ctl, *ses1_ctl2, *cap_ctl;
629 AudioSessionState state;
634 hr = CoCreateGuid(&ses1_guid);
635 ok(hr == S_OK, "CoCreateGuid failed: %08x\n", hr);
637 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
638 NULL, (void**)&ses1_ac1);
639 ok(hr == S_OK, "Activation failed with %08x\n", hr);
641 hr = IAudioClient_GetMixFormat(ses1_ac1, &pwfx);
642 ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
644 hr = IAudioClient_Initialize(ses1_ac1, AUDCLNT_SHAREMODE_SHARED,
645 0, 5000000, 0, pwfx, &ses1_guid);
646 ok(hr == S_OK, "Initialize failed: %08x\n", hr);
648 hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
649 NULL, (void**)&ses1_ac2);
650 ok(hr == S_OK, "Activation failed with %08x\n", hr);
652 hr = IAudioClient_Initialize(ses1_ac2, AUDCLNT_SHAREMODE_SHARED,
653 0, 5000000, 0, pwfx, &ses1_guid);
654 ok(hr == S_OK, "Initialize failed: %08x\n", hr);
656 hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(mme, eCapture,
657 eMultimedia, &cap_dev);
659 WAVEFORMATEX *cap_pwfx;
661 hr = IMMDevice_Activate(cap_dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
662 NULL, (void**)&cap_ac);
663 ok(hr == S_OK, "Activate failed: %08x\n", hr);
665 hr = IAudioClient_GetMixFormat(cap_ac, &cap_pwfx);
666 ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
668 hr = IAudioClient_Initialize(cap_ac, AUDCLNT_SHAREMODE_SHARED,
669 0, 5000000, 0, cap_pwfx, &ses1_guid);
670 ok(hr == S_OK, "Initialize failed: %08x\n", hr);
672 hr = IAudioClient_GetService(cap_ac, &IID_IAudioSessionControl, (void**)&cap_ctl);
673 ok(hr == S_OK, "GetService failed: %08x\n", hr);
675 IMMDevice_Release(cap_dev);
676 CoTaskMemFree(cap_pwfx);
678 skip("No capture device available; skipping capture device in render session tests\n");
680 hr = IAudioClient_GetService(ses1_ac1, &IID_IAudioSessionControl2, (void**)&ses1_ctl);
681 ok(hr == E_NOINTERFACE, "GetService gave wrong error: %08x\n", hr);
683 hr = IAudioClient_GetService(ses1_ac1, &IID_IAudioSessionControl, (void**)&ses1_ctl);
684 ok(hr == S_OK, "GetService failed: %08x\n", hr);
686 hr = IAudioClient_GetService(ses1_ac1, &IID_IAudioSessionControl, (void**)&ses1_ctl2);
687 ok(hr == S_OK, "GetService failed: %08x\n", hr);
688 ok(ses1_ctl == ses1_ctl2, "Got different controls: %p %p\n", ses1_ctl, ses1_ctl2);
689 ref = IAudioSessionControl_Release(ses1_ctl2);
690 ok(ref != 0, "AudioSessionControl was destroyed\n");
692 hr = IAudioClient_GetService(ses1_ac2, &IID_IAudioSessionControl, (void**)&ses1_ctl2);
693 ok(hr == S_OK, "GetService failed: %08x\n", hr);
695 hr = IAudioSessionControl_GetState(ses1_ctl, NULL);
696 ok(hr == NULL_PTR_ERR, "GetState gave wrong error: %08x\n", hr);
698 hr = IAudioSessionControl_GetState(ses1_ctl, &state);
699 ok(hr == S_OK, "GetState failed: %08x\n", hr);
700 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
702 hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
703 ok(hr == S_OK, "GetState failed: %08x\n", hr);
704 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
707 hr = IAudioSessionControl_GetState(cap_ctl, &state);
708 ok(hr == S_OK, "GetState failed: %08x\n", hr);
709 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
712 hr = IAudioClient_Start(ses1_ac1);
713 ok(hr == S_OK, "Start failed: %08x\n", hr);
715 hr = IAudioSessionControl_GetState(ses1_ctl, &state);
716 ok(hr == S_OK, "GetState failed: %08x\n", hr);
717 ok(state == AudioSessionStateActive, "Got wrong state: %d\n", state);
719 hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
720 ok(hr == S_OK, "GetState failed: %08x\n", hr);
721 ok(state == AudioSessionStateActive, "Got wrong state: %d\n", state);
724 hr = IAudioSessionControl_GetState(cap_ctl, &state);
725 ok(hr == S_OK, "GetState failed: %08x\n", hr);
726 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
729 hr = IAudioClient_Stop(ses1_ac1);
730 ok(hr == S_OK, "Start failed: %08x\n", hr);
732 hr = IAudioSessionControl_GetState(ses1_ctl, &state);
733 ok(hr == S_OK, "GetState failed: %08x\n", hr);
734 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
736 hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
737 ok(hr == S_OK, "GetState failed: %08x\n", hr);
738 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
741 hr = IAudioSessionControl_GetState(cap_ctl, &state);
742 ok(hr == S_OK, "GetState failed: %08x\n", hr);
743 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
745 hr = IAudioClient_Start(cap_ac);
746 ok(hr == S_OK, "Start failed: %08x\n", hr);
748 hr = IAudioSessionControl_GetState(ses1_ctl, &state);
749 ok(hr == S_OK, "GetState failed: %08x\n", hr);
750 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
752 hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
753 ok(hr == S_OK, "GetState failed: %08x\n", hr);
754 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
756 hr = IAudioSessionControl_GetState(cap_ctl, &state);
757 ok(hr == S_OK, "GetState failed: %08x\n", hr);
758 ok(state == AudioSessionStateActive, "Got wrong state: %d\n", state);
760 hr = IAudioClient_Stop(cap_ac);
761 ok(hr == S_OK, "Stop failed: %08x\n", hr);
763 hr = IAudioSessionControl_GetState(ses1_ctl, &state);
764 ok(hr == S_OK, "GetState failed: %08x\n", hr);
765 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
767 hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
768 ok(hr == S_OK, "GetState failed: %08x\n", hr);
769 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
771 hr = IAudioSessionControl_GetState(cap_ctl, &state);
772 ok(hr == S_OK, "GetState failed: %08x\n", hr);
773 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
775 ref = IAudioSessionControl_Release(cap_ctl);
776 ok(ref == 0, "AudioSessionControl wasn't released: %u\n", ref);
778 ref = IAudioClient_Release(cap_ac);
779 ok(ref == 0, "AudioClient wasn't released: %u\n", ref);
782 ref = IAudioSessionControl_Release(ses1_ctl);
783 ok(ref == 0, "AudioSessionControl wasn't released: %u\n", ref);
785 ref = IAudioClient_Release(ses1_ac1);
786 ok(ref == 0, "AudioClient wasn't released: %u\n", ref);
788 ref = IAudioClient_Release(ses1_ac2);
789 ok(ref == 1, "AudioClient had wrong refcount: %u\n", ref);
791 /* we've released all of our IAudioClient references, so check GetState */
792 hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
793 ok(hr == S_OK, "GetState failed: %08x\n", hr);
794 ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
796 ref = IAudioSessionControl_Release(ses1_ctl2);
797 ok(ref == 0, "AudioSessionControl wasn't released: %u\n", ref);
806 CoInitializeEx(NULL, COINIT_MULTITHREADED);
807 hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&mme);
810 skip("mmdevapi not available: 0x%08x\n", hr);
814 hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(mme, eRender, eMultimedia, &dev);
815 ok(hr == S_OK || hr == E_NOTFOUND, "GetDefaultAudioEndpoint failed: 0x%08x\n", hr);
816 if (hr != S_OK || !dev)
818 if (hr == E_NOTFOUND)
819 skip("No sound card available\n");
821 skip("GetDefaultAudioEndpoint returns 0x%08x\n", hr);
832 IMMDevice_Release(dev);
836 IMMDeviceEnumerator_Release(mme);