diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c index c1625cf177a..6344ec66d34 100644 --- a/dlls/mmdevapi/devenum.c +++ b/dlls/mmdevapi/devenum.c @@ -240,21 +240,48 @@ static HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERT static HRESULT set_driver_prop_value(GUID *id, const EDataFlow flow, const PROPERTYKEY *prop) { - HRESULT hr; + struct get_prop_value_params params; PROPVARIANT pv; + char *dev_name; + unsigned int size = 0; - if (!drvs.pGetPropValue) - return E_NOTIMPL; + TRACE("%s, (%s,%lu)\n", wine_dbgstr_guid(id), wine_dbgstr_guid(&prop->fmtid), prop->pid); - hr = drvs.pGetPropValue(id, prop, &pv); + if (!drvs.pget_device_name_from_guid(id, &dev_name, ¶ms.flow)) + return E_FAIL; - if (SUCCEEDED(hr)) - { + params.device = dev_name; + params.guid = id; + params.prop = prop; + params.value = &pv; + params.buffer = NULL; + params.buffer_size = &size; + + while (1) { + __wine_unix_call(drvs.module_unixlib, get_prop_value, ¶ms); + + if (params.result != E_NOT_SUFFICIENT_BUFFER) + break; + + CoTaskMemFree(params.buffer); + params.buffer = CoTaskMemAlloc(*params.buffer_size); + if (!params.buffer) { + free(dev_name); + return E_OUTOFMEMORY; + } + } + + if (FAILED(params.result)) + CoTaskMemFree(params.buffer); + + free(dev_name); + + if (SUCCEEDED(params.result)) { MMDevice_SetPropValue(id, flow, prop, &pv); PropVariantClear(&pv); } - return hr; + return params.result; } struct product_name_overrides diff --git a/dlls/mmdevapi/main.c b/dlls/mmdevapi/main.c index 5ed27c9debd..43b5921dcc5 100644 --- a/dlls/mmdevapi/main.c +++ b/dlls/mmdevapi/main.c @@ -102,9 +102,6 @@ static BOOL load_driver(const WCHAR *name, DriverFuncs *driver) LDFC(GetEndpointIDs); #undef LDFC - /* optional - do not fail if not found */ - driver->pGetPropValue = (void*)GetProcAddress(driver->module, "GetPropValue"); - GetModuleFileNameW(NULL, path, ARRAY_SIZE(path)); params.name = wcsrchr(path, '\\'); params.name = params.name ? params.name + 1 : path; diff --git a/dlls/mmdevapi/mmdevapi_private.h b/dlls/mmdevapi/mmdevapi_private.h index 78582f4db69..f8bf7d3a440 100644 --- a/dlls/mmdevapi/mmdevapi_private.h +++ b/dlls/mmdevapi/mmdevapi_private.h @@ -50,8 +50,6 @@ typedef struct _DriverFuncs { * all of the elements in both arrays with HeapFree() */ HRESULT (WINAPI *pGetEndpointIDs)(EDataFlow flow, WCHAR ***ids, GUID **guids, UINT *num, UINT *default_index); - HRESULT (WINAPI *pGetPropValue)(GUID *guid, - const PROPERTYKEY *prop, PROPVARIANT *out); } DriverFuncs; extern DriverFuncs drvs DECLSPEC_HIDDEN; diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 3dbb88d880e..f7de3296567 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -311,42 +311,3 @@ BOOL WINAPI get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) WARN("No matching device in registry for GUID %s\n", debugstr_guid(guid)); return FALSE; } - -HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) -{ - struct get_prop_value_params params; - char *pulse_name; - unsigned int size = 0; - - TRACE("%s, (%s,%lu), %p\n", wine_dbgstr_guid(guid), wine_dbgstr_guid(&prop->fmtid), prop->pid, out); - - if (!get_device_name_from_guid(guid, &pulse_name, ¶ms.flow)) - return E_FAIL; - - params.device = pulse_name; - params.guid = guid; - params.prop = prop; - params.value = out; - params.buffer = NULL; - params.buffer_size = &size; - - while(1) { - pulse_call(get_prop_value, ¶ms); - - if(params.result != E_NOT_SUFFICIENT_BUFFER) - break; - - CoTaskMemFree(params.buffer); - params.buffer = CoTaskMemAlloc(*params.buffer_size); - if(!params.buffer) { - free(pulse_name); - return E_OUTOFMEMORY; - } - } - if(FAILED(params.result)) - CoTaskMemFree(params.buffer); - - free(pulse_name); - - return params.result; -} diff --git a/dlls/winepulse.drv/winepulse.drv.spec b/dlls/winepulse.drv/winepulse.drv.spec index fe5b62e053b..5bb84b1764d 100644 --- a/dlls/winepulse.drv/winepulse.drv.spec +++ b/dlls/winepulse.drv/winepulse.drv.spec @@ -1,7 +1,6 @@ # MMDevAPI driver functions @ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetPropValue(ptr ptr ptr) AUDDRV_GetPropValue # WinMM driver functions @ stdcall -private DriverProc(long long long long long) winealsa.drv.DriverProc