-- v3: winealsa: Remove GetPropValue. winepulse: Move GetPropValue into mmdevapi. wineoss: Add get_prop_value stub in unixlib. winecoreaudio: Add get_prop_value stub in unixlib.
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/coreaudio.c | 69 +++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index 18b70738215..e2bce64ea14 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -1733,6 +1733,15 @@ static NTSTATUS unix_is_started(void *args) return STATUS_SUCCESS; }
+static NTSTATUS unix_get_prop_value(void *args) +{ + struct get_prop_value_params *params = args; + + params->result = E_NOTIMPL; + + return STATUS_SUCCESS; +} + static NTSTATUS unix_set_volumes(void *args) { struct set_volumes_params *params = args; @@ -1816,7 +1825,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = unix_set_event_handle, unix_not_implemented, unix_is_started, - unix_not_implemented, + unix_get_prop_value, unix_midi_init, unix_midi_release, unix_midi_out_message, @@ -2184,6 +2193,62 @@ static NTSTATUS unix_wow64_set_event_handle(void *args) return STATUS_SUCCESS; }
+static NTSTATUS unix_wow64_get_prop_value(void *args) +{ + struct propvariant32 + { + WORD vt; + WORD pad1, pad2, pad3; + union + { + ULONG ulVal; + PTR32 ptr; + ULARGE_INTEGER uhVal; + }; + } *value32; + struct + { + PTR32 device; + EDataFlow flow; + PTR32 guid; + PTR32 prop; + HRESULT result; + PTR32 value; + PTR32 buffer; /* caller allocated buffer to hold value's strings */ + PTR32 buffer_size; + } *params32 = args; + PROPVARIANT value; + struct get_prop_value_params params = + { + .device = ULongToPtr(params32->device), + .flow = params32->flow, + .guid = ULongToPtr(params32->guid), + .prop = ULongToPtr(params32->prop), + .value = &value, + .buffer = ULongToPtr(params32->buffer), + .buffer_size = ULongToPtr(params32->buffer_size) + }; + unix_get_prop_value(¶ms); + params32->result = params.result; + if (SUCCEEDED(params.result)) + { + value32 = UlongToPtr(params32->value); + value32->vt = value.vt; + switch (value.vt) + { + case VT_UI4: + value32->ulVal = value.ulVal; + break; + case VT_LPWSTR: + value32->ptr = params32->buffer; + break; + default: + FIXME("Unhandled vt %04x\n", value.vt); + } + } + return STATUS_SUCCESS; +} + unixlib_entry_t __wine_unix_call_wow64_funcs[] = { unix_process_attach, @@ -2213,7 +2278,7 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = unix_wow64_set_event_handle, unix_not_implemented, unix_is_started, - unix_not_implemented, + unix_wow64_get_prop_value, unix_wow64_midi_init, unix_midi_release, unix_wow64_midi_out_message,
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/oss.c | 69 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-)
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 097e048d03b..1e839c57f5f 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1478,6 +1478,15 @@ static NTSTATUS oss_is_started(void *args) return oss_unlock_result(stream, ¶ms->result, stream->playing ? S_OK : S_FALSE); }
+static NTSTATUS oss_get_prop_value(void *args) +{ + struct get_prop_value_params *params = args; + + params->result = E_NOTIMPL; + + return STATUS_SUCCESS; +} + /* Aux driver */
static unsigned int num_aux; @@ -1724,7 +1733,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = oss_set_event_handle, oss_test_connect, oss_is_started, - oss_not_implemented, + oss_get_prop_value, oss_not_implemented, oss_midi_release, oss_midi_out_message, @@ -2109,6 +2118,62 @@ static NTSTATUS oss_wow64_set_event_handle(void *args) return STATUS_SUCCESS; }
+static NTSTATUS oss_wow64_get_prop_value(void *args) +{ + struct propvariant32 + { + WORD vt; + WORD pad1, pad2, pad3; + union + { + ULONG ulVal; + PTR32 ptr; + ULARGE_INTEGER uhVal; + }; + } *value32; + struct + { + PTR32 device; + EDataFlow flow; + PTR32 guid; + PTR32 prop; + HRESULT result; + PTR32 value; + PTR32 buffer; /* caller allocated buffer to hold value's strings */ + PTR32 buffer_size; + } *params32 = args; + PROPVARIANT value; + struct get_prop_value_params params = + { + .device = ULongToPtr(params32->device), + .flow = params32->flow, + .guid = ULongToPtr(params32->guid), + .prop = ULongToPtr(params32->prop), + .value = &value, + .buffer = ULongToPtr(params32->buffer), + .buffer_size = ULongToPtr(params32->buffer_size) + }; + oss_get_prop_value(¶ms); + params32->result = params.result; + if (SUCCEEDED(params.result)) + { + value32 = UlongToPtr(params32->value); + value32->vt = value.vt; + switch (value.vt) + { + case VT_UI4: + value32->ulVal = value.ulVal; + break; + case VT_LPWSTR: + value32->ptr = params32->buffer; + break; + default: + FIXME("Unhandled vt %04x\n", value.vt); + } + } + return STATUS_SUCCESS; +} + static NTSTATUS oss_wow64_aux_message(void *args) { struct @@ -2161,7 +2226,7 @@ unixlib_entry_t __wine_unix_call_wow64_funcs[] = oss_wow64_set_event_handle, oss_wow64_test_connect, oss_is_started, - oss_not_implemented, + oss_wow64_get_prop_value, oss_not_implemented, oss_midi_release, oss_wow64_midi_out_message,
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/devenum.c | 41 ++++++++++++++++++++++----- dlls/mmdevapi/main.c | 3 -- dlls/mmdevapi/mmdevapi_private.h | 2 -- dlls/winepulse.drv/mmdevdrv.c | 39 ------------------------- dlls/winepulse.drv/winepulse.drv.spec | 1 - 5 files changed, 34 insertions(+), 52 deletions(-)
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; + + TRACE("%s, (%s,%lu)\n", wine_dbgstr_guid(id), wine_dbgstr_guid(&prop->fmtid), prop->pid);
- if (!drvs.pGetPropValue) - return E_NOTIMPL; + if (!drvs.pget_device_name_from_guid(id, &dev_name, ¶ms.flow)) + return E_FAIL;
- hr = drvs.pGetPropValue(id, prop, &pv); + params.device = dev_name; + params.guid = id; + params.prop = prop; + params.value = &pv; + params.buffer = NULL; + params.buffer_size = &size;
- if (SUCCEEDED(hr)) - { + 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
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winealsa.drv/mmdevdrv.c | 45 ----------------------------- dlls/winealsa.drv/winealsa.drv.spec | 1 - 2 files changed, 46 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 50e53dcda41..caeade5be56 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -286,48 +286,3 @@ BOOL WINAPI get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow)
return FALSE; } - -HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) -{ - struct get_prop_value_params params; - char *name; - EDataFlow flow; - 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, &name, &flow)) - { - WARN("Unknown interface %s\n", debugstr_guid(guid)); - return E_NOINTERFACE; - } - - params.device = name; - params.flow = flow; - params.guid = guid; - params.prop = prop; - params.value = out; - params.buffer = NULL; - params.buffer_size = &size; - - while(1) { - ALSA_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(name); - return E_OUTOFMEMORY; - } - } - if(FAILED(params.result)) - CoTaskMemFree(params.buffer); - - free(name); - - return params.result; -} diff --git a/dlls/winealsa.drv/winealsa.drv.spec b/dlls/winealsa.drv/winealsa.drv.spec index ae6cfdd84ca..64089c6df10 100644 --- a/dlls/winealsa.drv/winealsa.drv.spec +++ b/dlls/winealsa.drv/winealsa.drv.spec @@ -6,4 +6,3 @@ # 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
This merge request was approved by Huw Davies.