[PATCH 3/5] winepulse: Move pulse_get_render_buffer to unix lib.

Andrew Eikum aeikum at codeweavers.com
Tue May 18 16:30:34 CDT 2021


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

On Tue, May 18, 2021 at 04:58:55PM +0200, Jacek Caban wrote:
> Signed-off-by: Jacek Caban <jacek at codeweavers.com>
> ---
>  dlls/winepulse.drv/mmdevdrv.c | 47 ++------------------------
>  dlls/winepulse.drv/pulse.c    | 62 +++++++++++++++++++++++++++++++++++
>  dlls/winepulse.drv/unixlib.h  |  1 +
>  3 files changed, 66 insertions(+), 44 deletions(-)
> 
> 

> diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
> index 0cfb1106d2c..63c14b0ae68 100644
> --- a/dlls/winepulse.drv/mmdevdrv.c
> +++ b/dlls/winepulse.drv/mmdevdrv.c
> @@ -1180,61 +1180,20 @@ static ULONG WINAPI AudioRenderClient_Release(IAudioRenderClient *iface)
>      return AudioClient_Release(&This->IAudioClient3_iface);
>  }
>  
> -static void alloc_tmp_buffer(ACImpl *This, UINT32 bytes)
> -{
> -    if(This->pulse_stream->tmp_buffer_bytes >= bytes)
> -        return;
> -
> -    HeapFree(GetProcessHeap(), 0, This->pulse_stream->tmp_buffer);
> -    This->pulse_stream->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, bytes);
> -    This->pulse_stream->tmp_buffer_bytes = bytes;
> -}
> -
>  static HRESULT WINAPI AudioRenderClient_GetBuffer(IAudioRenderClient *iface,
>          UINT32 frames, BYTE **data)
>  {
>      ACImpl *This = impl_from_IAudioRenderClient(iface);
> -    size_t bytes = frames * pa_frame_size(&This->pulse_stream->ss);
> -    HRESULT hr = S_OK;
> -    UINT32 wri_offs_bytes;
>  
>      TRACE("(%p)->(%u, %p)\n", This, frames, data);
>  
>      if (!data)
>          return E_POINTER;
> +    if (!This->pulse_stream)
> +        return AUDCLNT_E_NOT_INITIALIZED;
>      *data = NULL;
>  
> -    pulse->lock();
> -    hr = pulse_stream_valid(This);
> -    if (FAILED(hr) || This->pulse_stream->locked) {
> -        pulse->unlock();
> -        return FAILED(hr) ? hr : AUDCLNT_E_OUT_OF_ORDER;
> -    }
> -    if (!frames) {
> -        pulse->unlock();
> -        return S_OK;
> -    }
> -
> -    if(This->pulse_stream->held_bytes / pa_frame_size(&This->pulse_stream->ss) + frames > This->pulse_stream->bufsize_frames){
> -        pulse->unlock();
> -        return AUDCLNT_E_BUFFER_TOO_LARGE;
> -    }
> -
> -    wri_offs_bytes = (This->pulse_stream->lcl_offs_bytes + This->pulse_stream->held_bytes) % This->pulse_stream->real_bufsize_bytes;
> -    if(wri_offs_bytes + bytes > This->pulse_stream->real_bufsize_bytes){
> -        alloc_tmp_buffer(This, bytes);
> -        *data = This->pulse_stream->tmp_buffer;
> -        This->pulse_stream->locked = -bytes;
> -    }else{
> -        *data = This->pulse_stream->local_buffer + wri_offs_bytes;
> -        This->pulse_stream->locked = bytes;
> -    }
> -
> -    silence_buffer(This->pulse_stream->ss.format, *data, bytes);
> -
> -    pulse->unlock();
> -
> -    return hr;
> +    return pulse->get_render_buffer(This->pulse_stream, frames, data);
>  }
>  
>  static void pulse_wrap_buffer(ACImpl *This, BYTE *buffer, UINT32 written_bytes)
> diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c
> index dbdf94b2672..767e555017f 100644
> --- a/dlls/winepulse.drv/pulse.c
> +++ b/dlls/winepulse.drv/pulse.c
> @@ -1406,6 +1406,67 @@ static HRESULT WINAPI pulse_reset(struct pulse_stream *stream)
>      return S_OK;
>  }
>  
> +static void alloc_tmp_buffer(struct pulse_stream *stream, UINT32 bytes)
> +{
> +    if (stream->tmp_buffer_bytes >= bytes)
> +        return;
> +
> +    RtlFreeHeap(GetProcessHeap(), 0, stream->tmp_buffer);
> +    stream->tmp_buffer = RtlAllocateHeap(GetProcessHeap(), 0, bytes);
> +    stream->tmp_buffer_bytes = bytes;
> +}
> +
> +static HRESULT WINAPI pulse_get_render_buffer(struct pulse_stream *stream, UINT32 frames, BYTE **data)
> +{
> +    size_t bytes;
> +    UINT32 wri_offs_bytes;
> +
> +    pulse_lock();
> +    if (!pulse_stream_valid(stream))
> +    {
> +        pulse_unlock();
> +        return AUDCLNT_E_DEVICE_INVALIDATED;
> +    }
> +
> +    if (stream->locked)
> +    {
> +        pulse_unlock();
> +        return AUDCLNT_E_OUT_OF_ORDER;
> +    }
> +
> +    if (!frames)
> +    {
> +        pulse_unlock();
> +        *data = NULL;
> +        return S_OK;
> +    }
> +
> +    if (stream->held_bytes / pa_frame_size(&stream->ss) + frames > stream->bufsize_frames)
> +    {
> +        pulse_unlock();
> +        return AUDCLNT_E_BUFFER_TOO_LARGE;
> +    }
> +
> +    bytes = frames * pa_frame_size(&stream->ss);
> +    wri_offs_bytes = (stream->lcl_offs_bytes + stream->held_bytes) % stream->real_bufsize_bytes;
> +    if (wri_offs_bytes + bytes > stream->real_bufsize_bytes)
> +    {
> +        alloc_tmp_buffer(stream, bytes);
> +        *data = stream->tmp_buffer;
> +        stream->locked = -bytes;
> +    }
> +    else
> +    {
> +        *data = stream->local_buffer + wri_offs_bytes;
> +        stream->locked = bytes;
> +    }
> +
> +    silence_buffer(stream->ss.format, *data, bytes);
> +
> +    pulse_unlock();
> +    return S_OK;
> +}
> +
>  static void WINAPI pulse_set_volumes(struct pulse_stream *stream, float master_volume,
>                                       const float *volumes, const float *session_volumes)
>  {
> @@ -1427,6 +1488,7 @@ static const struct unix_funcs unix_funcs =
>      pulse_stop,
>      pulse_reset,
>      pulse_timer_loop,
> +    pulse_get_render_buffer,
>      pulse_set_volumes,
>      pulse_test_connect,
>  };
> diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h
> index f6ecf778558..f1f5d7ee66d 100644
> --- a/dlls/winepulse.drv/unixlib.h
> +++ b/dlls/winepulse.drv/unixlib.h
> @@ -81,6 +81,7 @@ struct unix_funcs
>      HRESULT (WINAPI *stop)(struct pulse_stream *stream);
>      HRESULT (WINAPI *reset)(struct pulse_stream *stream);
>      void (WINAPI *timer_loop)(struct pulse_stream *stream);
> +    HRESULT (WINAPI *get_render_buffer)(struct pulse_stream *stream, UINT32 frames, BYTE **data);
>      void (WINAPI *set_volumes)(struct pulse_stream *stream, float master_volume,
>                                 const float *volumes, const float *session_volumes);
>      HRESULT (WINAPI *test_connect)(const char *name, struct pulse_config *config);
> 




More information about the wine-devel mailing list