Andrew Eikum : mmdevapi: Add support for IAudioSessionManager in IMMDevice: :Activate.

Alexandre Julliard julliard at winehq.org
Mon Jun 6 15:19:09 CDT 2011


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

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Mon Jun  6 08:49:48 2011 -0500

mmdevapi: Add support for IAudioSessionManager in IMMDevice::Activate.

---

 dlls/mmdevapi/devenum.c      |    2 +-
 dlls/mmdevapi/main.c         |    1 +
 dlls/mmdevapi/mmdevapi.h     |    2 +
 dlls/mmdevapi/tests/render.c |  105 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 109 insertions(+), 1 deletions(-)

diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c
index d2a4620..7f94917 100644
--- a/dlls/mmdevapi/devenum.c
+++ b/dlls/mmdevapi/devenum.c
@@ -547,7 +547,7 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls
     else if (IsEqualIID(riid, &IID_IAudioSessionManager)
              || IsEqualIID(riid, &IID_IAudioSessionManager2))
     {
-        FIXME("IID_IAudioSessionManager unsupported\n");
+        hr = drvs.pGetAudioSessionManager(This->flow, (IAudioSessionManager2**)ppv);
     }
     else if (IsEqualIID(riid, &IID_IBaseFilter))
     {
diff --git a/dlls/mmdevapi/main.c b/dlls/mmdevapi/main.c
index ed0039a..f65ea3a 100644
--- a/dlls/mmdevapi/main.c
+++ b/dlls/mmdevapi/main.c
@@ -75,6 +75,7 @@ static BOOL load_driver(const WCHAR *name)
         if(!drvs.p##n) { FreeLibrary(drvs.module); return FALSE; } } while(0)
     LDFC(GetEndpointIDs);
     LDFC(GetAudioEndpoint);
+    LDFC(GetAudioSessionManager);
 #undef LDFC
 
     TRACE("Successfully loaded %s\n", wine_dbgstr_w(driver_module));
diff --git a/dlls/mmdevapi/mmdevapi.h b/dlls/mmdevapi/mmdevapi.h
index 9740395..f3a26b9 100644
--- a/dlls/mmdevapi/mmdevapi.h
+++ b/dlls/mmdevapi/mmdevapi.h
@@ -37,6 +37,8 @@ typedef struct _DriverFuncs {
             void ***keys, UINT *num, UINT *default_index);
     HRESULT WINAPI (*pGetAudioEndpoint)(void *key, IMMDevice *dev,
             EDataFlow dataflow, IAudioClient **out);
+    HRESULT WINAPI (*pGetAudioSessionManager)(EDataFlow flow,
+            IAudioSessionManager2 **out);
 } DriverFuncs;
 
 extern DriverFuncs drvs DECLSPEC_HIDDEN;
diff --git a/dlls/mmdevapi/tests/render.c b/dlls/mmdevapi/tests/render.c
index 1e54dab..c0507fe 100644
--- a/dlls/mmdevapi/tests/render.c
+++ b/dlls/mmdevapi/tests/render.c
@@ -1213,6 +1213,110 @@ static void test_volume_dependence(void)
     IAudioClient_Release(ac);
 }
 
