-- v3: winepulse: Remove GetAudioSessionWrapper. wineoss: Remove GetAudioSessionWrapper. winecoreaudio: Remove GetAudioSessionWrapper. winealsa: Remove GetAudioSessionWrapper. mmdevapi: Implement AudioClient_Create. mmdevapi: Introduce wine_unix_call helper. mmdevapi: Import get_device_name_from_guid() from driver. winepulse: Export get_device_name_from_guid(). wineoss: Export get_device_name_from_guid(). winecoreaudio: Export get_device_name_from_guid(). winealsa: Export get_device_name_from_guid().
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winealsa.drv/mmdevdrv.c | 2 +- dlls/winealsa.drv/winealsa.drv.spec | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index c4de829f152..fc80b102ee1 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -247,7 +247,7 @@ end: return params.result; }
-static BOOL get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) +BOOL WINAPI get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) { HKEY devices_key; UINT i = 0; diff --git a/dlls/winealsa.drv/winealsa.drv.spec b/dlls/winealsa.drv/winealsa.drv.spec index d6d566e3b13..abfb2e052d8 100644 --- a/dlls/winealsa.drv/winealsa.drv.spec +++ b/dlls/winealsa.drv/winealsa.drv.spec @@ -4,6 +4,7 @@ @ stdcall -private modMessage(long long long long long) ALSA_modMessage
# MMDevAPI driver functions +@ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs @ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/mmdevdrv.c | 2 +- dlls/winecoreaudio.drv/winecoreaudio.drv.spec | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index aee06e5a7f7..9a5bd0fdf91 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -243,7 +243,7 @@ end: return params.result; }
-static BOOL get_device_name_from_guid(const GUID *guid, char **name, EDataFlow *flow) +BOOL WINAPI get_device_name_from_guid(const GUID *guid, char **name, EDataFlow *flow) { HKEY devices_key; UINT i = 0; diff --git a/dlls/winecoreaudio.drv/winecoreaudio.drv.spec b/dlls/winecoreaudio.drv/winecoreaudio.drv.spec index 1467fc8b032..1f2ac2a9bf0 100644 --- a/dlls/winecoreaudio.drv/winecoreaudio.drv.spec +++ b/dlls/winecoreaudio.drv/winecoreaudio.drv.spec @@ -4,6 +4,7 @@ @ stdcall -private modMessage(long long long long long) CoreAudio_modMessage
# MMDevAPI driver functions +@ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs @ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 2 +- dlls/wineoss.drv/wineoss.drv.spec | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 549cd66b6bd..9a09970aa3b 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -200,7 +200,7 @@ static void get_device_guid(EDataFlow flow, const char *device, GUID *guid) RegCloseKey(key); }
-static BOOL get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) +BOOL WINAPI get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) { OSSDevice *dev_item; LIST_FOR_EACH_ENTRY(dev_item, &g_devices, OSSDevice, entry){ diff --git a/dlls/wineoss.drv/wineoss.drv.spec b/dlls/wineoss.drv/wineoss.drv.spec index 4506cc67ab5..496a6eae570 100644 --- a/dlls/wineoss.drv/wineoss.drv.spec +++ b/dlls/wineoss.drv/wineoss.drv.spec @@ -5,6 +5,7 @@ @ stdcall -private modMessage(long long long long long) OSS_modMessage
# MMDevAPI driver functions +@ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs @ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winepulse.drv/mmdevdrv.c | 2 +- dlls/winepulse.drv/winepulse.drv.spec | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 15e1538f330..65fbc414ce4 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -241,7 +241,7 @@ end: return params.result; }
-static BOOL get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) +BOOL WINAPI get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) { struct device_cache *device; WCHAR key_name[MAX_PULSE_NAME_LEN + 2]; diff --git a/dlls/winepulse.drv/winepulse.drv.spec b/dlls/winepulse.drv/winepulse.drv.spec index 96cbd97bd68..9ae26ae35e9 100644 --- a/dlls/winepulse.drv/winepulse.drv.spec +++ b/dlls/winepulse.drv/winepulse.drv.spec @@ -1,4 +1,5 @@ # MMDevAPI driver functions +@ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs @ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/main.c | 1 + dlls/mmdevapi/mmdevapi_private.h | 1 + 2 files changed, 2 insertions(+)
diff --git a/dlls/mmdevapi/main.c b/dlls/mmdevapi/main.c index d1006b9999c..d34075ebf58 100644 --- a/dlls/mmdevapi/main.c +++ b/dlls/mmdevapi/main.c @@ -98,6 +98,7 @@ static BOOL load_driver(const WCHAR *name, DriverFuncs *driver)
#define LDFC(n) do { driver->p##n = (void*)GetProcAddress(driver->module, #n);\ if(!driver->p##n) { goto fail; } } while(0) + LDFC(get_device_name_from_guid); LDFC(GetEndpointIDs); LDFC(GetAudioEndpoint); LDFC(GetAudioSessionWrapper); diff --git a/dlls/mmdevapi/mmdevapi_private.h b/dlls/mmdevapi/mmdevapi_private.h index 1cd8412b6ea..ca7a1f8f629 100644 --- a/dlls/mmdevapi/mmdevapi_private.h +++ b/dlls/mmdevapi/mmdevapi_private.h @@ -40,6 +40,7 @@ typedef struct _DriverFuncs { * valid. See enum _DriverPriority. */ int priority;
+ BOOL (WINAPI *pget_device_name_from_guid)(GUID *guid, char **name, EDataFlow *flow); /* ids gets an array of human-friendly endpoint names * keys gets an array of driver-specific stuff that is used * in GetAudioEndpoint to identify the endpoint
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/client.c | 46 ++++++++++++++++++++-------------------- dlls/mmdevapi/mmdevdrv.h | 9 ++++++++ dlls/mmdevapi/session.c | 2 +- 3 files changed, 33 insertions(+), 24 deletions(-)
diff --git a/dlls/mmdevapi/client.c b/dlls/mmdevapi/client.c index 11a0a572d98..a88ef5b2a67 100644 --- a/dlls/mmdevapi/client.c +++ b/dlls/mmdevapi/client.c @@ -67,7 +67,7 @@ void set_stream_volumes(struct audio_client *This) params.volumes = This->vols; params.session_volumes = This->session->channel_vols;
- WINE_UNIX_CALL(set_volumes, ¶ms); + wine_unix_call(set_volumes, ¶ms); }
static inline struct audio_client *impl_from_IAudioCaptureClient(IAudioCaptureClient *iface) @@ -142,7 +142,7 @@ static DWORD CALLBACK main_loop_func(void *event)
params.event = event;
- WINE_UNIX_CALL(main_loop, ¶ms); + wine_unix_call(main_loop, ¶ms);
return 0; } @@ -174,7 +174,7 @@ static DWORD CALLBACK timer_loop_func(void *user)
params.stream = This->stream;
- WINE_UNIX_CALL(timer_loop, ¶ms); + wine_unix_call(timer_loop, ¶ms);
return 0; } @@ -186,7 +186,7 @@ HRESULT stream_release(stream_handle stream, HANDLE timer_thread) params.stream = stream; params.timer_thread = timer_thread;
- WINE_UNIX_CALL(release_stream, ¶ms); + wine_unix_call(release_stream, ¶ms);
return params.result; } @@ -352,7 +352,7 @@ static HRESULT WINAPI capture_GetBuffer(IAudioCaptureClient *iface, BYTE **data, params.devpos = devpos; params.qpcpos = qpcpos;
- WINE_UNIX_CALL(get_capture_buffer, ¶ms); + wine_unix_call(get_capture_buffer, ¶ms);
return params.result; } @@ -370,7 +370,7 @@ static HRESULT WINAPI capture_ReleaseBuffer(IAudioCaptureClient *iface, UINT32 d params.stream = This->stream; params.done = done;
- WINE_UNIX_CALL(release_capture_buffer, ¶ms); + wine_unix_call(release_capture_buffer, ¶ms);
return params.result; } @@ -391,7 +391,7 @@ static HRESULT WINAPI capture_GetNextPacketSize(IAudioCaptureClient *iface, UINT params.stream = This->stream; params.frames = frames;
- WINE_UNIX_CALL(get_next_packet_size, ¶ms); + wine_unix_call(get_next_packet_size, ¶ms);
return params.result; } @@ -526,7 +526,7 @@ static HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE params.channel_count = &channel_count; params.stream = &stream;
- WINE_UNIX_CALL(create_stream, ¶ms); + wine_unix_call(create_stream, ¶ms);
free(name);
@@ -578,7 +578,7 @@ static HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out) params.stream = This->stream; params.frames = out;
- WINE_UNIX_CALL(get_buffer_size, ¶ms); + wine_unix_call(get_buffer_size, ¶ms);
return params.result; } @@ -599,7 +599,7 @@ static HRESULT WINAPI client_GetStreamLatency(IAudioClient3 *iface, REFERENCE_TI params.stream = This->stream; params.latency = latency;
- WINE_UNIX_CALL(get_latency, ¶ms); + wine_unix_call(get_latency, ¶ms);
return params.result; } @@ -620,7 +620,7 @@ static HRESULT WINAPI client_GetCurrentPadding(IAudioClient3 *iface, UINT32 *out params.stream = This->stream; params.padding = out;
- WINE_UNIX_CALL(get_current_padding, ¶ms); + wine_unix_call(get_current_padding, ¶ms);
return params.result; } @@ -648,7 +648,7 @@ static HRESULT WINAPI client_IsFormatSupported(IAudioClient3 *iface, AUDCLNT_SHA params.fmt_out = CoTaskMemAlloc(sizeof(*params.fmt_out)); }
- WINE_UNIX_CALL(is_format_supported, ¶ms); + wine_unix_call(is_format_supported, ¶ms);
if (params.result == S_FALSE) *out = ¶ms.fmt_out->Format; @@ -676,7 +676,7 @@ static HRESULT WINAPI client_GetMixFormat(IAudioClient3 *iface, WAVEFORMATEX **p if (!params.fmt) return E_OUTOFMEMORY;
- WINE_UNIX_CALL(get_mix_format, ¶ms); + wine_unix_call(get_mix_format, ¶ms);
if (SUCCEEDED(params.result)) { *pwfx = ¶ms.fmt->Format; @@ -703,7 +703,7 @@ static HRESULT WINAPI client_GetDevicePeriod(IAudioClient3 *iface, REFERENCE_TIM params.def_period = defperiod; params.min_period = minperiod;
- WINE_UNIX_CALL(get_device_period, ¶ms); + wine_unix_call(get_device_period, ¶ms);
return params.result; } @@ -723,7 +723,7 @@ static HRESULT WINAPI client_Start(IAudioClient3 *iface) }
params.stream = This->stream; - WINE_UNIX_CALL(start, ¶ms); + wine_unix_call(start, ¶ms);
if (SUCCEEDED(params.result) && !This->timer_thread) { if ((This->timer_thread = CreateThread(NULL, 0, timer_loop_func, This, 0, NULL))) @@ -751,7 +751,7 @@ static HRESULT WINAPI client_Stop(IAudioClient3 *iface)
params.stream = This->stream;
- WINE_UNIX_CALL(stop, ¶ms); + wine_unix_call(stop, ¶ms);
return params.result; } @@ -768,7 +768,7 @@ static HRESULT WINAPI client_Reset(IAudioClient3 *iface)
params.stream = This->stream;
- WINE_UNIX_CALL(reset, ¶ms); + wine_unix_call(reset, ¶ms);
return params.result; } @@ -789,7 +789,7 @@ static HRESULT WINAPI client_SetEventHandle(IAudioClient3 *iface, HANDLE event) params.stream = This->stream; params.event = event;
- WINE_UNIX_CALL(set_event_handle, ¶ms); + wine_unix_call(set_event_handle, ¶ms);
return params.result; } @@ -1031,7 +1031,7 @@ static HRESULT WINAPI clock_GetFrequency(IAudioClock *iface, UINT64 *freq) params.stream = This->stream; params.freq = freq;
- WINE_UNIX_CALL(get_frequency, ¶ms); + wine_unix_call(get_frequency, ¶ms);
return params.result; } @@ -1054,7 +1054,7 @@ static HRESULT WINAPI clock_GetPosition(IAudioClock *iface, UINT64 *pos, UINT64 params.pos = pos; params.qpctime = qpctime;
- WINE_UNIX_CALL(get_position, ¶ms); + wine_unix_call(get_position, ¶ms);
return params.result; } @@ -1119,7 +1119,7 @@ static HRESULT WINAPI clock2_GetDevicePosition(IAudioClock2 *iface, UINT64 *pos, params.pos = pos; params.qpctime = qpctime;
- WINE_UNIX_CALL(get_position, ¶ms); + wine_unix_call(get_position, ¶ms);
return params.result; } @@ -1187,7 +1187,7 @@ static HRESULT WINAPI render_GetBuffer(IAudioRenderClient *iface, UINT32 frames, params.frames = frames; params.data = data;
- WINE_UNIX_CALL(get_render_buffer, ¶ms); + wine_unix_call(get_render_buffer, ¶ms);
return params.result; } @@ -1207,7 +1207,7 @@ static HRESULT WINAPI render_ReleaseBuffer(IAudioRenderClient *iface, UINT32 wri params.written_frames = written_frames; params.flags = flags;
- WINE_UNIX_CALL(release_render_buffer, ¶ms); + wine_unix_call(release_render_buffer, ¶ms);
return params.result; } diff --git a/dlls/mmdevapi/mmdevdrv.h b/dlls/mmdevapi/mmdevdrv.h index df21859cbad..c1b8790c0c5 100644 --- a/dlls/mmdevapi/mmdevdrv.h +++ b/dlls/mmdevapi/mmdevdrv.h @@ -14,10 +14,13 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include <assert.h> + #include <audiopolicy.h> #include <mmdeviceapi.h>
#include <wine/list.h> +#include <wine/unixlib.h>
typedef struct audio_client ACImpl;
@@ -82,3 +85,9 @@ struct audio_client { /* Keep at end */ char device_name[0]; }; + +static inline void wine_unix_call(const unsigned int code, void *args) +{ + const NTSTATUS status = WINE_UNIX_CALL(code, args); + assert(!status); +} diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index 24188ad7658..e16ece01825 100644 --- a/dlls/mmdevapi/session.c +++ b/dlls/mmdevapi/session.c @@ -127,7 +127,7 @@ static HRESULT WINAPI control_GetState(IAudioSessionControl2 *iface, AudioSessio
LIST_FOR_EACH_ENTRY(client, &This->session->clients, struct audio_client, entry) { params.stream = client->stream; - WINE_UNIX_CALL(is_started, ¶ms); + wine_unix_call(is_started, ¶ms); if (params.result == S_OK) { *state = AudioSessionStateActive; sessions_unlock();
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/audiosessionmanager.c | 7 +- dlls/mmdevapi/client.c | 57 +++++++++++++- dlls/mmdevapi/devenum.c | 4 +- dlls/mmdevapi/main.c | 2 - dlls/mmdevapi/mmdevapi_private.h | 14 ++-- dlls/mmdevapi/mmdevdrv.h | 9 --- dlls/mmdevapi/session.c | 21 ++++- dlls/winealsa.drv/Makefile.in | 5 +- dlls/winealsa.drv/mmdevdrv.c | 73 +----------------- dlls/winealsa.drv/winealsa.drv.spec | 1 - dlls/winecoreaudio.drv/Makefile.in | 5 +- dlls/winecoreaudio.drv/mmdevdrv.c | 73 +----------------- dlls/winecoreaudio.drv/winecoreaudio.drv.spec | 1 - dlls/wineoss.drv/Makefile.in | 5 +- dlls/wineoss.drv/mmdevdrv.c | 76 +------------------ dlls/wineoss.drv/wineoss.drv.spec | 1 - dlls/winepulse.drv/Makefile.in | 5 +- dlls/winepulse.drv/mmdevdrv.c | 73 +----------------- dlls/winepulse.drv/winepulse.drv.spec | 1 - 19 files changed, 98 insertions(+), 335 deletions(-)
diff --git a/dlls/mmdevapi/audiosessionmanager.c b/dlls/mmdevapi/audiosessionmanager.c index 74368ea2be3..ba23634e54d 100644 --- a/dlls/mmdevapi/audiosessionmanager.c +++ b/dlls/mmdevapi/audiosessionmanager.c @@ -26,6 +26,9 @@
WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
+extern HRESULT get_audio_session_wrapper(const GUID *guid, IMMDevice *device, + struct audio_session_wrapper **out); + static CRITICAL_SECTION g_sessions_lock; static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = { @@ -102,7 +105,7 @@ static HRESULT WINAPI ASM_GetAudioSessionControl(IAudioSessionManager2 *iface,
TRACE("(%p)->(%s, %lx, %p)\n", This, debugstr_guid(guid), flags, out);
- hr = drvs.pGetAudioSessionWrapper(guid, This->device, &wrapper); + hr = get_audio_session_wrapper(guid, This->device, &wrapper); if (FAILED(hr)) return hr;
@@ -121,7 +124,7 @@ static HRESULT WINAPI ASM_GetSimpleAudioVolume(IAudioSessionManager2 *iface,
TRACE("(%p)->(%s, %lx, %p)\n", This, debugstr_guid(guid), flags, out);
- hr = drvs.pGetAudioSessionWrapper(guid, This->device, &wrapper); + hr = get_audio_session_wrapper(guid, This->device, &wrapper); if (FAILED(hr)) return hr;
diff --git a/dlls/mmdevapi/client.c b/dlls/mmdevapi/client.c index a88ef5b2a67..d8aad762627 100644 --- a/dlls/mmdevapi/client.c +++ b/dlls/mmdevapi/client.c @@ -30,8 +30,7 @@ #include <wine/debug.h> #include <wine/unixlib.h>
-#include "unixlib.h" -#include "mmdevdrv.h" +#include "mmdevapi_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
@@ -1383,3 +1382,57 @@ const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl = streamvolume_SetAllVolumes, streamvolume_GetAllVolumes }; + +HRESULT AudioClient_Create(GUID *guid, IMMDevice *device, IAudioClient **out) +{ + struct audio_client *This; + char *name; + EDataFlow dataflow; + size_t size; + HRESULT hr; + + TRACE("%s %p %p\n", debugstr_guid(guid), device, out); + + *out = NULL; + + if (!drvs.pget_device_name_from_guid(guid, &name, &dataflow)) + return AUDCLNT_E_DEVICE_INVALIDATED; + + if (dataflow != eRender && dataflow != eCapture) { + free(name); + return E_UNEXPECTED; + } + + size = strlen(name) + 1; + This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, FIELD_OFFSET(struct audio_client, device_name[size])); + if (!This) { + free(name); + return E_OUTOFMEMORY; + } + + memcpy(This->device_name, name, size); + free(name); + + This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; + This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; + This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; + This->IAudioClock2_iface.lpVtbl = &AudioClock2_Vtbl; + This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; + This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl; + + This->dataflow = dataflow; + This->parent = device; + + hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->marshal); + if (FAILED(hr)) { + HeapFree(GetProcessHeap(), 0, This); + return hr; + } + + IMMDevice_AddRef(This->parent); + + *out = (IAudioClient *)&This->IAudioClient3_iface; + IAudioClient3_AddRef(&This->IAudioClient3_iface); + + return S_OK; +} diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c index 206fe810b12..c1625cf177a 100644 --- a/dlls/mmdevapi/devenum.c +++ b/dlls/mmdevapi/devenum.c @@ -474,7 +474,7 @@ static HRESULT set_format(MMDevice *dev) WAVEFORMATEX *fmt; PROPVARIANT pv = { VT_EMPTY };
- hr = drvs.pGetAudioEndpoint(&dev->devguid, &dev->IMMDevice_iface, &client); + hr = AudioClient_Create(&dev->devguid, &dev->IMMDevice_iface, &client); if(FAILED(hr)) return hr;
@@ -595,7 +595,7 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls if (IsEqualIID(riid, &IID_IAudioClient) || IsEqualIID(riid, &IID_IAudioClient2) || IsEqualIID(riid, &IID_IAudioClient3)){ - hr = drvs.pGetAudioEndpoint(&This->devguid, iface, (IAudioClient**)ppv); + hr = AudioClient_Create(&This->devguid, iface, (IAudioClient**)ppv); }else if (IsEqualIID(riid, &IID_IAudioEndpointVolume) || IsEqualIID(riid, &IID_IAudioEndpointVolumeEx)) hr = AudioEndpointVolume_Create(This, (IAudioEndpointVolumeEx**)ppv); diff --git a/dlls/mmdevapi/main.c b/dlls/mmdevapi/main.c index d34075ebf58..5ed27c9debd 100644 --- a/dlls/mmdevapi/main.c +++ b/dlls/mmdevapi/main.c @@ -100,8 +100,6 @@ static BOOL load_driver(const WCHAR *name, DriverFuncs *driver) if(!driver->p##n) { goto fail; } } while(0) LDFC(get_device_name_from_guid); LDFC(GetEndpointIDs); - LDFC(GetAudioEndpoint); - LDFC(GetAudioSessionWrapper); #undef LDFC
/* optional - do not fail if not found */ diff --git a/dlls/mmdevapi/mmdevapi_private.h b/dlls/mmdevapi/mmdevapi_private.h index ca7a1f8f629..78582f4db69 100644 --- a/dlls/mmdevapi/mmdevapi_private.h +++ b/dlls/mmdevapi/mmdevapi_private.h @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include <assert.h> + #include <endpointvolume.h> #include <spatialaudioclient.h> #include <winternl.h> @@ -48,10 +50,6 @@ typedef struct _DriverFuncs { * all of the elements in both arrays with HeapFree() */ HRESULT (WINAPI *pGetEndpointIDs)(EDataFlow flow, WCHAR ***ids, GUID **guids, UINT *num, UINT *default_index); - HRESULT (WINAPI *pGetAudioEndpoint)(void *key, IMMDevice *dev, - IAudioClient **out); - HRESULT (WINAPI *pGetAudioSessionWrapper)(const GUID *guid, IMMDevice *device, - struct audio_session_wrapper **out); HRESULT (WINAPI *pGetPropValue)(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out); } DriverFuncs; @@ -73,7 +71,13 @@ typedef struct MMDevice { struct list entry; } MMDevice;
-extern HRESULT AudioClient_Create(MMDevice *parent, IAudioClient **ppv) DECLSPEC_HIDDEN; +static inline void wine_unix_call(const unsigned int code, void *args) +{ + const NTSTATUS status = __wine_unix_call(drvs.module_unixlib, code, args); + assert(!status); +} + +extern HRESULT AudioClient_Create(GUID *guid, IMMDevice *device, IAudioClient **out) DECLSPEC_HIDDEN; extern HRESULT AudioEndpointVolume_Create(MMDevice *parent, IAudioEndpointVolumeEx **ppv) DECLSPEC_HIDDEN; extern HRESULT AudioSessionManager_Create(IMMDevice *device, IAudioSessionManager2 **ppv) DECLSPEC_HIDDEN; extern HRESULT SpatialAudioClient_Create(IMMDevice *device, ISpatialAudioClient **out) DECLSPEC_HIDDEN; diff --git a/dlls/mmdevapi/mmdevdrv.h b/dlls/mmdevapi/mmdevdrv.h index c1b8790c0c5..df21859cbad 100644 --- a/dlls/mmdevapi/mmdevdrv.h +++ b/dlls/mmdevapi/mmdevdrv.h @@ -14,13 +14,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
-#include <assert.h> - #include <audiopolicy.h> #include <mmdeviceapi.h>
#include <wine/list.h> -#include <wine/unixlib.h>
typedef struct audio_client ACImpl;
@@ -85,9 +82,3 @@ struct audio_client { /* Keep at end */ char device_name[0]; }; - -static inline void wine_unix_call(const unsigned int code, void *args) -{ - const NTSTATUS status = WINE_UNIX_CALL(code, args); - assert(!status); -} diff --git a/dlls/mmdevapi/session.c b/dlls/mmdevapi/session.c index e16ece01825..7b5db187977 100644 --- a/dlls/mmdevapi/session.c +++ b/dlls/mmdevapi/session.c @@ -28,8 +28,7 @@ #include <wine/debug.h> #include <wine/unixlib.h>
-#include "unixlib.h" -#include "mmdevdrv.h" +#include "mmdevapi_private.h"
#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
@@ -653,3 +652,21 @@ HRESULT get_audio_session(const GUID *guid, IMMDevice *device, UINT channels,
return S_OK; } + +HRESULT get_audio_session_wrapper(const GUID *guid, IMMDevice *device, + struct audio_session_wrapper **out) +{ + struct audio_session *session; + + const HRESULT hr = get_audio_session(guid, device, 0, &session); + if (FAILED(hr)) + return hr; + + *out = session_wrapper_create(NULL); + if (!*out) + return E_OUTOFMEMORY; + + (*out)->session = session; + + return S_OK; +} diff --git a/dlls/winealsa.drv/Makefile.in b/dlls/winealsa.drv/Makefile.in index d1387520742..0a86fda23c3 100644 --- a/dlls/winealsa.drv/Makefile.in +++ b/dlls/winealsa.drv/Makefile.in @@ -1,14 +1,11 @@ MODULE = winealsa.drv UNIXLIB = winealsa.so IMPORTS = uuid ole32 advapi32 version -PARENTSRC = ../mmdevapi DELAYIMPORTS = winmm UNIX_LIBS = $(ALSA_LIBS) $(PTHREAD_LIBS)
C_SRCS = \ alsa.c \ alsamidi.c \ - client.c \ midi.c \ - mmdevdrv.c \ - session.c + mmdevdrv.c diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index fc80b102ee1..4b42e64db72 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -65,13 +65,6 @@ static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, static WCHAR drv_key_devicesW[256]; static const WCHAR guidW[] = {'g','u','i','d',0};
-extern const IAudioClient3Vtbl AudioClient3_Vtbl; -extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; -extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; -extern const IAudioClockVtbl AudioClock_Vtbl; -extern const IAudioClock2Vtbl AudioClock2_Vtbl; -extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; - extern struct audio_session_wrapper *session_wrapper_create( struct audio_client *client) DECLSPEC_HIDDEN;
@@ -319,58 +312,6 @@ BOOL WINAPI get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) return FALSE; }
-HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) -{ - ACImpl *This; - char *alsa_name; - EDataFlow dataflow; - HRESULT hr; - int len; - - TRACE("%s %p %p\n", debugstr_guid(guid), dev, out); - - if(!get_device_name_from_guid(guid, &alsa_name, &dataflow)) - return AUDCLNT_E_DEVICE_INVALIDATED; - - if(dataflow != eRender && dataflow != eCapture){ - free(alsa_name); - return E_UNEXPECTED; - } - - len = strlen(alsa_name); - This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[len + 1])); - if(!This){ - free(alsa_name); - return E_OUTOFMEMORY; - } - - memcpy(This->device_name, alsa_name, len + 1); - free(alsa_name); - - This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; - This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; - This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; - This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; - This->IAudioClock2_iface.lpVtbl = &AudioClock2_Vtbl; - This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl; - - hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->marshal); - if (FAILED(hr)) { - HeapFree(GetProcessHeap(), 0, This); - return hr; - } - - This->dataflow = dataflow; - - This->parent = dev; - IMMDevice_AddRef(This->parent); - - *out = (IAudioClient *)&This->IAudioClient3_iface; - IAudioClient3_AddRef(&This->IAudioClient3_iface); - - return S_OK; -} - /* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ extern HRESULT get_audio_session(const GUID *sessionguid, @@ -379,19 +320,7 @@ extern HRESULT get_audio_session(const GUID *sessionguid, HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, AudioSessionWrapper **out) { - AudioSession *session; - - HRESULT hr = get_audio_session(guid, device, 0, &session); - if(FAILED(hr)) - return hr; - - *out = session_wrapper_create(NULL); - if(!*out) - return E_OUTOFMEMORY; - - (*out)->session = session; - - return S_OK; + return E_NOTIMPL; }
HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) diff --git a/dlls/winealsa.drv/winealsa.drv.spec b/dlls/winealsa.drv/winealsa.drv.spec index abfb2e052d8..a27c34b648f 100644 --- a/dlls/winealsa.drv/winealsa.drv.spec +++ b/dlls/winealsa.drv/winealsa.drv.spec @@ -6,6 +6,5 @@ # MMDevAPI driver functions @ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper @ stdcall -private GetPropValue(ptr ptr ptr) AUDDRV_GetPropValue diff --git a/dlls/winecoreaudio.drv/Makefile.in b/dlls/winecoreaudio.drv/Makefile.in index ecf85cffda4..0561f46f044 100644 --- a/dlls/winecoreaudio.drv/Makefile.in +++ b/dlls/winecoreaudio.drv/Makefile.in @@ -1,14 +1,11 @@ MODULE = winecoreaudio.drv UNIXLIB = winecoreaudio.so IMPORTS = uuid ole32 user32 advapi32 version -PARENTSRC = ../mmdevapi DELAYIMPORTS = winmm UNIX_LIBS = $(COREAUDIO_LIBS)
C_SRCS = \ - client.c \ coreaudio.c \ coremidi.c \ midi.c \ - mmdevdrv.c \ - session.c + mmdevdrv.c diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 9a5bd0fdf91..c5624506d2f 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -48,13 +48,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(coreaudio);
#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER)
-extern const IAudioClient3Vtbl AudioClient3_Vtbl; -extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; -extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; -extern const IAudioClockVtbl AudioClock_Vtbl; -extern const IAudioClock2Vtbl AudioClock2_Vtbl; -extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; - static WCHAR drv_key_devicesW[256];
static CRITICAL_SECTION g_sessions_lock; @@ -313,58 +306,6 @@ BOOL WINAPI get_device_name_from_guid(const GUID *guid, char **name, EDataFlow * return FALSE; }
-HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) -{ - ACImpl *This; - char *name; - SIZE_T name_len; - EDataFlow dataflow; - HRESULT hr; - - TRACE("%s %p %p\n", debugstr_guid(guid), dev, out); - - if(!get_device_name_from_guid(guid, &name, &dataflow)) - return AUDCLNT_E_DEVICE_INVALIDATED; - - if(dataflow != eRender && dataflow != eCapture){ - free(name); - return E_UNEXPECTED; - } - - name_len = strlen(name); - This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[name_len + 1])); - if(!This){ - free(name); - return E_OUTOFMEMORY; - } - - memcpy(This->device_name, name, name_len + 1); - free(name); - - This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; - This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; - This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; - This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; - This->IAudioClock2_iface.lpVtbl = &AudioClock2_Vtbl; - This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl; - - This->dataflow = dataflow; - - hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->marshal); - if (FAILED(hr)) { - HeapFree(GetProcessHeap(), 0, This); - return hr; - } - - This->parent = dev; - IMMDevice_AddRef(This->parent); - - *out = (IAudioClient *)&This->IAudioClient3_iface; - IAudioClient3_AddRef(&This->IAudioClient3_iface); - - return S_OK; -} - /* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ extern HRESULT get_audio_session(const GUID *sessionguid, @@ -373,17 +314,5 @@ extern HRESULT get_audio_session(const GUID *sessionguid, HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, AudioSessionWrapper **out) { - AudioSession *session; - - HRESULT hr = get_audio_session(guid, device, 0, &session); - if(FAILED(hr)) - return hr; - - *out = session_wrapper_create(NULL); - if(!*out) - return E_OUTOFMEMORY; - - (*out)->session = session; - - return S_OK; + return E_NOTIMPL; } diff --git a/dlls/winecoreaudio.drv/winecoreaudio.drv.spec b/dlls/winecoreaudio.drv/winecoreaudio.drv.spec index 1f2ac2a9bf0..1c9751f9404 100644 --- a/dlls/winecoreaudio.drv/winecoreaudio.drv.spec +++ b/dlls/winecoreaudio.drv/winecoreaudio.drv.spec @@ -6,5 +6,4 @@ # MMDevAPI driver functions @ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper diff --git a/dlls/wineoss.drv/Makefile.in b/dlls/wineoss.drv/Makefile.in index f571397257b..97e31aea662 100644 --- a/dlls/wineoss.drv/Makefile.in +++ b/dlls/wineoss.drv/Makefile.in @@ -1,17 +1,14 @@ MODULE = wineoss.drv UNIXLIB = wineoss.so IMPORTS = uuid ole32 user32 advapi32 version -PARENTSRC = ../mmdevapi DELAYIMPORTS = winmm UNIX_LIBS = $(OSS4_LIBS) $(PTHREAD_LIBS) UNIX_CFLAGS = $(OSS4_CFLAGS)
C_SRCS = \ - client.c \ midi.c \ midipatch.c \ mmaux.c \ mmdevdrv.c \ oss.c \ - ossmidi.c \ - session.c + ossmidi.c diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 9a09970aa3b..1c71360a80a 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -71,13 +71,6 @@ static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = }; static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, 0 };
-extern const IAudioClient3Vtbl AudioClient3_Vtbl; -extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; -extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; -extern const IAudioClockVtbl AudioClock_Vtbl; -extern const IAudioClock2Vtbl AudioClock2_Vtbl; -extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; - extern struct audio_session_wrapper *session_wrapper_create( struct audio_client *client) DECLSPEC_HIDDEN;
@@ -300,61 +293,6 @@ end: return params.result; }
-HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, - IAudioClient **out) -{ - ACImpl *This; - char *name; - int len; - EDataFlow dataflow; - HRESULT hr; - - TRACE("%s %p %p\n", debugstr_guid(guid), dev, out); - - if(!get_device_name_from_guid(guid, &name, &dataflow)){ - WARN("Unknown GUID: %s\n", debugstr_guid(guid)); - return AUDCLNT_E_DEVICE_INVALIDATED; - } - - if(dataflow != eRender && dataflow != eCapture){ - free(name); - return E_UNEXPECTED; - } - - len = strlen(name); - This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[len + 1])); - 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)) { - HeapFree(GetProcessHeap(), 0, This); - return hr; - } - - This->dataflow = dataflow; - - This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; - This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; - This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; - This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; - This->IAudioClock2_iface.lpVtbl = &AudioClock2_Vtbl; - This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl; - - This->parent = dev; - IMMDevice_AddRef(This->parent); - - *out = (IAudioClient *)&This->IAudioClient3_iface; - IAudioClient3_AddRef(&This->IAudioClient3_iface); - - return S_OK; -} - /* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ extern HRESULT get_audio_session(const GUID *sessionguid, @@ -363,17 +301,5 @@ extern HRESULT get_audio_session(const GUID *sessionguid, HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, AudioSessionWrapper **out) { - AudioSession *session; - - HRESULT hr = get_audio_session(guid, device, 0, &session); - if(FAILED(hr)) - return hr; - - *out = session_wrapper_create(NULL); - if(!*out) - return E_OUTOFMEMORY; - - (*out)->session = session; - - return S_OK; + return E_NOTIMPL; } diff --git a/dlls/wineoss.drv/wineoss.drv.spec b/dlls/wineoss.drv/wineoss.drv.spec index 496a6eae570..c61d81e7ee9 100644 --- a/dlls/wineoss.drv/wineoss.drv.spec +++ b/dlls/wineoss.drv/wineoss.drv.spec @@ -7,5 +7,4 @@ # MMDevAPI driver functions @ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper diff --git a/dlls/winepulse.drv/Makefile.in b/dlls/winepulse.drv/Makefile.in index f5593dbcc70..7a78f4e854e 100644 --- a/dlls/winepulse.drv/Makefile.in +++ b/dlls/winepulse.drv/Makefile.in @@ -1,12 +1,9 @@ MODULE = winepulse.drv UNIXLIB = winepulse.so IMPORTS = dxguid uuid winmm user32 advapi32 ole32 version -PARENTSRC = ../mmdevapi UNIX_LIBS = $(PULSE_LIBS) $(PTHREAD_LIBS) -lm UNIX_CFLAGS = $(PULSE_CFLAGS)
C_SRCS = \ - client.c \ mmdevdrv.c \ - pulse.c \ - session.c + pulse.c diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 65fbc414ce4..0180c148f1e 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -117,13 +117,6 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) return TRUE; }
-extern const IAudioClient3Vtbl AudioClient3_Vtbl; -extern const IAudioRenderClientVtbl AudioRenderClient_Vtbl; -extern const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl; -extern const IAudioClockVtbl AudioClock_Vtbl; -extern const IAudioClock2Vtbl AudioClock2_Vtbl; -extern const IAudioStreamVolumeVtbl AudioStreamVolume_Vtbl; - extern struct audio_session_wrapper *session_wrapper_create( struct audio_client *client) DECLSPEC_HIDDEN;
@@ -343,58 +336,6 @@ BOOL WINAPI get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) return FALSE; }
-HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) -{ - ACImpl *This; - char *pulse_name; - EDataFlow dataflow; - unsigned len; - HRESULT hr; - - TRACE("%s %p %p\n", debugstr_guid(guid), dev, out); - - if (!get_device_name_from_guid(guid, &pulse_name, &dataflow)) - return AUDCLNT_E_DEVICE_INVALIDATED; - - if (dataflow != eRender && dataflow != eCapture) { - free(pulse_name); - return E_UNEXPECTED; - } - - *out = NULL; - - len = strlen(pulse_name) + 1; - This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, FIELD_OFFSET(ACImpl, device_name[len])); - if (!This) { - free(pulse_name); - return E_OUTOFMEMORY; - } - - memcpy(This->device_name, pulse_name, len); - free(pulse_name); - - This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; - This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; - This->IAudioCaptureClient_iface.lpVtbl = &AudioCaptureClient_Vtbl; - This->IAudioClock_iface.lpVtbl = &AudioClock_Vtbl; - This->IAudioClock2_iface.lpVtbl = &AudioClock2_Vtbl; - This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl; - This->dataflow = dataflow; - This->parent = dev; - - hr = CoCreateFreeThreadedMarshaler((IUnknown*)&This->IAudioClient3_iface, &This->marshal); - if (FAILED(hr)) { - HeapFree(GetProcessHeap(), 0, This); - return hr; - } - IMMDevice_AddRef(This->parent); - - *out = (IAudioClient *)&This->IAudioClient3_iface; - IAudioClient3_AddRef(&This->IAudioClient3_iface); - - return S_OK; -} - /* if channels == 0, then this will return or create a session with * matching dataflow and GUID. otherwise, channels must also match */ extern HRESULT get_audio_session(const GUID *sessionguid, @@ -403,19 +344,7 @@ extern HRESULT get_audio_session(const GUID *sessionguid, HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, AudioSessionWrapper **out) { - AudioSession *session; - - HRESULT hr = get_audio_session(guid, device, 0, &session); - if(FAILED(hr)) - return hr; - - *out = session_wrapper_create(NULL); - if(!*out) - return E_OUTOFMEMORY; - - (*out)->session = session; - - return S_OK; + return E_NOTIMPL; }
HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) diff --git a/dlls/winepulse.drv/winepulse.drv.spec b/dlls/winepulse.drv/winepulse.drv.spec index 9ae26ae35e9..79746fe4749 100644 --- a/dlls/winepulse.drv/winepulse.drv.spec +++ b/dlls/winepulse.drv/winepulse.drv.spec @@ -1,7 +1,6 @@ # MMDevAPI driver functions @ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioEndpoint(ptr ptr ptr) AUDDRV_GetAudioEndpoint @ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper @ stdcall -private GetPropValue(ptr ptr ptr) AUDDRV_GetPropValue
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winealsa.drv/mmdevdrv.c | 36 ----------------------------- dlls/winealsa.drv/winealsa.drv.spec | 1 - 2 files changed, 37 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index 4b42e64db72..50e53dcda41 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -51,33 +51,9 @@
WINE_DEFAULT_DEBUG_CHANNEL(alsa);
-#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER) - -static CRITICAL_SECTION g_sessions_lock; -static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = -{ - 0, 0, &g_sessions_lock, - { &g_sessions_lock_debug.ProcessLocksList, &g_sessions_lock_debug.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": g_sessions_lock") } -}; -static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, 0 }; - static WCHAR drv_key_devicesW[256]; static const WCHAR guidW[] = {'g','u','i','d',0};
-extern struct audio_session_wrapper *session_wrapper_create( - struct audio_client *client) DECLSPEC_HIDDEN; - -void DECLSPEC_HIDDEN sessions_lock(void) -{ - EnterCriticalSection(&g_sessions_lock); -} - -void DECLSPEC_HIDDEN sessions_unlock(void) -{ - LeaveCriticalSection(&g_sessions_lock); -} - BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) { switch (reason) @@ -101,7 +77,6 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) } case DLL_PROCESS_DETACH: if (reserved) break; - DeleteCriticalSection(&g_sessions_lock); break; } return TRUE; @@ -312,17 +287,6 @@ BOOL WINAPI get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) return FALSE; }
-/* if channels == 0, then this will return or create a session with - * matching dataflow and GUID. otherwise, channels must also match */ -extern HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out); - -HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, - AudioSessionWrapper **out) -{ - return E_NOTIMPL; -} - HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) { struct get_prop_value_params params; diff --git a/dlls/winealsa.drv/winealsa.drv.spec b/dlls/winealsa.drv/winealsa.drv.spec index a27c34b648f..ae6cfdd84ca 100644 --- a/dlls/winealsa.drv/winealsa.drv.spec +++ b/dlls/winealsa.drv/winealsa.drv.spec @@ -6,5 +6,4 @@ # MMDevAPI driver functions @ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper @ stdcall -private GetPropValue(ptr ptr ptr) AUDDRV_GetPropValue
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winecoreaudio.drv/mmdevdrv.c | 36 ------------------- dlls/winecoreaudio.drv/winecoreaudio.drv.spec | 1 - 2 files changed, 37 deletions(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index c5624506d2f..09668ee9699 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -46,32 +46,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(coreaudio);
-#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER) - static WCHAR drv_key_devicesW[256];
-static CRITICAL_SECTION g_sessions_lock; -static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = -{ - 0, 0, &g_sessions_lock, - { &g_sessions_lock_debug.ProcessLocksList, &g_sessions_lock_debug.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": g_sessions_lock") } -}; -static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, 0 }; - -extern struct audio_session_wrapper *session_wrapper_create( - struct audio_client *client) DECLSPEC_HIDDEN; - -void DECLSPEC_HIDDEN sessions_lock(void) -{ - EnterCriticalSection(&g_sessions_lock); -} - -void DECLSPEC_HIDDEN sessions_unlock(void) -{ - LeaveCriticalSection(&g_sessions_lock); -} - BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) { switch (reason) @@ -97,7 +73,6 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) } case DLL_PROCESS_DETACH: if (reserved) break; - DeleteCriticalSection(&g_sessions_lock); break; } return TRUE; @@ -305,14 +280,3 @@ BOOL WINAPI get_device_name_from_guid(const GUID *guid, char **name, EDataFlow *
return FALSE; } - -/* if channels == 0, then this will return or create a session with - * matching dataflow and GUID. otherwise, channels must also match */ -extern HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out); - -HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, - AudioSessionWrapper **out) -{ - return E_NOTIMPL; -} diff --git a/dlls/winecoreaudio.drv/winecoreaudio.drv.spec b/dlls/winecoreaudio.drv/winecoreaudio.drv.spec index 1c9751f9404..16cd7f08b2b 100644 --- a/dlls/winecoreaudio.drv/winecoreaudio.drv.spec +++ b/dlls/winecoreaudio.drv/winecoreaudio.drv.spec @@ -6,4 +6,3 @@ # MMDevAPI driver functions @ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/wineoss.drv/mmdevdrv.c | 37 ------------------------------- dlls/wineoss.drv/wineoss.drv.spec | 1 - 2 files changed, 38 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 1c71360a80a..4a45c532dd0 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -48,8 +48,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(oss);
-#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER) - typedef struct _OSSDevice { struct list entry; EDataFlow flow; @@ -62,28 +60,6 @@ static struct list g_devices = LIST_INIT(g_devices); static WCHAR drv_key_devicesW[256]; static const WCHAR guidW[] = {'g','u','i','d',0};
-static CRITICAL_SECTION g_sessions_lock; -static CRITICAL_SECTION_DEBUG g_sessions_lock_debug = -{ - 0, 0, &g_sessions_lock, - { &g_sessions_lock_debug.ProcessLocksList, &g_sessions_lock_debug.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": g_sessions_lock") } -}; -static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, 0 }; - -extern struct audio_session_wrapper *session_wrapper_create( - struct audio_client *client) DECLSPEC_HIDDEN; - -void DECLSPEC_HIDDEN sessions_lock(void) -{ - EnterCriticalSection(&g_sessions_lock); -} - -void DECLSPEC_HIDDEN sessions_unlock(void) -{ - LeaveCriticalSection(&g_sessions_lock); -} - BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) { switch (reason) @@ -110,8 +86,6 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) { OSSDevice *iter, *iter2;
- DeleteCriticalSection(&g_sessions_lock); - LIST_FOR_EACH_ENTRY_SAFE(iter, iter2, &g_devices, OSSDevice, entry){ HeapFree(GetProcessHeap(), 0, iter); } @@ -292,14 +266,3 @@ end:
return params.result; } - -/* if channels == 0, then this will return or create a session with - * matching dataflow and GUID. otherwise, channels must also match */ -extern HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out); - -HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, - AudioSessionWrapper **out) -{ - return E_NOTIMPL; -} diff --git a/dlls/wineoss.drv/wineoss.drv.spec b/dlls/wineoss.drv/wineoss.drv.spec index c61d81e7ee9..e12fb20fd17 100644 --- a/dlls/wineoss.drv/wineoss.drv.spec +++ b/dlls/wineoss.drv/wineoss.drv.spec @@ -7,4 +7,3 @@ # MMDevAPI driver functions @ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper
From: Davide Beatrici git@davidebeatrici.dev
--- dlls/winepulse.drv/mmdevdrv.c | 35 --------------------------- dlls/winepulse.drv/winepulse.drv.spec | 1 - 2 files changed, 36 deletions(-)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 0180c148f1e..3dbb88d880e 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -54,8 +54,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(pulse);
#define MAX_PULSE_NAME_LEN 256
-#define NULL_PTR_ERR MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, RPC_X_NULL_REF_POINTER) - static struct list g_devices_cache = LIST_INIT(g_devices_cache);
struct device_cache { @@ -72,25 +70,6 @@ static GUID pulse_capture_guid =
static WCHAR drv_key_devicesW[256];
-static CRITICAL_SECTION session_cs; -static CRITICAL_SECTION_DEBUG session_cs_debug = { - 0, 0, &session_cs, - { &session_cs_debug.ProcessLocksList, - &session_cs_debug.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": session_cs") } -}; -static CRITICAL_SECTION session_cs = { &session_cs_debug, -1, 0, 0, 0, 0 }; - -void DECLSPEC_HIDDEN sessions_lock(void) -{ - EnterCriticalSection(&session_cs); -} - -void DECLSPEC_HIDDEN sessions_unlock(void) -{ - LeaveCriticalSection(&session_cs); -} - BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) { if (reason == DLL_PROCESS_ATTACH) { @@ -117,9 +96,6 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved) return TRUE; }
-extern struct audio_session_wrapper *session_wrapper_create( - struct audio_client *client) DECLSPEC_HIDDEN; - static void pulse_call(enum unix_funcs code, void *params) { NTSTATUS status; @@ -336,17 +312,6 @@ BOOL WINAPI get_device_name_from_guid(GUID *guid, char **name, EDataFlow *flow) return FALSE; }
-/* if channels == 0, then this will return or create a session with - * matching dataflow and GUID. otherwise, channels must also match */ -extern HRESULT get_audio_session(const GUID *sessionguid, - IMMDevice *device, UINT channels, AudioSession **out); - -HRESULT WINAPI AUDDRV_GetAudioSessionWrapper(const GUID *guid, IMMDevice *device, - AudioSessionWrapper **out) -{ - return E_NOTIMPL; -} - HRESULT WINAPI AUDDRV_GetPropValue(GUID *guid, const PROPERTYKEY *prop, PROPVARIANT *out) { struct get_prop_value_params params; diff --git a/dlls/winepulse.drv/winepulse.drv.spec b/dlls/winepulse.drv/winepulse.drv.spec index 79746fe4749..fe5b62e053b 100644 --- a/dlls/winepulse.drv/winepulse.drv.spec +++ b/dlls/winepulse.drv/winepulse.drv.spec @@ -1,7 +1,6 @@ # MMDevAPI driver functions @ stdcall -private get_device_name_from_guid(ptr ptr ptr) get_device_name_from_guid @ stdcall -private GetEndpointIDs(long ptr ptr ptr ptr) AUDDRV_GetEndpointIDs -@ stdcall -private GetAudioSessionWrapper(ptr ptr ptr) AUDDRV_GetAudioSessionWrapper @ stdcall -private GetPropValue(ptr ptr ptr) AUDDRV_GetPropValue
# WinMM driver functions
This merge request was approved by Huw Davies.