Andrew Eikum : mmdevapi/tests: Add tests for IAudioSessionControl::GetState .

Alexandre Julliard julliard at winehq.org
Mon May 2 14:16:17 CDT 2011


Module: wine
Branch: master
Commit: 4d2622e65b002ebed407186a00353a5649703b5c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4d2622e65b002ebed407186a00353a5649703b5c

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Mon May  2 08:22:31 2011 -0500

mmdevapi/tests: Add tests for IAudioSessionControl::GetState.

---

 dlls/mmdevapi/tests/mmdevenum.c |    1 +
 dlls/mmdevapi/tests/render.c    |  197 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 197 insertions(+), 1 deletions(-)

diff --git a/dlls/mmdevapi/tests/mmdevenum.c b/dlls/mmdevapi/tests/mmdevenum.c
index 98c25a1..a0898b3 100644
--- a/dlls/mmdevapi/tests/mmdevenum.c
+++ b/dlls/mmdevapi/tests/mmdevenum.c
@@ -23,6 +23,7 @@
 #include "initguid.h"
 #include "mmdeviceapi.h"
 #include "audioclient.h"
+#include "audiopolicy.h"
 #include "dshow.h"
 #include "dsound.h"
 #include "devpkey.h"
diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c
index 7c8174b..659ce62 100644
--- a/dlls/mmdevapi/tests/render.c
+++ b/dlls/mmdevapi/tests/render.c
@@ -33,9 +33,25 @@
 #include "uuids.h"
 #include "mmdeviceapi.h"
 #include "audioclient.h"
+#include "audiopolicy.h"
 
+#include <stdio.h>
+
+#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
+
+static IMMDeviceEnumerator *mme = NULL;
 static IMMDevice *dev = NULL;
 
+static inline const char *dbgstr_guid( const GUID *id )
+{
+    static char ret[256];
+    sprintf(ret, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
+                             id->Data1, id->Data2, id->Data3,
+                             id->Data4[0], id->Data4[1], id->Data4[2], id->Data4[3],
+                             id->Data4[4], id->Data4[5], id->Data4[6], id->Data4[7] );
+    return ret;
+}
+
 static void test_uninitialized(IAudioClient *ac)
 {
     HRESULT hr;
@@ -604,10 +620,188 @@ static void test_clock(void)
     IAudioClient_Release(ac);
 }
 
