From cc8e8bc6920aa8999c55ffe1a744ad9c3983e934 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 13 Apr 2022 07:38:49 +0100 Subject: [PATCH] wineoss: Move start to the unixlib. Signed-off-by: Huw Davies Signed-off-by: Andrew Eikum Signed-off-by: Alexandre Julliard --- dlls/wineoss.drv/mmdevdrv.c | 24 +++++------------------- dlls/wineoss.drv/oss.c | 19 +++++++++++++++++++ dlls/wineoss.drv/unixlib.h | 7 +++++++ 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index 8f2b19c8faa..e50a7b32338 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -934,7 +934,7 @@ static void silence_buffer(struct oss_stream *stream, BYTE *buffer, UINT32 frame static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) { ACImpl *This = impl_from_IAudioClient3(iface); - struct oss_stream *stream = This->stream; + struct start_params params; TRACE("(%p)\n", This); @@ -945,31 +945,17 @@ static HRESULT WINAPI AudioClient_Start(IAudioClient3 *iface) return AUDCLNT_E_NOT_INITIALIZED; } - oss_lock(stream); + params.stream = This->stream; + OSS_CALL(start, ¶ms); - if((stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !stream->event){ - oss_unlock(stream); - LeaveCriticalSection(&g_sessions_lock); - return AUDCLNT_E_EVENTHANDLE_NOT_SET; - } - - if(stream->playing){ - oss_unlock(stream); - LeaveCriticalSection(&g_sessions_lock); - return AUDCLNT_E_NOT_STOPPED; - } - - if(!This->timer_thread){ + if(SUCCEEDED(params.result) && !This->timer_thread){ This->timer_thread = CreateThread(NULL, 0, timer_thread, This->stream, 0, NULL); SetThreadPriority(This->timer_thread, THREAD_PRIORITY_TIME_CRITICAL); } - stream->playing = TRUE; - - oss_unlock(stream); LeaveCriticalSection(&g_sessions_lock); - return S_OK; + return params.result; } static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface) diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index b0dc22a500f..241b6d014ec 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -627,6 +627,24 @@ static NTSTATUS release_stream(void *args) return STATUS_SUCCESS; } +static NTSTATUS start(void *args) +{ + struct start_params *params = args; + struct oss_stream *stream = params->stream; + + oss_lock(stream); + + if((stream->flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) && !stream->event) + return oss_unlock_result(stream, ¶ms->result, AUDCLNT_E_EVENTHANDLE_NOT_SET); + + if(stream->playing) + return oss_unlock_result(stream, ¶ms->result, AUDCLNT_E_NOT_STOPPED); + + stream->playing = TRUE; + + return oss_unlock_result(stream, ¶ms->result, S_OK); +} + static void silence_buffer(struct oss_stream *stream, BYTE *buffer, UINT32 frames) { WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)stream->fmt; @@ -989,6 +1007,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = get_endpoint_ids, create_stream, release_stream, + start, timer_loop, is_format_supported, get_mix_format, diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h index 2902bceb949..7418261282d 100644 --- a/dlls/wineoss.drv/unixlib.h +++ b/dlls/wineoss.drv/unixlib.h @@ -90,6 +90,12 @@ struct release_stream_params HRESULT result; }; +struct start_params +{ + struct oss_stream *stream; + HRESULT result; +}; + struct timer_loop_params { struct oss_stream *stream; @@ -140,6 +146,7 @@ enum oss_funcs oss_get_endpoint_ids, oss_create_stream, oss_release_stream, + oss_start, oss_timer_loop, oss_is_format_supported, oss_get_mix_format,