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

This commit is contained in:
Andrew Eikum 2011-06-06 08:49:48 -05:00 committed by Alexandre Julliard
parent 38d80c7310
commit 4e7d039722
4 changed files with 109 additions and 1 deletions

View File

@ -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))
{

View File

@ -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));

View File

@ -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;

View File

@ -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);