Jacek Caban : winepulse: Move pulse stream destruction to unix lib.
Alexandre Julliard
julliard at winehq.org
Wed May 12 15:44:30 CDT 2021
Module: wine
Branch: master
Commit: 0eeefec6c56084a0677403aee46493e2c03a1dca
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0eeefec6c56084a0677403aee46493e2c03a1dca
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue May 11 18:31:34 2021 +0200
winepulse: Move pulse stream destruction to unix lib.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winepulse.drv/mmdevdrv.c | 19 ++-----------------
dlls/winepulse.drv/pulse.c | 24 ++++++++++++++++++++++++
dlls/winepulse.drv/unixlib.h | 1 +
3 files changed, 27 insertions(+), 17 deletions(-)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
index 1531a2c0075..4c962069c97 100644
--- a/dlls/winepulse.drv/mmdevdrv.c
+++ b/dlls/winepulse.drv/mmdevdrv.c
@@ -868,24 +868,9 @@ static ULONG WINAPI AudioClient_Release(IAudioClient3 *iface)
TRACE("(%p) Refcount now %u\n", This, ref);
if (!ref) {
if (This->pulse_stream) {
- if(This->timer) {
- This->pulse_stream->please_quit = TRUE;
- WaitForSingleObject(This->timer, INFINITE);
- CloseHandle(This->timer);
- }
-
- pulse->lock();
- if (PA_STREAM_IS_GOOD(pa_stream_get_state(This->pulse_stream->stream))) {
- pa_stream_disconnect(This->pulse_stream->stream);
- while (PA_STREAM_IS_GOOD(pa_stream_get_state(This->pulse_stream->stream)))
- pulse->cond_wait();
- }
- pa_stream_unref(This->pulse_stream->stream);
- HeapFree(GetProcessHeap(), 0, This->pulse_stream->tmp_buffer);
- HeapFree(GetProcessHeap(), 0, This->pulse_stream->peek_buffer);
- HeapFree(GetProcessHeap(), 0, This->pulse_stream->local_buffer);
- HeapFree(GetProcessHeap(), 0, This->pulse_stream);
+ pulse->release_stream(This->pulse_stream, This->timer);
This->pulse_stream = NULL;
+ pulse->lock();
list_remove(&This->entry);
pulse->unlock();
}
diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c
index 5f4998e641f..23b362c8689 100644
--- a/dlls/winepulse.drv/pulse.c
+++ b/dlls/winepulse.drv/pulse.c
@@ -477,6 +477,29 @@ fail:
return E_FAIL;
}
+static void WINAPI pulse_release_stream(struct pulse_stream *stream, HANDLE timer)
+{
+ if(timer) {
+ stream->please_quit = TRUE;
+ NtWaitForSingleObject(timer, FALSE, NULL);
+ NtClose(timer);
+ }
+
+ pulse_lock();
+ if (PA_STREAM_IS_GOOD(pa_stream_get_state(stream->stream))) {
+ pa_stream_disconnect(stream->stream);
+ while (PA_STREAM_IS_GOOD(pa_stream_get_state(stream->stream)))
+ pulse_cond_wait();
+ }
+ pa_stream_unref(stream->stream);
+ pulse_unlock();
+
+ RtlFreeHeap(GetProcessHeap(), 0, stream->tmp_buffer);
+ RtlFreeHeap(GetProcessHeap(), 0, stream->peek_buffer);
+ RtlFreeHeap(GetProcessHeap(), 0, stream->local_buffer);
+ RtlFreeHeap(GetProcessHeap(), 0, stream);
+}
+
static const struct unix_funcs unix_funcs =
{
pulse_lock,
@@ -485,6 +508,7 @@ static const struct unix_funcs unix_funcs =
pulse_broadcast,
pulse_main_loop,
pulse_connect,
+ pulse_release_stream,
pulse_test_connect,
};
diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h
index 89d3c05611a..d02ab4fdf07 100644
--- a/dlls/winepulse.drv/unixlib.h
+++ b/dlls/winepulse.drv/unixlib.h
@@ -65,5 +65,6 @@ struct unix_funcs
void (WINAPI *broadcast)(void);
void (WINAPI *main_loop)(void);
HRESULT (WINAPI *connect)(const char *name, pa_context **ret);
+ void (WINAPI *release_stream)(struct pulse_stream *stream, HANDLE timer);
HRESULT (WINAPI *test_connect)(const char *name, struct pulse_config *config);
};
More information about the wine-cvs
mailing list