Module: wine Branch: master Commit: 4e7d039722fa8f9c99ba7637aed5c988da87452b URL: http://source.winehq.org/git/wine.git/?a=commit;h=4e7d039722fa8f9c99ba7637ae...
Author: Andrew Eikum aeikum@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);