mmdevapi: Allow GetPropValue function in audio drivers.
This commit is contained in:
parent
a4fcba60b9
commit
b1ff68b803
|
@ -264,6 +264,25 @@ static HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERT
|
||||||
return hr;
|
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
|
/* Creates or updates the state of a device
|
||||||
* If GUID is null, a random guid will be assigned
|
* If GUID is null, a random guid will be assigned
|
||||||
* and the device will be created
|
* 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
|
{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)
|
for (i = 0; i < MMDevice_count; ++i)
|
||||||
{
|
{
|
||||||
MMDevice *device = MMDevice_head[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;
|
pv.u.pwszVal = guidstr;
|
||||||
MMDevice_SetPropValue(id, flow, &deviceinterface_key, &pv);
|
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(keyprop);
|
||||||
}
|
}
|
||||||
RegCloseKey(key);
|
RegCloseKey(key);
|
||||||
|
|
|
@ -97,6 +97,9 @@ static BOOL load_driver(const WCHAR *name, DriverFuncs *driver)
|
||||||
LDFC(GetAudioSessionManager);
|
LDFC(GetAudioSessionManager);
|
||||||
#undef LDFC
|
#undef LDFC
|
||||||
|
|
||||||
|
/* optional - do not fail if not found */
|
||||||
|
driver->pGetPropValue = (void*)GetProcAddress(driver->module, "GetPropValue");
|
||||||
|
|
||||||
driver->priority = driver->pGetPriority();
|
driver->priority = driver->pGetPriority();
|
||||||
lstrcpyW(driver->module_name, driver_module);
|
lstrcpyW(driver->module_name, driver_module);
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,8 @@ typedef struct _DriverFuncs {
|
||||||
IAudioClient **out);
|
IAudioClient **out);
|
||||||
HRESULT (WINAPI *pGetAudioSessionManager)(IMMDevice *device,
|
HRESULT (WINAPI *pGetAudioSessionManager)(IMMDevice *device,
|
||||||
IAudioSessionManager2 **out);
|
IAudioSessionManager2 **out);
|
||||||
|
HRESULT (WINAPI *pGetPropValue)(GUID *guid,
|
||||||
|
const PROPERTYKEY *prop, PROPVARIANT *out);
|
||||||
} DriverFuncs;
|
} DriverFuncs;
|
||||||
|
|
||||||
extern DriverFuncs drvs DECLSPEC_HIDDEN;
|
extern DriverFuncs drvs DECLSPEC_HIDDEN;
|
||||||
|
|
Loading…
Reference in New Issue