[PATCH v7 0/2] MR11264: Hardware Device IDs from CoreAudio USB devices
-- v7: mmdevapi: Propagate the hardware Device_InstanceId coreaudio: Report USB device PKEY_Device_InstanceId https://gitlab.winehq.org/wine/wine/-/merge_requests/11264
From: Aric Stewart <aric@codeweavers.com> --- dlls/winecoreaudio.drv/coreaudio.c | 67 +++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index c7e0dc24048..163823392c6 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -64,6 +64,7 @@ #include "mmdeviceapi.h" #include "initguid.h" #include "audioclient.h" +#include "devpkey.h" #include "wine/debug.h" #include "wine/unixlib.h" @@ -1700,12 +1701,76 @@ static NTSTATUS unix_is_started(void *args) return STATUS_SUCCESS; } +static NTSTATUS get_device_vid_pid(const char *device, DWORD *vid, DWORD *pid) +{ + UInt32 type_property; + UInt32 size; + OSStatus sc; + AudioObjectPropertyAddress addr; + const AudioDeviceID dev_id = dev_id_from_device(device); + + addr.mScope = kAudioObjectPropertyScopeGlobal; + addr.mElement = kAudioObjectPropertyElementMain; + addr.mSelector = kAudioDevicePropertyTransportType; + type_property = 0; + size = sizeof(type_property); + sc = AudioObjectGetPropertyData(dev_id, &addr, 0, NULL, &size, &type_property); + if(sc == noErr && type_property == kAudioDeviceTransportTypeUSB){ + CFStringRef property_value = NULL; + + addr.mSelector = kAudioDevicePropertyModelUID; + size = sizeof(property_value); + sc = AudioObjectGetPropertyData(dev_id, &addr, 0, NULL, &size, &property_value); + if(sc == noErr){ + WCHAR output[255]; + + size = min(CFStringGetLength(property_value), ARRAY_SIZE(output) - 1); + CFStringGetCharacters(property_value, CFRangeMake(0, size), (UniChar*)output); + output[size] = 0; + CFRelease(property_value); + + if(size > 10 && output[size - 5] == ':' && output[size - 10] == ':'){ + *vid = wcstoul(&output[size - 9], NULL, 16); + *pid = wcstoul(&output[size - 4], NULL, 16); + return STATUS_SUCCESS; + } + } + } + return STATUS_UNSUCCESSFUL; +} + static NTSTATUS unix_get_prop_value(void *args) { struct get_prop_value_params *params = args; + const PROPERTYKEY *prop = params->prop; - params->result = E_NOTIMPL; + if(IsEqualPropertyKey(*prop, DEVPKEY_Device_InstanceId)){ + DWORD vid = 0, pid = 0; + + if (SUCCEEDED(get_device_vid_pid(params->device, &vid, &pid))){ + int len; + char buf[128]; + PROPVARIANT *out = params->value; + + len = sizeof(buf); + snprintf(buf, len, "{1}.USB\\VID_%04X&PID_%04X", vid, pid); + + len = strlen(buf) + 1; + if(*params->buffer_size < len * sizeof(WCHAR)){ + params->result = E_NOT_SUFFICIENT_BUFFER; + *params->buffer_size = len * sizeof(WCHAR); + return STATUS_SUCCESS; + } + + out->vt = VT_LPWSTR; + out->pwszVal = params->buffer; + ntdll_umbstowcs(buf, len, out->pwszVal, len); + params->result = S_OK; + return STATUS_SUCCESS; + } + } + params->result = E_NOTIMPL; return STATUS_SUCCESS; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11264
From: Aric Stewart <aric@codeweavers.com> --- dlls/mmdevapi/devenum.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c index 11d20f29957..8440b5d8630 100644 --- a/dlls/mmdevapi/devenum.c +++ b/dlls/mmdevapi/devenum.c @@ -503,6 +503,8 @@ static MMDevice *MMDevice_Create(const WCHAR *name, GUID *id, EDataFlow flow, DW pv.vt = VT_LPWSTR; pv.pwszVal = cur->drv_id; + set_driver_prop_value(id, flow, (const PROPERTYKEY*)&DEVPKEY_Device_InstanceId); + if (SUCCEEDED(set_driver_prop_value(id, flow, &devicepath_key))) { PROPVARIANT pv2; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11264
On Mon Jul 20 11:24:48 2026 +0000, Aric Stewart wrote:
changed this line in [version 7 of the diff](/wine/wine/-/merge_requests/11264/diffs?diff_id=282889&start_sha=cc0fd1219a5543a4bcde6722b9b6fef2e0af0f72#8db727d0ed9bb1d6b548671bccf11fe7350c496b_1734_1732) Sorry for the delay, all updated.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/11264#note_146117
This merge request was approved by Huw Davies. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11264
participants (3)
-
Aric Stewart -
Aric Stewart (@aricstewart) -
Huw Davies (@huw)