+static void test_session_creation(void)
+{
+    IMMDevice *cap_dev;
+    IAudioClient *ac;
+    IAudioSessionManager *sesm;
+    ISimpleAudioVolume *sav;
+    GUID session_guid;
+    float vol;
+    HRESULT hr;
+    WAVEFORMATEX *fmt;
+
+    CoCreateGuid(&session_guid);
+
+    hr = IMMDevice_Activate(dev, &IID_IAudioSessionManager,
+            CLSCTX_INPROC_SERVER, NULL, (void**)&sesm);
+    ok(hr == S_OK, "Activate failed: %08x\n", hr);
+
+    hr = IAudioSessionManager_GetSimpleAudioVolume(sesm, &session_guid,
+            FALSE, &sav);
+    ok(hr == S_OK, "GetSimpleAudioVolume failed: %08x\n", hr);
+
+    hr = ISimpleAudioVolume_SetMasterVolume(sav, 0.6f, NULL);
+    ok(hr == S_OK, "SetMasterVolume failed: %08x\n", hr);
+
+    /* Release completely to show session persistence */
+    ISimpleAudioVolume_Release(sav);
+    IAudioSessionManager_Release(sesm);
+
+    /* test if we can create a capture audioclient in the session we just
+     * created from a SessionManager derived from a render device */
+    hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(mme, eCapture,
+            eMultimedia, &cap_dev);
+    if(hr == S_OK){
+        WAVEFORMATEX *cap_pwfx;
+        IAudioClient *cap_ac;
+        ISimpleAudioVolume *cap_sav;
+        IAudioSessionManager *cap_sesm;
+
+        hr = IMMDevice_Activate(cap_dev, &IID_IAudioSessionManager,
+                CLSCTX_INPROC_SERVER, NULL, (void**)&cap_sesm);
+        ok(hr == S_OK, "Activate failed: %08x\n", hr);
+
+        hr = IAudioSessionManager_GetSimpleAudioVolume(cap_sesm, &session_guid,
+                FALSE, &cap_sav);
+        ok(hr == S_OK, "GetSimpleAudioVolume failed: %08x\n", hr);
+
+        vol = 0.5f;
+        hr = ISimpleAudioVolume_GetMasterVolume(cap_sav, &vol);
+        ok(hr == S_OK, "GetMasterVolume failed: %08x\n", hr);
+        ok(vol == 1.f, "Got wrong volume: %f\n", vol);
+
+        ISimpleAudioVolume_Release(cap_sav);
+        IAudioSessionManager_Release(cap_sesm);
+
+        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, &session_guid);
+        ok(hr == S_OK, "Initialize failed: %08x\n", hr);
+
+        hr = IAudioClient_GetService(cap_ac, &IID_ISimpleAudioVolume,
+                (void**)&cap_sav);
+        ok(hr == S_OK, "GetService failed: %08x\n", hr);
+
+        vol = 0.5f;
+        hr = ISimpleAudioVolume_GetMasterVolume(cap_sav, &vol);
+        ok(hr == S_OK, "GetMasterVolume failed: %08x\n", hr);
+        ok(vol == 1.f, "Got wrong volume: %f\n", vol);
+
+        CoTaskMemFree(cap_pwfx);
+        ISimpleAudioVolume_Release(cap_sav);
+        IAudioClient_Release(cap_ac);
+        IMMDevice_Release(cap_dev);
+    }
+
+    hr = IMMDevice_Activate(dev, &IID_IAudioClient, CLSCTX_INPROC_SERVER,
+            NULL, (void**)&ac);
+    ok(hr == S_OK, "Activation failed with %08x\n", hr);
+
+    hr = IAudioClient_GetMixFormat(ac, &fmt);
+    ok(hr == S_OK, "GetMixFormat failed: %08x\n", hr);
+
+    hr = IAudioClient_Initialize(ac, AUDCLNT_SHAREMODE_SHARED,
+            AUDCLNT_STREAMFLAGS_NOPERSIST, 5000000, 0, fmt, &session_guid);
+    ok(hr == S_OK, "Initialize failed: %08x\n", hr);
+
+    hr = IAudioClient_GetService(ac, &IID_ISimpleAudioVolume, (void**)&sav);
+    ok(hr == S_OK, "GetService failed: %08x\n", hr);
+
+    vol = 0.5f;
+    hr = ISimpleAudioVolume_GetMasterVolume(sav, &vol);
+    ok(hr == S_OK, "GetMasterVolume failed: %08x\n", hr);
+    ok(fabs(vol - 0.6f) < 0.05f, "Got wrong volume: %f\n", vol);
+
+    CoTaskMemFree(fmt);
+    ISimpleAudioVolume_Release(sav);
+    IAudioClient_Release(ac);
+}
+
 START_TEST(render)
 {
     HRESULT hr;
@@ -1246,6 +1350,7 @@ START_TEST(render)
     test_channelvolume();
     test_simplevolume();
     test_volume_dependence();
+    test_session_creation();
 
     IMMDevice_Release(dev);
 




More information about the wine-cvs mailing list