mmdevapi: Allow GetPropValue function in audio drivers.

This commit is contained in:
Mark Harmstone 2014-12-04 17:58:58 +00:00 committed by Alexandre Julliard
parent a4fcba60b9
commit b1ff68b803
3 changed files with 38 additions and 0 deletions

View file

@ -264,6 +264,25 @@ static HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERT
return hr;
}
static HRESULT set_driver_prop_value(GUID *id, const EDataFlow flow, const PROPERTYKEY *prop)
{
HRESULT hr;
PROPVARIANT pv;
if (!drvs.pGetPropValue)
return E_NOTIMPL;
hr = drvs.pGetPropValue(id, prop, &pv);
if (SUCCEEDED(hr))
{
MMDevice_SetPropValue(id, flow, prop, &pv);
PropVariantClear(&pv);
}
return hr;
}
/* Creates or updates the state of a device
* If GUID is null, a random guid will be assigned
* and the device will be created
@ -279,6 +298,10 @@ static MMDevice *MMDevice_Create(WCHAR *name, GUID *id, EDataFlow flow, DWORD st
{0x233164c8, 0x1b2c, 0x4c7d, {0xbc, 0x68, 0xb6, 0x71, 0x68, 0x7a, 0x25, 0x67}}, 1
};
static const PROPERTYKEY devicepath_key = {
{0xb3f8fa53, 0x0004, 0x438e, {0x90, 0x03, 0x51, 0xa4, 0x6e, 0x13, 0x9b, 0xfc}}, 2
};
for (i = 0; i < MMDevice_count; ++i)
{
MMDevice *device = MMDevice_head[i];
@ -338,6 +361,16 @@ static MMDevice *MMDevice_Create(WCHAR *name, GUID *id, EDataFlow flow, DWORD st
pv.u.pwszVal = guidstr;
MMDevice_SetPropValue(id, flow, &deviceinterface_key, &pv);
set_driver_prop_value(id, flow, &devicepath_key);
if (FAILED(set_driver_prop_value(id, flow, &PKEY_AudioEndpoint_FormFactor)))
{
pv.vt = VT_UI4;
pv.u.ulVal = (flow == eCapture) ? Microphone : Speakers;
MMDevice_SetPropValue(id, flow, &PKEY_AudioEndpoint_FormFactor, &pv);
}
RegCloseKey(keyprop);
}
RegCloseKey(key);

View file

@ -97,6 +97,9 @@ static BOOL load_driver(const WCHAR *name, DriverFuncs *driver)
LDFC(GetAudioSessionManager);
#undef LDFC
/* optional - do not fail if not found */
driver->pGetPropValue = (void*)GetProcAddress(driver->module, "GetPropValue");
driver->priority = driver->pGetPriority();
lstrcpyW(driver->module_name, driver_module);

View file

@ -54,6 +54,8 @@ typedef struct _DriverFuncs {
IAudioClient **out);
HRESULT (WINAPI *pGetAudioSessionManager)(IMMDevice *device,
IAudioSessionManager2 **out);
HRESULT (WINAPI *pGetPropValue)(GUID *guid,
const PROPERTYKEY *prop, PROPVARIANT *out);
} DriverFuncs;
extern DriverFuncs drvs DECLSPEC_HIDDEN;