From: Mark Harmstone Subject: [PATCH 1/2] mmdevapi: allow GetPropValue function in audio drivers (try 2) Message-Id: <546CAAA2.3050903@burntcomma.com> Date: Wed, 19 Nov 2014 14:35:14 +0000 --- dlls/mmdevapi/devenum.c | 36 ++++++++++++++++++++++++++++++++++++ dlls/mmdevapi/main.c | 3 +++ dlls/mmdevapi/mmdevapi.h | 2 ++ 3 files changed, 41 insertions(+) diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c index e2a7cc5..4ec529c 100644 --- a/dlls/mmdevapi/devenum.c +++ b/dlls/mmdevapi/devenum.c @@ -264,6 +264,28 @@ 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) + { + TRACE("Driver does not implement GetPropValue\n"); + 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 +301,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 +364,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); diff --git a/dlls/mmdevapi/main.c b/dlls/mmdevapi/main.c index 447813f..52cf6f1 100644 --- a/dlls/mmdevapi/main.c +++ b/dlls/mmdevapi/main.c @@ -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); diff --git a/dlls/mmdevapi/mmdevapi.h b/dlls/mmdevapi/mmdevapi.h index 2a04780..2b40a05 100644 --- a/dlls/mmdevapi/mmdevapi.h +++ b/dlls/mmdevapi/mmdevapi.h @@ -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;