From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 50 ++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 17 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 6bc1002bff7..63e6f53764b 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -204,21 +204,31 @@ 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_from_guid(GUID *guid, char **name, 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; + if(IsEqualGUID(guid, &dev_item->guid)){ + if((*name = strdup(dev_item->devnode))){ + return TRUE; + } + + return FALSE; + } + + return FALSE; }
static void device_add(OSSDevice *oss_dev) { - if(get_ossdevice_from_guid(&oss_dev->guid)) /* already in list */ - HeapFree(GetProcessHeap(), 0, oss_dev); - else - list_add_tail(&g_devices, &oss_dev->entry); + OSSDevice *dev_item; + LIST_FOR_EACH_ENTRY(dev_item, &g_devices, OSSDevice, entry) + if(IsEqualGUID(&oss_dev->guid, &dev_item->guid)){ /* already in list */ + HeapFree(GetProcessHeap(), 0, oss_dev); + return; + } + + list_add_tail(&g_devices, &oss_dev->entry); }
HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids_out, GUID **guids_out, @@ -295,25 +305,32 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) { ACImpl *This; - const OSSDevice *oss_dev; - HRESULT hr; + char *name; int len; + EDataFlow dataflow; + HRESULT hr;
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
- oss_dev = get_ossdevice_from_guid(guid); - if(!oss_dev){ + if(!get_device_name_from_guid(guid, &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){ + free(name); return E_UNEXPECTED; + }
- len = strlen(oss_dev->devnode); + len = strlen(name); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[len + 1])); - if(!This) + if(!This){ + free(name); return E_OUTOFMEMORY; + } + + memcpy(This->device_name, name, len + 1); + free(name);
hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->marshal); if (FAILED(hr)) { @@ -321,8 +338,7 @@ 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;
This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl;