[PATCH 8/8] wineoss: Move reset to the unixlib.

Huw Davies huw at codeweavers.com
Wed Apr 13 01:38:51 CDT 2022


Signed-off-by: Huw Davies <huw at codeweavers.com>
---
 dlls/wineoss.drv/mmdevdrv.c | 29 ++++-------------------------
 dlls/wineoss.drv/oss.c      | 27 +++++++++++++++++++++++++++
 dlls/wineoss.drv/unixlib.h  |  7 +++++++
 3 files changed, 38 insertions(+), 25 deletions(-)

diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index 75661f917cc..77548045702 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -977,38 +977,17 @@ static HRESULT WINAPI AudioClient_Stop(IAudioClient3 *iface)
 static HRESULT WINAPI AudioClient_Reset(IAudioClient3 *iface)
 {
     ACImpl *This = impl_from_IAudioClient3(iface);
-    struct oss_stream *stream = This->stream;
+    struct reset_params params;
 
     TRACE("(%p)\n", This);
 
     if(!This->stream)
         return AUDCLNT_E_NOT_INITIALIZED;
 
-    oss_lock(stream);
-
-    if(stream->playing){
-        oss_unlock(stream);
-        return AUDCLNT_E_NOT_STOPPED;
-    }
-
-    if(stream->getbuf_last){
-        oss_unlock(stream);
-        return AUDCLNT_E_BUFFER_OPERATION_PENDING;
-    }
-
-    if(stream->flow == eRender){
-        stream->written_frames = 0;
-        stream->last_pos_frames = 0;
-    }else{
-        stream->written_frames += stream->held_frames;
-    }
-    stream->held_frames = 0;
-    stream->lcl_offs_frames = 0;
-    stream->in_oss_frames = 0;
-
-    oss_unlock(stream);
+    params.stream = This->stream;
+    OSS_CALL(reset, &params);
 
-    return S_OK;
+    return params.result;
 }
 
 static HRESULT WINAPI AudioClient_SetEventHandle(IAudioClient3 *iface,
diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c
index bcd07c2d2fc..72e917dfd76 100644
--- a/dlls/wineoss.drv/oss.c
+++ b/dlls/wineoss.drv/oss.c
@@ -661,6 +661,32 @@ static NTSTATUS stop(void *args)
     return oss_unlock_result(stream, &params->result, S_OK);
 }
 
+static NTSTATUS reset(void *args)
+{
+    struct reset_params *params = args;
+    struct oss_stream *stream = params->stream;
+
+    oss_lock(stream);
+
+    if(stream->playing)
+        return oss_unlock_result(stream, &params->result, AUDCLNT_E_NOT_STOPPED);
+
+    if(stream->getbuf_last)
+        return oss_unlock_result(stream, &params->result, AUDCLNT_E_BUFFER_OPERATION_PENDING);
+
+    if(stream->flow == eRender){
+        stream->written_frames = 0;
+        stream->last_pos_frames = 0;
+    }else{
+        stream->written_frames += stream->held_frames;
+    }
+    stream->held_frames = 0;
+    stream->lcl_offs_frames = 0;
+    stream->in_oss_frames = 0;
+
+    return oss_unlock_result(stream, &params->result, S_OK);
+}
+
 static void silence_buffer(struct oss_stream *stream, BYTE *buffer, UINT32 frames)
 {
     WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE*)stream->fmt;
@@ -1025,6 +1051,7 @@ unixlib_entry_t __wine_unix_call_funcs[] =
     release_stream,
     start,
     stop,
+    reset,
     timer_loop,
     is_format_supported,
     get_mix_format,
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h
index c69ef1c3e4b..bd4b065c61e 100644
--- a/dlls/wineoss.drv/unixlib.h
+++ b/dlls/wineoss.drv/unixlib.h
@@ -102,6 +102,12 @@ struct stop_params
     HRESULT result;
 };
 
+struct reset_params
+{
+    struct oss_stream *stream;
+    HRESULT result;
+};
+
 struct timer_loop_params
 {
     struct oss_stream *stream;
@@ -154,6 +160,7 @@ enum oss_funcs
     oss_release_stream,
     oss_start,
     oss_stop,
+    oss_reset,
     oss_timer_loop,
     oss_is_format_supported,
     oss_get_mix_format,
-- 
2.25.1




More information about the wine-devel mailing list