Signed-off-by: Andrew Eikum aeikum@codeweavers.com
On Fri, Mar 04, 2022 at 09:54:22AM +0000, Huw Davies wrote:
Signed-off-by: Huw Davies huw@codeweavers.com
dlls/winealsa.drv/alsa.c | 29 +++++++++++++++++++++++++++++ dlls/winealsa.drv/mmdevdrv.c | 31 +++++-------------------------- dlls/winealsa.drv/unixlib.h | 8 ++++++++ 3 files changed, 42 insertions(+), 26 deletions(-)
diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c index 60ef49c4c1a..02063fd3374 100644 --- a/dlls/winealsa.drv/alsa.c +++ b/dlls/winealsa.drv/alsa.c @@ -1752,6 +1752,34 @@ static NTSTATUS get_capture_buffer(void *args) return alsa_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 alsa_stream *stream = params->stream;
- UINT32 done = params->done;
- alsa_lock(stream);
- if(!done){
stream->getbuf_last = 0;
return alsa_unlock_result(stream, ¶ms->result, S_OK);
- }
- if(!stream->getbuf_last)
return alsa_unlock_result(stream, ¶ms->result, AUDCLNT_E_OUT_OF_ORDER);
- if(stream->getbuf_last != done)
return alsa_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 alsa_unlock_result(stream, ¶ms->result, S_OK);
+}
static NTSTATUS is_format_supported(void *args) { struct is_format_supported_params *params = args; @@ -2086,6 +2114,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/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index cecb358bab7..b50025aa77c 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -1398,37 +1398,16 @@ static HRESULT WINAPI AudioCaptureClient_ReleaseBuffer( IAudioCaptureClient *iface, UINT32 done) { ACImpl *This = impl_from_IAudioCaptureClient(iface);
- struct alsa_stream *stream = This->stream;
struct release_capture_buffer_params params;
TRACE("(%p)->(%u)\n", This, done);
- alsa_lock(stream);
- if(!done){
stream->getbuf_last = 0;
alsa_unlock(stream);
return S_OK;
- }
- if(!stream->getbuf_last){
alsa_unlock(stream);
return AUDCLNT_E_OUT_OF_ORDER;
- }
- if(stream->getbuf_last != done){
alsa_unlock(stream);
return AUDCLNT_E_INVALID_SIZE;
- }
- params.stream = This->stream;
- params.done = done;
- stream->written_frames += done;
- stream->held_frames -= done;
- stream->lcl_offs_frames += done;
- stream->lcl_offs_frames %= stream->bufsize_frames;
- stream->getbuf_last = 0;
- ALSA_CALL(release_capture_buffer, ¶ms);
- alsa_unlock(stream);
- return S_OK;
- return params.result;
}
static HRESULT WINAPI AudioCaptureClient_GetNextPacketSize( diff --git a/dlls/winealsa.drv/unixlib.h b/dlls/winealsa.drv/unixlib.h index c4efe5ad764..ddca1a3100c 100644 --- a/dlls/winealsa.drv/unixlib.h +++ b/dlls/winealsa.drv/unixlib.h @@ -141,6 +141,13 @@ struct get_capture_buffer_params UINT64 *qpcpos; };
+struct release_capture_buffer_params +{
- struct alsa_stream *stream;
- UINT32 done;
- HRESULT result;
+};
struct is_format_supported_params { const char *alsa_name; @@ -199,6 +206,7 @@ enum alsa_funcs alsa_get_render_buffer, alsa_release_render_buffer, alsa_get_capture_buffer,
- alsa_release_capture_buffer, alsa_is_format_supported, alsa_get_mix_format, alsa_get_buffer_size,
-- 2.25.1