Signed-off-by: Huw Davies huw@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, ¶ms);
- 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, ¶ms->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, ¶ms->result, AUDCLNT_E_NOT_STOPPED); + + if(stream->getbuf_last) + return oss_unlock_result(stream, ¶ms->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, ¶ms->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,