From: Davide Beatrici git@davidebeatrici.dev
--- dlls/mmdevapi/client.c | 46 +++++++++++++++++++++++++++++++++++ dlls/winepulse.drv/mmdevdrv.c | 44 ++------------------------------- 2 files changed, 48 insertions(+), 42 deletions(-)
diff --git a/dlls/mmdevapi/client.c b/dlls/mmdevapi/client.c index e30e459c6c5..9e96236bc90 100644 --- a/dlls/mmdevapi/client.c +++ b/dlls/mmdevapi/client.c @@ -80,6 +80,20 @@ static inline struct audio_client *impl_from_IAudioStreamVolume(IAudioStreamVolu return CONTAINING_RECORD(iface, struct audio_client, IAudioStreamVolume_iface); }
+static DWORD CALLBACK timer_loop_func(void *user) +{ + struct timer_loop_params params; + struct audio_client *This = user; + + SetThreadDescription(GetCurrentThread(), L"audio_client_timer"); + + params.stream = This->stream; + + WINE_UNIX_CALL(timer_loop, ¶ms); + + return 0; +} + static HRESULT WINAPI capture_QueryInterface(IAudioCaptureClient *iface, REFIID riid, void **ppv) { struct audio_client *This = impl_from_IAudioCaptureClient(iface); @@ -196,6 +210,38 @@ const IAudioCaptureClientVtbl AudioCaptureClient_Vtbl = capture_GetNextPacketSize };
+HRESULT WINAPI client_Start(IAudioClient3 *iface) +{ + struct audio_client *This = impl_from_IAudioClient3(iface); + struct start_params params; + + TRACE("(%p)\n", This); + + sessions_lock(); + + if (!This->stream) { + params.result = AUDCLNT_E_NOT_INITIALIZED; + goto exit; + } + + params.stream = This->stream; + + 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))) { + params.result = E_FAIL; + goto exit; + } + + SetThreadPriority(This->timer_thread, THREAD_PRIORITY_TIME_CRITICAL); + } +exit: + sessions_unlock(); + + return params.result; +} + HRESULT WINAPI client_Stop(IAudioClient3 *iface) { struct audio_client *This = impl_from_IAudioClient3(iface); diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c index 1a358af660f..b8b0eff3116 100644 --- a/dlls/winepulse.drv/mmdevdrv.c +++ b/dlls/winepulse.drv/mmdevdrv.c @@ -275,16 +275,6 @@ static WCHAR *get_application_name(BOOL query_app_name) return wcsdup(name); }
-static DWORD WINAPI pulse_timer_cb(void *user) -{ - struct timer_loop_params params; - ACImpl *This = user; - params.stream = This->stream; - SetThreadDescription(GetCurrentThread(), L"winepulse_timer_loop"); - pulse_call(timer_loop, ¶ms); - return 0; -} - static void set_stream_volumes(ACImpl *This) { struct set_volumes_params params; @@ -948,37 +938,7 @@ static HRESULT WINAPI AudioClient_GetDevicePeriod(IAudioClient3 *iface, return params.result; }
-static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) -{ - ACImpl *This = impl_from_IAudioClient3(iface); - struct start_params params; - - TRACE("(%p)\n", This); - - sessions_lock(); - - if (!This->stream) { - params.result = AUDCLNT_E_NOT_INITIALIZED; - goto exit; - } - - params.stream = This->stream; - - WINE_UNIX_CALL(start, ¶ms); - - if (SUCCEEDED(params.result) && !This->timer_thread) { - if (!(This->timer_thread = CreateThread(NULL, 0, pulse_timer_cb, This, 0, NULL))) { - params.result = E_FAIL; - goto exit; - } - - SetThreadPriority(This->timer_thread, THREAD_PRIORITY_TIME_CRITICAL); - } -exit: - sessions_unlock(); - - return params.result; -} +extern HRESULT WINAPI client_Start(IAudioClient3 *iface);
extern HRESULT WINAPI client_Stop(IAudioClient3 *iface);
@@ -1023,7 +983,7 @@ static const IAudioClient3Vtbl AudioClient3_Vtbl = AudioClient_IsFormatSupported, AudioClient_GetMixFormat, AudioClient_GetDevicePeriod, - AudioClient_Start, + client_Start, client_Stop, client_Reset, client_SetEventHandle,