+static void test_session(void)
+{
+    IAudioClient *ses1_ac1, *ses1_ac2, *cap_ac = NULL;
+    IAudioSessionControl2 *ses1_ctl, *ses1_ctl2, *cap_ctl;
+    IMMDevice *cap_dev;
+    GUID ses1_guid;
+    AudioSessionState state;
+    WAVEFORMATEX *pwfx;
+    ULONG ref;
+    HRESULT hr;
+
+    hr = CoCreateGuid(&ses1_guid);
+    ok(hr == S_OK, "CoCreateGuid failed: %08x\n", hr);
+
+    hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
+            NULL, (void**)&ses1_ac1);
+    ok(hr == S_OK, "Activation failed with %08x\n", hr);
+
+    hr = IAudioClient_GetMixFormat(ses1_ac1, &pwfx);
+    ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
+
+    hr = IAudioClient_Initialize(ses1_ac1, AUDCLNT_SHAREMODE_SHARED,
+            0, 5000000, 0, pwfx, &ses1_guid);
+    ok(hr == S_OK, "Initialize failed: %08x\n", hr);
+
+    hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
+            NULL, (void**)&ses1_ac2);
+    ok(hr == S_OK, "Activation failed with %08x\n", hr);
+
+    hr = IAudioClient_Initialize(ses1_ac2, AUDCLNT_SHAREMODE_SHARED,
+            0, 5000000, 0, pwfx, &ses1_guid);
+    ok(hr == S_OK, "Initialize failed: %08x\n", hr);
+
+    hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(mme, eCapture,
+            eMultimedia, &cap_dev);
+    if(hr == S_OK){
+        WAVEFORMATEX *cap_pwfx;
+
+        hr = IMMDevice_Activate(cap_dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
+                NULL, (void**)&cap_ac);
+        ok(hr == S_OK, "Activate failed: %08x\n", hr);
+
+        hr = IAudioClient_GetMixFormat(cap_ac, &cap_pwfx);
+        ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
+
+        hr = IAudioClient_Initialize(cap_ac, AUDCLNT_SHAREMODE_SHARED,
+                0, 5000000, 0, cap_pwfx, &ses1_guid);
+        ok(hr == S_OK, "Initialize failed: %08x\n", hr);
+
+        hr = IAudioClient_GetService(cap_ac, &IID_IAudioSessionControl, (void**)&cap_ctl);
+        ok(hr == S_OK, "GetService failed: %08x\n", hr);
+
+        IMMDevice_Release(cap_dev);
+        CoTaskMemFree(cap_pwfx);
+    }else
+        skip("No capture device available; skipping capture device in render session tests\n");
+
+    hr = IAudioClient_GetService(ses1_ac1, &IID_IAudioSessionControl2, (void**)&ses1_ctl);
+    ok(hr == E_NOINTERFACE, "GetService gave wrong error: %08x\n", hr);
+
+    hr = IAudioClient_GetService(ses1_ac1, &IID_IAudioSessionControl, (void**)&ses1_ctl);
+    ok(hr == S_OK, "GetService failed: %08x\n", hr);
+
+    hr = IAudioClient_GetService(ses1_ac1, &IID_IAudioSessionControl, (void**)&ses1_ctl2);
+    ok(hr == S_OK, "GetService failed: %08x\n", hr);
+    ok(ses1_ctl == ses1_ctl2, "Got different controls: %p %p\n", ses1_ctl, ses1_ctl2);
+    ref = IAudioSessionControl_Release(ses1_ctl2);
+    ok(ref != 0, "AudioSessionControl was destroyed\n");
+
+    hr = IAudioClient_GetService(ses1_ac2, &IID_IAudioSessionControl, (void**)&ses1_ctl2);
+    ok(hr == S_OK, "GetService failed: %08x\n", hr);
+
+    hr = IAudioSessionControl_GetState(ses1_ctl, NULL);
+    ok(hr == NULL_PTR_ERR, "GetState gave wrong error: %08x\n", hr);
+
+    hr = IAudioSessionControl_GetState(ses1_ctl, &state);
+    ok(hr == S_OK, "GetState failed: %08x\n", hr);
+    ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+    hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
+    ok(hr == S_OK, "GetState failed: %08x\n", hr);
+    ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+    if(cap_ac){
+        hr = IAudioSessionControl_GetState(cap_ctl, &state);
+        ok(hr == S_OK, "GetState failed: %08x\n", hr);
+        ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+    }
+
+    hr = IAudioClient_Start(ses1_ac1);
+    ok(hr == S_OK, "Start failed: %08x\n", hr);
+
+    hr = IAudioSessionControl_GetState(ses1_ctl, &state);
+    ok(hr == S_OK, "GetState failed: %08x\n", hr);
+    ok(state == AudioSessionStateActive, "Got wrong state: %d\n", state);
+
+    hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
+    ok(hr == S_OK, "GetState failed: %08x\n", hr);
+    ok(state == AudioSessionStateActive, "Got wrong state: %d\n", state);
+
+    if(cap_ac){
+        hr = IAudioSessionControl_GetState(cap_ctl, &state);
+        ok(hr == S_OK, "GetState failed: %08x\n", hr);
+        ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+    }
+
+    hr = IAudioClient_Stop(ses1_ac1);
+    ok(hr == S_OK, "Start failed: %08x\n", hr);
+
+    hr = IAudioSessionControl_GetState(ses1_ctl, &state);
+    ok(hr == S_OK, "GetState failed: %08x\n", hr);
+    ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+    hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
+    ok(hr == S_OK, "GetState failed: %08x\n", hr);
+    ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+    if(cap_ac){
+        hr = IAudioSessionControl_GetState(cap_ctl, &state);
+        ok(hr == S_OK, "GetState failed: %08x\n", hr);
+        ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+        hr = IAudioClient_Start(cap_ac);
+        ok(hr == S_OK, "Start failed: %08x\n", hr);
+
+        hr = IAudioSessionControl_GetState(ses1_ctl, &state);
+        ok(hr == S_OK, "GetState failed: %08x\n", hr);
+        ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+        hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
+        ok(hr == S_OK, "GetState failed: %08x\n", hr);
+        ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+        hr = IAudioSessionControl_GetState(cap_ctl, &state);
+        ok(hr == S_OK, "GetState failed: %08x\n", hr);
+        ok(state == AudioSessionStateActive, "Got wrong state: %d\n", state);
+
+        hr = IAudioClient_Stop(cap_ac);
+        ok(hr == S_OK, "Stop failed: %08x\n", hr);
+
+        hr = IAudioSessionControl_GetState(ses1_ctl, &state);
+        ok(hr == S_OK, "GetState failed: %08x\n", hr);
+        ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+        hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
+        ok(hr == S_OK, "GetState failed: %08x\n", hr);
+        ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+        hr = IAudioSessionControl_GetState(cap_ctl, &state);
+        ok(hr == S_OK, "GetState failed: %08x\n", hr);
+        ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+        ref = IAudioSessionControl_Release(cap_ctl);
+        ok(ref == 0, "AudioSessionControl wasn't released: %u\n", ref);
+
+        ref = IAudioClient_Release(cap_ac);
+        ok(ref == 0, "AudioClient wasn't released: %u\n", ref);
+    }
+
+    ref = IAudioSessionControl_Release(ses1_ctl);
+    ok(ref == 0, "AudioSessionControl wasn't released: %u\n", ref);
+
+    ref = IAudioClient_Release(ses1_ac1);
+    ok(ref == 0, "AudioClient wasn't released: %u\n", ref);
+
+    ref = IAudioClient_Release(ses1_ac2);
+    ok(ref == 1, "AudioClient had wrong refcount: %u\n", ref);
+
+    /* we've released all of our IAudioClient references, so check GetState */
+    hr = IAudioSessionControl_GetState(ses1_ctl2, &state);
+    ok(hr == S_OK, "GetState failed: %08x\n", hr);
+    ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
+
+    ref = IAudioSessionControl_Release(ses1_ctl2);
+    ok(ref == 0, "AudioSessionControl wasn't released: %u\n", ref);
+
+    CoTaskMemFree(pwfx);
+}
+
 START_TEST(render)
 {
     HRESULT hr;
-    IMMDeviceEnumerator *mme = NULL;
 
     CoInitializeEx(NULL, COINIT_MULTITHREADED);
     hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&mme);
@@ -633,6 +827,7 @@ START_TEST(render)
     test_event();
     test_padding();
     test_clock();
+    test_session();
 
     IMMDevice_Release(dev);
 




More information about the wine-cvs mailing list