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