Signed-off-by: Huw Davies huw@codeweavers.com --- dlls/wineoss.drv/mmdevdrv.c | 32 +++++--------------------------- dlls/wineoss.drv/oss.c | 29 +++++++++++++++++++++++++++++ dlls/wineoss.drv/unixlib.h | 8 ++++++++ 3 files changed, 42 insertions(+), 27 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index cc9d22d21d0..80bac1d9ceb 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -1349,37 +1349,15 @@ static HRESULT WINAPI AudioCaptureClient_ReleaseBuffer( IAudioCaptureClient *iface, UINT32 done) { ACImpl *This = impl_from_IAudioCaptureClient(iface); - struct oss_stream *stream = This->stream; + struct release_capture_buffer_params params;
TRACE("(%p)->(%u)\n", This, done);
- oss_lock(stream); - - if(!done){ - stream->getbuf_last = 0; - oss_unlock(stream); - return S_OK; - } - - if(!stream->getbuf_last){ - oss_unlock(stream); - return AUDCLNT_E_OUT_OF_ORDER; - } - - if(stream->getbuf_last != done){ - oss_unlock(stream); - return AUDCLNT_E_INVALID_SIZE; - } - - stream->written_frames += done; - stream->held_frames -= done; - stream->lcl_offs_frames += done; - stream->lcl_offs_frames %= stream->bufsize_frames; - stream->getbuf_last = 0; - - oss_unlock(stream); + params.stream = This->stream; + params.done = done; + OSS_CALL(release_capture_buffer, ¶ms);
- return S_OK; + return params.result; }
static HRESULT WINAPI AudioCaptureClient_GetNextPacketSize( diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 2e811f9b424..f1994295618 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1048,6 +1048,34 @@ static NTSTATUS get_capture_buffer(void *args) return oss_unlock_result(stream, ¶ms->result, *frames ? S_OK : AUDCLNT_S_BUFFER_EMPTY); }
+static NTSTATUS release_capture_buffer(void *args) +{ + struct release_capture_buffer_params *params = args; + struct oss_stream *stream = params->stream; + UINT32 done = params->done; + + oss_lock(stream); + + if(!done){ + stream->getbuf_last = 0; + return oss_unlock_result(stream, ¶ms->result, S_OK); + } + + if(!stream->getbuf_last) + return oss_unlock_result(stream, ¶ms->result, AUDCLNT_E_OUT_OF_ORDER); + + if(stream->getbuf_last != done) + return oss_unlock_result(stream, ¶ms->result, AUDCLNT_E_INVALID_SIZE); + + stream->written_frames += done; + stream->held_frames -= done; + stream->lcl_offs_frames += done; + stream->lcl_offs_frames %= stream->bufsize_frames; + stream->getbuf_last = 0; + + return oss_unlock_result(stream, ¶ms->result, S_OK); +} + static NTSTATUS is_format_supported(void *args) { struct is_format_supported_params *params = args; @@ -1248,6 +1276,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = get_render_buffer, release_render_buffer, get_capture_buffer, + release_capture_buffer, is_format_supported, get_mix_format, get_buffer_size, diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h index ca6d1d69de3..2f0884b9ac5 100644 --- a/dlls/wineoss.drv/unixlib.h +++ b/dlls/wineoss.drv/unixlib.h @@ -140,6 +140,13 @@ struct get_capture_buffer_params UINT64 *qpcpos; };
+struct release_capture_buffer_params +{ + struct oss_stream *stream; + UINT32 done; + HRESULT result; +}; + struct is_format_supported_params { const char *device; @@ -199,6 +206,7 @@ enum oss_funcs oss_get_render_buffer, oss_release_render_buffer, oss_get_capture_buffer, + oss_release_capture_buffer, oss_is_format_supported, oss_get_mix_format, oss_get_buffer_size,
Signed-off-by: Andrew Eikum aeikum@codeweavers.com
On Fri, Apr 15, 2022 at 07:59:58AM +0100, Huw Davies wrote:
Signed-off-by: Huw Davies huw@codeweavers.com
dlls/wineoss.drv/mmdevdrv.c | 32 +++++--------------------------- dlls/wineoss.drv/oss.c | 29 +++++++++++++++++++++++++++++ dlls/wineoss.drv/unixlib.h | 8 ++++++++ 3 files changed, 42 insertions(+), 27 deletions(-)
diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c index cc9d22d21d0..80bac1d9ceb 100644 --- a/dlls/wineoss.drv/mmdevdrv.c +++ b/dlls/wineoss.drv/mmdevdrv.c @@ -1349,37 +1349,15 @@ static HRESULT WINAPI AudioCaptureClient_ReleaseBuffer( IAudioCaptureClient *iface, UINT32 done) { ACImpl *This = impl_from_IAudioCaptureClient(iface);
- struct oss_stream *stream = This->stream;
struct release_capture_buffer_params params;
TRACE("(%p)->(%u)\n", This, done);
- oss_lock(stream);
- if(!done){
stream->getbuf_last = 0;
oss_unlock(stream);
return S_OK;
- }
- if(!stream->getbuf_last){
oss_unlock(stream);
return AUDCLNT_E_OUT_OF_ORDER;
- }
- if(stream->getbuf_last != done){
oss_unlock(stream);
return AUDCLNT_E_INVALID_SIZE;
- }
- stream->written_frames += done;
- stream->held_frames -= done;
- stream->lcl_offs_frames += done;
- stream->lcl_offs_frames %= stream->bufsize_frames;
- stream->getbuf_last = 0;
- oss_unlock(stream);
- params.stream = This->stream;
- params.done = done;
- OSS_CALL(release_capture_buffer, ¶ms);
- return S_OK;
- return params.result;
}
static HRESULT WINAPI AudioCaptureClient_GetNextPacketSize( diff --git a/dlls/wineoss.drv/oss.c b/dlls/wineoss.drv/oss.c index 2e811f9b424..f1994295618 100644 --- a/dlls/wineoss.drv/oss.c +++ b/dlls/wineoss.drv/oss.c @@ -1048,6 +1048,34 @@ static NTSTATUS get_capture_buffer(void *args) return oss_unlock_result(stream, ¶ms->result, *frames ? S_OK : AUDCLNT_S_BUFFER_EMPTY); }
+static NTSTATUS release_capture_buffer(void *args) +{
- struct release_capture_buffer_params *params = args;
- struct oss_stream *stream = params->stream;
- UINT32 done = params->done;
- oss_lock(stream);
- if(!done){
stream->getbuf_last = 0;
return oss_unlock_result(stream, ¶ms->result, S_OK);
- }
- if(!stream->getbuf_last)
return oss_unlock_result(stream, ¶ms->result, AUDCLNT_E_OUT_OF_ORDER);
- if(stream->getbuf_last != done)
return oss_unlock_result(stream, ¶ms->result, AUDCLNT_E_INVALID_SIZE);
- stream->written_frames += done;
- stream->held_frames -= done;
- stream->lcl_offs_frames += done;
- stream->lcl_offs_frames %= stream->bufsize_frames;
- stream->getbuf_last = 0;
- return oss_unlock_result(stream, ¶ms->result, S_OK);
+}
static NTSTATUS is_format_supported(void *args) { struct is_format_supported_params *params = args; @@ -1248,6 +1276,7 @@ unixlib_entry_t __wine_unix_call_funcs[] = get_render_buffer, release_render_buffer, get_capture_buffer,
- release_capture_buffer, is_format_supported, get_mix_format, get_buffer_size,
diff --git a/dlls/wineoss.drv/unixlib.h b/dlls/wineoss.drv/unixlib.h index ca6d1d69de3..2f0884b9ac5 100644 --- a/dlls/wineoss.drv/unixlib.h +++ b/dlls/wineoss.drv/unixlib.h @@ -140,6 +140,13 @@ struct get_capture_buffer_params UINT64 *qpcpos; };
+struct release_capture_buffer_params +{
- struct oss_stream *stream;
- UINT32 done;
- HRESULT result;
+};
struct is_format_supported_params { const char *device; @@ -199,6 +206,7 @@ enum oss_funcs oss_get_render_buffer, oss_release_render_buffer, oss_get_capture_buffer,
- oss_release_capture_buffer, oss_is_format_supported, oss_get_mix_format, oss_get_buffer_size,
-- 2.25.1