[PATCH 6/7] winepulse: Move pulse stream destruction to unix lib.

Andrew Eikum aeikum at codeweavers.com
Wed May 12 11:37:33 CDT 2021


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Tue, May 11, 2021 at 06:31:34PM +0200, Jacek Caban wrote:
> Signed-off-by: Jacek Caban <jacek at codeweavers.com>
> ---
>  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-devel mailing list