From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 5a1e2414806..826adcfde2d 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -204,18 +204,24 @@ static void get_device_guid(EDataFlow flow, const char *device, GUID *guid) RegCloseKey(key); }
-static const OSSDevice *get_ossdevice_from_guid(const GUID *guid) +static BOOL get_device_name_by_guid(const GUID *guid, char *name, const SIZE_T name_size, EDataFlow *flow) { OSSDevice *dev_item; - LIST_FOR_EACH_ENTRY(dev_item, &g_devices, OSSDevice, entry) - if(IsEqualGUID(guid, &dev_item->guid)) - return dev_item; - return NULL; + LIST_FOR_EACH_ENTRY(dev_item, &g_devices, OSSDevice, entry){ + if(IsEqualGUID(guid, &dev_item->guid)){ + if(flow) + *flow = dev_item->flow; + strncpy(name, dev_item->devnode, name_size); + return TRUE; + } + } + + return FALSE; }
static void device_add(OSSDevice *oss_dev) { - if(get_ossdevice_from_guid(&oss_dev->guid)) /* already in list */ + if(get_device_name_by_guid(&oss_dev->guid, NULL, 0, NULL)) /* already in list */ HeapFree(GetProcessHeap(), 0, oss_dev); else list_add_tail(&g_devices, &oss_dev->entry); @@ -295,22 +301,22 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) { ACImpl *This; - const OSSDevice *oss_dev; + char name[256]; + SIZE_T len; + EDataFlow dataflow; HRESULT hr; - int len;
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
- oss_dev = get_ossdevice_from_guid(guid); - if(!oss_dev){ + if(!get_device_name_by_guid(guid, name, sizeof(name), &dataflow)){ WARN("Unknown GUID: %s\n", debugstr_guid(guid)); return AUDCLNT_E_DEVICE_INVALIDATED; }
- if(oss_dev->flow != eRender && oss_dev->flow != eCapture) + if(dataflow != eRender && dataflow != eCapture) return E_INVALIDARG;
- len = strlen(oss_dev->devnode); + len = strlen(name); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[len + 1])); if(!This) return E_OUTOFMEMORY; @@ -321,8 +327,8 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, return hr; }
- This->dataflow = oss_dev->flow; - strcpy(This->device_name, oss_dev->devnode); + This->dataflow = dataflow; + memcpy(This->device_name, name, len + 1);
This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl;