Commit fdab5056 authored by Davide Beatrici's avatar Davide Beatrici Committed by Alexandre Julliard

winepulse: Refactor get_device_name_from_guid() to allocate memory dynamically.

parent 8876a7ac
...@@ -245,7 +245,7 @@ end: ...@@ -245,7 +245,7 @@ end:
return params.result; return params.result;
} }
static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_NAME_LEN], EDataFlow *flow) static BOOL get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow)
{ {
struct device_cache *device; struct device_cache *device;
WCHAR key_name[MAX_PULSE_NAME_LEN + 2]; WCHAR key_name[MAX_PULSE_NAME_LEN + 2];
...@@ -253,13 +253,21 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N ...@@ -253,13 +253,21 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N
DWORD index = 0; DWORD index = 0;
HKEY key; HKEY key;
*name = NULL;
/* Return empty string for default PulseAudio device */ /* Return empty string for default PulseAudio device */
pulse_name[0] = 0;
if (IsEqualGUID(guid, &pulse_render_guid)) { if (IsEqualGUID(guid, &pulse_render_guid)) {
*flow = eRender; *flow = eRender;
return TRUE; if (!(*name = malloc(1)))
return FALSE;
} else if (IsEqualGUID(guid, &pulse_capture_guid)) { } else if (IsEqualGUID(guid, &pulse_capture_guid)) {
*flow = eCapture; *flow = eCapture;
if (!(*name = malloc(1)))
return FALSE;
}
if (*name) {
*name[0] = '\0';
return TRUE; return TRUE;
} }
...@@ -268,8 +276,10 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N ...@@ -268,8 +276,10 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N
if (!IsEqualGUID(guid, &device->guid)) if (!IsEqualGUID(guid, &device->guid))
continue; continue;
*flow = device->dataflow; *flow = device->dataflow;
strcpy(pulse_name, device->pulse_name); if ((*name = strdup(device->pulse_name)))
return TRUE; return TRUE;
return FALSE;
} }
if (RegOpenKeyExW(HKEY_CURRENT_USER, drv_key_devicesW, 0, KEY_READ | KEY_WOW64_64KEY, &key) != ERROR_SUCCESS) { if (RegOpenKeyExW(HKEY_CURRENT_USER, drv_key_devicesW, 0, KEY_READ | KEY_WOW64_64KEY, &key) != ERROR_SUCCESS) {
...@@ -311,13 +321,21 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N ...@@ -311,13 +321,21 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N
return FALSE; return FALSE;
} }
if (!(len = WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, pulse_name, MAX_PULSE_NAME_LEN, NULL, NULL))) if (!(len = WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, NULL, 0, NULL, NULL)))
return FALSE;
if (!(*name = malloc(len)))
return FALSE; return FALSE;
if (!WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, *name, len, NULL, NULL)) {
free(*name);
return FALSE;
}
if ((device = malloc(FIELD_OFFSET(struct device_cache, pulse_name[len])))) { if ((device = malloc(FIELD_OFFSET(struct device_cache, pulse_name[len])))) {
device->guid = reg_guid; device->guid = reg_guid;
device->dataflow = *flow; device->dataflow = *flow;
strcpy(device->pulse_name, pulse_name); memcpy(device->pulse_name, *name, len);
list_add_tail(&g_devices_cache, &device->entry); list_add_tail(&g_devices_cache, &device->entry);
} }
return TRUE; return TRUE;
...@@ -332,25 +350,32 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N ...@@ -332,25 +350,32 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N
HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out)
{ {
ACImpl *This; ACImpl *This;
char pulse_name[MAX_PULSE_NAME_LEN]; char *pulse_name;
EDataFlow dataflow; EDataFlow dataflow;
unsigned len; unsigned len;
HRESULT hr; HRESULT hr;
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out); TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
if (!get_pulse_name_by_guid(guid, pulse_name, &dataflow)) if (!get_device_name_from_guid(guid, &pulse_name, &dataflow))
return AUDCLNT_E_DEVICE_INVALIDATED; return AUDCLNT_E_DEVICE_INVALIDATED;
if (dataflow != eRender && dataflow != eCapture) if (dataflow != eRender && dataflow != eCapture) {
free(pulse_name);
return E_UNEXPECTED; return E_UNEXPECTED;
}
*out = NULL; *out = NULL;
len = strlen(pulse_name) + 1; len = strlen(pulse_name) + 1;
This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, FIELD_OFFSET(ACImpl, device_name[len])); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, FIELD_OFFSET(ACImpl, device_name[len]));
if (!This) if (!This) {
free(pulse_name);
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
}
memcpy(This->device_name, pulse_name, len);
free(pulse_name);
This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl;
This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl;
...@@ -360,7 +385,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient ...@@ -360,7 +385,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl; This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl;
This->dataflow = dataflow; This->dataflow = dataflow;
This->parent = dev; This->parent = dev;
memcpy(This->device_name, pulse_name, len);
hr = CoCreateFreeThreadedMarshaler((IUnknown*)&This->IAudioClient3_iface, &This->marshal); hr = CoCreateFreeThreadedMarshaler((IUnknown*)&This->IAudioClient3_iface, &This->marshal);
if (FAILED(hr)) { if (FAILED(hr)) {
...@@ -475,12 +499,12 @@ HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device ...@@ -475,12 +499,12 @@ HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device
HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out)
{ {
struct get_prop_value_params params; struct get_prop_value_params params;
char pulse_name[MAX_PULSE_NAME_LEN]; char *pulse_name;
unsigned int size = 0; unsigned int size = 0;
TRACE("%s, (%s,%lu), %p\n", wine_dbgstr_guid(guid), wine_dbgstr_guid(&prop->fmtid), prop->pid, out); TRACE("%s, (%s,%lu), %p\n", wine_dbgstr_guid(guid), wine_dbgstr_guid(&prop->fmtid), prop->pid, out);
if (!get_pulse_name_by_guid(guid, pulse_name, &params.flow)) if (!get_device_name_from_guid(guid, &pulse_name, &params.flow))
return E_FAIL; return E_FAIL;
params.device = pulse_name; params.device = pulse_name;
...@@ -498,11 +522,15 @@ HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARI ...@@ -498,11 +522,15 @@ HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARI
CoTaskMemFree(params.buffer); CoTaskMemFree(params.buffer);
params.buffer = CoTaskMemAlloc(*params.buffer_size); params.buffer = CoTaskMemAlloc(*params.buffer_size);
if(!params.buffer) if(!params.buffer) {
free(pulse_name);
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
}
} }
if(FAILED(params.result)) if(FAILED(params.result))
CoTaskMemFree(params.buffer); CoTaskMemFree(params.buffer);
free(pulse_name);
return params.result; return params.result;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment