From e87cb774d131963d2642d075977571585ec5da8d Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Tue, 3 Apr 2012 13:48:12 -0500 Subject: [PATCH] mmdevapi: Use device GUIDs as unique identifiers. --- dlls/mmdevapi/devenum.c | 104 ++++++++---------- dlls/mmdevapi/mmdevapi.h | 5 +- dlls/winealsa.drv/mmdevdrv.c | 31 ++---- dlls/winealsa.drv/winealsa.drv.spec | 2 +- dlls/winecoreaudio.drv/mmdevdrv.c | 29 +---- dlls/winecoreaudio.drv/winecoreaudio.drv.spec | 2 +- dlls/wineoss.drv/mmdevdrv.c | 25 +---- dlls/wineoss.drv/wineoss.drv.spec | 2 +- 8 files changed, 71 insertions(+), 129 deletions(-) diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c index 6f55c7c1c77..b41bfa5f8e6 100644 --- a/dlls/mmdevapi/devenum.c +++ b/dlls/mmdevapi/devenum.c @@ -261,67 +261,58 @@ static HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERT * If GUID is null, a random guid will be assigned * and the device will be created */ -static MMDevice *MMDevice_Create(WCHAR *name, void *devkey, GUID *id, EDataFlow flow, DWORD state, BOOL setdefault) +static MMDevice *MMDevice_Create(WCHAR *name, GUID *id, EDataFlow flow, DWORD state, BOOL setdefault) { HKEY key, root; - MMDevice *cur; + MMDevice *cur = NULL; WCHAR guidstr[39]; DWORD i; for (i = 0; i < MMDevice_count; ++i) { - cur = MMDevice_head[i]; - if (cur->flow == flow && !lstrcmpW(cur->drv_id, name)) - { - LONG ret; - /* Same device, update state */ - cur->state = state; - cur->key = devkey; - StringFromGUID2(&cur->devguid, guidstr, sizeof(guidstr)/sizeof(*guidstr)); - ret = RegOpenKeyExW(flow == eRender ? key_render : key_capture, guidstr, 0, KEY_WRITE, &key); - if (ret == ERROR_SUCCESS) - { - RegSetValueExW(key, reg_devicestate, 0, REG_DWORD, (const BYTE*)&state, sizeof(DWORD)); - RegCloseKey(key); - } - goto done; + MMDevice *device = MMDevice_head[i]; + if (device->flow == flow && IsEqualGUID(&device->devguid, id)){ + cur = device; + break; } } - /* No device found, allocate new one */ - cur = HeapAlloc(GetProcessHeap(), 0, sizeof(*cur)); - if (!cur){ - HeapFree(GetProcessHeap(), 0, devkey); - return NULL; - } - cur->drv_id = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(name)+1)*sizeof(WCHAR)); - if (!cur->drv_id) - { - HeapFree(GetProcessHeap(), 0, cur); - HeapFree(GetProcessHeap(), 0, devkey); - return NULL; - } - lstrcpyW(cur->drv_id, name); - cur->key = devkey; - cur->IMMDevice_iface.lpVtbl = &MMDeviceVtbl; - cur->IMMEndpoint_iface.lpVtbl = &MMEndpointVtbl; - cur->ref = 0; - InitializeCriticalSection(&cur->crst); - cur->crst.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": MMDevice.crst"); + if(!cur){ + /* No device found, allocate new one */ + cur = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cur)); + if (!cur) + return NULL; + + cur->IMMDevice_iface.lpVtbl = &MMDeviceVtbl; + cur->IMMEndpoint_iface.lpVtbl = &MMEndpointVtbl; + + InitializeCriticalSection(&cur->crst); + cur->crst.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": MMDevice.crst"); + + if (!MMDevice_head) + MMDevice_head = HeapAlloc(GetProcessHeap(), 0, sizeof(*MMDevice_head)); + else + MMDevice_head = HeapReAlloc(GetProcessHeap(), 0, MMDevice_head, sizeof(*MMDevice_head)*(1+MMDevice_count)); + MMDevice_head[MMDevice_count++] = cur; + }else if(cur->ref > 0) + WARN("Modifying an MMDevice with postitive reference count!\n"); + + if(cur->drv_id) + HeapFree(GetProcessHeap(), 0, cur->drv_id); + cur->drv_id = name; + cur->flow = flow; cur->state = state; - if (!id) - { - id = &cur->devguid; - CoCreateGuid(id); - } cur->devguid = *id; - StringFromGUID2(id, guidstr, sizeof(guidstr)/sizeof(*guidstr)); + + StringFromGUID2(&cur->devguid, guidstr, sizeof(guidstr)/sizeof(*guidstr)); + if (flow == eRender) root = key_render; else root = key_capture; - if (!RegCreateKeyExW(root, guidstr, 0, NULL, 0, KEY_WRITE|KEY_READ, NULL, &key, NULL)) + + if (RegCreateKeyExW(root, guidstr, 0, NULL, 0, KEY_WRITE|KEY_READ, NULL, &key, NULL) == ERROR_SUCCESS) { HKEY keyprop; RegSetValueExW(key, reg_devicestate, 0, REG_DWORD, (const BYTE*)&state, sizeof(DWORD)); @@ -336,13 +327,7 @@ static MMDevice *MMDevice_Create(WCHAR *name, void *devkey, GUID *id, EDataFlow } RegCloseKey(key); } - if (!MMDevice_head) - MMDevice_head = HeapAlloc(GetProcessHeap(), 0, sizeof(*MMDevice_head)); - else - MMDevice_head = HeapReAlloc(GetProcessHeap(), 0, MMDevice_head, sizeof(*MMDevice_head)*(1+MMDevice_count)); - MMDevice_head[MMDevice_count++] = cur; -done: if (setdefault) { if (flow == eRender) @@ -401,7 +386,10 @@ static HRESULT load_devices_from_reg(void) && SUCCEEDED(MMDevice_GetPropValue(&guid, curflow, (const PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &pv)) && pv.vt == VT_LPWSTR) { - MMDevice_Create(pv.u.pwszVal, NULL, &guid, curflow, + DWORD size_bytes = (strlenW(pv.u.pwszVal) + 1) * sizeof(WCHAR); + WCHAR *name = HeapAlloc(GetProcessHeap(), 0, size_bytes); + memcpy(name, pv.u.pwszVal, size_bytes); + MMDevice_Create(name, &guid, curflow, DEVICE_STATE_NOTPRESENT, FALSE); CoTaskMemFree(pv.u.pwszVal); } @@ -417,7 +405,7 @@ static HRESULT set_format(MMDevice *dev) WAVEFORMATEX *fmt; PROPVARIANT pv = { VT_EMPTY }; - hr = drvs.pGetAudioEndpoint(dev->key, &dev->IMMDevice_iface, dev->flow, &client); + hr = drvs.pGetAudioEndpoint(&dev->devguid, &dev->IMMDevice_iface, &client); if(FAILED(hr)) return hr; @@ -443,26 +431,25 @@ static HRESULT set_format(MMDevice *dev) static HRESULT load_driver_devices(EDataFlow flow) { WCHAR **ids; - void **keys; + GUID *guids; UINT num, def, i; HRESULT hr; if(!drvs.pGetEndpointIDs) return S_OK; - hr = drvs.pGetEndpointIDs(flow, &ids, &keys, &num, &def); + hr = drvs.pGetEndpointIDs(flow, &ids, &guids, &num, &def); if(FAILED(hr)) return hr; for(i = 0; i < num; ++i){ MMDevice *dev; - dev = MMDevice_Create(ids[i], keys[i], NULL, flow, DEVICE_STATE_ACTIVE, + dev = MMDevice_Create(ids[i], &guids[i], flow, DEVICE_STATE_ACTIVE, def == i); set_format(dev); - HeapFree(GetProcessHeap(), 0, ids[i]); } - HeapFree(GetProcessHeap(), 0, keys); + HeapFree(GetProcessHeap(), 0, guids); HeapFree(GetProcessHeap(), 0, ids); return S_OK; @@ -484,7 +471,6 @@ static void MMDevice_Destroy(MMDevice *This) This->crst.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->crst); HeapFree(GetProcessHeap(), 0, This->drv_id); - HeapFree(GetProcessHeap(), 0, This->key); HeapFree(GetProcessHeap(), 0, This); } @@ -546,7 +532,7 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls return E_POINTER; if (IsEqualIID(riid, &IID_IAudioClient)){ - hr = drvs.pGetAudioEndpoint(This->key, iface, This->flow, (IAudioClient**)ppv); + hr = drvs.pGetAudioEndpoint(&This->devguid, iface, (IAudioClient**)ppv); }else if (IsEqualIID(riid, &IID_IAudioEndpointVolume)) hr = AudioEndpointVolume_Create(This, (IAudioEndpointVolume**)ppv); else if (IsEqualIID(riid, &IID_IAudioSessionManager) diff --git a/dlls/mmdevapi/mmdevapi.h b/dlls/mmdevapi/mmdevapi.h index 98e0825f4a5..09bb307de35 100644 --- a/dlls/mmdevapi/mmdevapi.h +++ b/dlls/mmdevapi/mmdevapi.h @@ -50,9 +50,9 @@ typedef struct _DriverFuncs { * it is the caller's responsibility to free both arrays, and * all of the elements in both arrays with HeapFree() */ HRESULT WINAPI (*pGetEndpointIDs)(EDataFlow flow, WCHAR ***ids, - void ***keys, UINT *num, UINT *default_index); + GUID **guids, UINT *num, UINT *default_index); HRESULT WINAPI (*pGetAudioEndpoint)(void *key, IMMDevice *dev, - EDataFlow dataflow, IAudioClient **out); + IAudioClient **out); HRESULT WINAPI (*pGetAudioSessionManager)(IMMDevice *device, IAudioSessionManager2 **out); } DriverFuncs; @@ -70,7 +70,6 @@ typedef struct MMDevice { DWORD state; GUID devguid; WCHAR *drv_id; - void *key; } MMDevice; extern HRESULT AudioClient_Create(MMDevice *parent, IAudioClient **ppv) DECLSPEC_HIDDEN; diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 514401c3474..a3ac27b739c 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -340,7 +340,7 @@ static BOOL alsa_try_open(const char *devnode, snd_pcm_stream_t stream) } static HRESULT alsa_get_card_devices(EDataFlow flow, snd_pcm_stream_t stream, - WCHAR **ids, GUID **guids, UINT *num, snd_ctl_t *ctl, int card, + WCHAR **ids, GUID *guids, UINT *num, snd_ctl_t *ctl, int card, const WCHAR *cardnameW) { static const WCHAR dashW[] = {' ','-',' ',0}; @@ -401,13 +401,7 @@ static HRESULT alsa_get_card_devices(EDataFlow flow, snd_pcm_stream_t stream, MultiByteToWideChar(CP_UNIXCP, 0, devname, -1, ids[*num] + cardlen, len - cardlen); - guids[*num] = HeapAlloc(GetProcessHeap(), 0, sizeof(GUID)); - if(!guids[*num]){ - HeapFree(GetProcessHeap(), 0, info); - HeapFree(GetProcessHeap(), 0, ids[*num]); - return E_OUTOFMEMORY; - } - get_device_guid(flow, devnode, guids[*num]); + get_device_guid(flow, devnode, &guids[*num]); } ++(*num); @@ -423,7 +417,7 @@ static HRESULT alsa_get_card_devices(EDataFlow flow, snd_pcm_stream_t stream, } static void get_reg_devices(EDataFlow flow, snd_pcm_stream_t stream, WCHAR **ids, - GUID **guids, UINT *num) + GUID *guids, UINT *num) { static const WCHAR ALSAOutputDevices[] = {'A','L','S','A','O','u','t','p','u','t','D','e','v','i','c','e','s',0}; static const WCHAR ALSAInputDevices[] = {'A','L','S','A','I','n','p','u','t','D','e','v','i','c','e','s',0}; @@ -455,8 +449,7 @@ static void get_reg_devices(EDataFlow flow, snd_pcm_stream_t stream, WCHAR **ids ids[*num] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); memcpy(ids[*num], p, len * sizeof(WCHAR)); - guids[*num] = HeapAlloc(GetProcessHeap(), 0, sizeof(GUID)); - get_device_guid(flow, devname, guids[*num]); + get_device_guid(flow, devname, &guids[*num]); } ++*num; } @@ -469,7 +462,7 @@ static void get_reg_devices(EDataFlow flow, snd_pcm_stream_t stream, WCHAR **ids } } -static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR **ids, GUID **guids, +static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR **ids, GUID *guids, UINT *num) { snd_pcm_stream_t stream = (flow == eRender ? SND_PCM_STREAM_PLAYBACK : @@ -483,8 +476,7 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR **ids, GUID **guids, if(ids && guids){ *ids = HeapAlloc(GetProcessHeap(), 0, sizeof(defaultW)); memcpy(*ids, defaultW, sizeof(defaultW)); - *guids = HeapAlloc(GetProcessHeap(), 0, sizeof(GUID)); - get_device_guid(flow, defname, *guids); + get_device_guid(flow, defname, guids); } ++*num; } @@ -540,7 +532,7 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR **ids, GUID **guids, return S_OK; } -HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, GUID ***guids, +HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, GUID **guids, UINT *num, UINT *def_index) { HRESULT hr; @@ -559,7 +551,7 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, GUID ***guids } *ids = HeapAlloc(GetProcessHeap(), 0, *num * sizeof(WCHAR *)); - *guids = HeapAlloc(GetProcessHeap(), 0, *num * sizeof(GUID *)); + *guids = HeapAlloc(GetProcessHeap(), 0, *num * sizeof(GUID)); if(!*ids || !*guids){ HeapFree(GetProcessHeap(), 0, *ids); HeapFree(GetProcessHeap(), 0, *guids); @@ -571,10 +563,8 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, GUID ***guids hr = alsa_enum_devices(flow, *ids, *guids, num); if(FAILED(hr)){ int i; - for(i = 0; i < *num; ++i){ + for(i = 0; i < *num; ++i) HeapFree(GetProcessHeap(), 0, (*ids)[i]); - HeapFree(GetProcessHeap(), 0, (*guids)[i]); - } HeapFree(GetProcessHeap(), 0, *ids); HeapFree(GetProcessHeap(), 0, *guids); return E_OUTOFMEMORY; @@ -729,8 +719,7 @@ static BOOL get_alsa_name_by_guid(GUID *guid, char *name, DWORD name_size, EData return FALSE; } -HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, EDataFlow unused_flow, - IAudioClient **out) +HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) { ACImpl *This; int err; diff --git a/dlls/winealsa.drv/winealsa.drv.spec b/dlls/winealsa.drv/winealsa.drv.spec index cf3053b22c6..04fa05a9c12 100644 --- a/dlls/winealsa.drv/winealsa.drv.spec +++ b/dlls/winealsa.drv/winealsa.drv.spec @@ -6,5 +6,5 @@ # MMDevAPI driver functions @ stdcall -private GetPriority() AUDDRV_GetPriority @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioEndpoint(ptr ptr long ptr) AUDDRV_GetAudioEndpoint +@ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionManager(ptr ptr) AUDDRV_GetAudioSessionManager diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index a50af4f82fb..da0123b7bed 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -357,7 +357,7 @@ static void get_device_guid(EDataFlow flow, AudioDeviceID device, GUID *guid) } HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, - GUID ***guids, UINT *num, UINT *def_index) + GUID **guids, UINT *num, UINT *def_index) { UInt32 devsize, size; AudioDeviceID *devices; @@ -413,7 +413,7 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, return E_OUTOFMEMORY; } - *guids = HeapAlloc(GetProcessHeap(), 0, ndevices * sizeof(GUID *)); + *guids = HeapAlloc(GetProcessHeap(), 0, ndevices * sizeof(GUID)); if(!*ids){ HeapFree(GetProcessHeap(), 0, *ids); HeapFree(GetProcessHeap(), 0, devices); @@ -444,10 +444,8 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, buffers = HeapAlloc(GetProcessHeap(), 0, size); if(!buffers){ HeapFree(GetProcessHeap(), 0, devices); - for(j = 0; j < *num; ++j){ + for(j = 0; j < *num; ++j) HeapFree(GetProcessHeap(), 0, (*ids)[j]); - HeapFree(GetProcessHeap(), 0, (*guids)[j]); - } HeapFree(GetProcessHeap(), 0, *guids); HeapFree(GetProcessHeap(), 0, *ids); return E_OUTOFMEMORY; @@ -489,10 +487,8 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, if(!(*ids)[*num]){ CFRelease(name); HeapFree(GetProcessHeap(), 0, devices); - for(j = 0; j < *num; ++j){ + for(j = 0; j < *num; ++j) HeapFree(GetProcessHeap(), 0, (*ids)[j]); - HeapFree(GetProcessHeap(), 0, (*guids)[j]); - } HeapFree(GetProcessHeap(), 0, *ids); HeapFree(GetProcessHeap(), 0, *guids); return E_OUTOFMEMORY; @@ -501,19 +497,7 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, ((*ids)[*num])[len - 1] = 0; CFRelease(name); - (*guids)[*num] = HeapAlloc(GetProcessHeap(), 0, sizeof(GUID)); - if(!(*guids)[*num]){ - HeapFree(GetProcessHeap(), 0, devices); - HeapFree(GetProcessHeap(), 0, (*ids)[*num]); - for(j = 0; j < *num; ++j){ - HeapFree(GetProcessHeap(), 0, (*ids)[j]); - HeapFree(GetProcessHeap(), 0, (*guids)[j]); - } - HeapFree(GetProcessHeap(), 0, *ids); - HeapFree(GetProcessHeap(), 0, *guids); - return E_OUTOFMEMORY; - } - get_device_guid(flow, devices[i], (*guids)[*num]); + get_device_guid(flow, devices[i], &(*guids)[*num]); if(*def_index == (UINT)-1 && devices[i] == default_id) *def_index = *num; @@ -595,8 +579,7 @@ static BOOL get_deviceid_by_guid(GUID *guid, AudioDeviceID *id, EDataFlow *flow) return FALSE; } -HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, - EDataFlow unused_dataflow, IAudioClient **out) +HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) { ACImpl *This; AudioDeviceID adevid; diff --git a/dlls/winecoreaudio.drv/winecoreaudio.drv.spec b/dlls/winecoreaudio.drv/winecoreaudio.drv.spec index 0f208e95995..9d9f781cf4e 100644 --- a/dlls/winecoreaudio.drv/winecoreaudio.drv.spec +++ b/dlls/winecoreaudio.drv/winecoreaudio.drv.spec @@ -6,5 +6,5 @@ # MMDevAPI driver functions @ stdcall -private GetPriority() AUDDRV_GetPriority @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioEndpoint(str ptr long ptr) AUDDRV_GetAudioEndpoint +@ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionManager(ptr ptr) AUDDRV_GetAudioSessionManager diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 85f68089bcd..d8e64683bf7 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -451,7 +451,7 @@ static UINT get_default_index(EDataFlow flow) return 0; } -HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, GUID ***guids, +HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, GUID **guids, UINT *num, UINT *def_index) { int i, mixer_fd; @@ -497,7 +497,7 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, GUID ***guids } *ids = HeapAlloc(GetProcessHeap(), 0, sysinfo.numaudios * sizeof(WCHAR *)); - *guids = HeapAlloc(GetProcessHeap(), 0, sysinfo.numaudios * sizeof(GUID *)); + *guids = HeapAlloc(GetProcessHeap(), 0, sysinfo.numaudios * sizeof(GUID)); *num = 0; for(i = 0; i < sysinfo.numaudios; ++i){ @@ -544,29 +544,14 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, GUID ***guids get_device_guid(flow, devnode, &dev_item->guid); strcpy(dev_item->devnode, devnode); - (*guids)[*num] = HeapAlloc(GetProcessHeap(), 0, sizeof(GUID)); - if(!(*guids)[*num]){ - for(i = 0; i < *num; ++i){ - HeapFree(GetProcessHeap(), 0, (*ids)[i]); - HeapFree(GetProcessHeap(), 0, (*guids)[i]); - } - HeapFree(GetProcessHeap(), 0, *ids); - HeapFree(GetProcessHeap(), 0, *guids); - HeapFree(GetProcessHeap(), 0, dev_item); - close(mixer_fd); - return E_OUTOFMEMORY; - } - *(*guids)[*num] = dev_item->guid; + (*guids)[*num] = dev_item->guid; len = MultiByteToWideChar(CP_UNIXCP, 0, ai.name, -1, NULL, 0); (*ids)[*num] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); if(!(*ids)[*num]){ - HeapFree(GetProcessHeap(), 0, (*guids)[*num]); - for(i = 0; i < *num; ++i){ + for(i = 0; i < *num; ++i) HeapFree(GetProcessHeap(), 0, (*ids)[i]); - HeapFree(GetProcessHeap(), 0, (*guids)[i]); - } HeapFree(GetProcessHeap(), 0, *ids); HeapFree(GetProcessHeap(), 0, *guids); HeapFree(GetProcessHeap(), 0, dev_item); @@ -599,7 +584,7 @@ const OSSDevice *get_ossdevice_from_guid(const GUID *guid) } HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, - EDataFlow unused_dataflow, IAudioClient **out) + IAudioClient **out) { ACImpl *This; const OSSDevice *oss_dev; diff --git a/dlls/wineoss.drv/wineoss.drv.spec b/dlls/wineoss.drv/wineoss.drv.spec index 13723e608ba..fe6cc518c33 100644 --- a/dlls/wineoss.drv/wineoss.drv.spec +++ b/dlls/wineoss.drv/wineoss.drv.spec @@ -7,5 +7,5 @@ # MMDevAPI driver functions @ stdcall -private GetPriority() AUDDRV_GetPriority @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioEndpoint(ptr ptr long ptr) AUDDRV_GetAudioEndpoint +@ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionManager(ptr ptr) AUDDRV_GetAudioSessionManager