[PATCH 1/9] winepulse: Move pulse_read to unix lib.

Andrew Eikum aeikum at codeweavers.com
Mon May 17 14:58:55 CDT 2021


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

On Thu, May 13, 2021 at 04:03:19PM +0200, Jacek Caban wrote:
> Signed-off-by: Jacek Caban <jacek at codeweavers.com>
> ---
>  dlls/winepulse.drv/mmdevdrv.c |  92 +------------------------------
>  dlls/winepulse.drv/pulse.c    | 101 ++++++++++++++++++++++++++++++++++
>  dlls/winepulse.drv/unixlib.h  |   1 +
>  3 files changed, 103 insertions(+), 91 deletions(-)
> 
> 

> diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
> index d0d497c4bbb..0e1da1364fa 100644
> --- a/dlls/winepulse.drv/mmdevdrv.c
> +++ b/dlls/winepulse.drv/mmdevdrv.c
> @@ -434,96 +434,6 @@ static void pulse_write(ACImpl *This)
>      This->pulse_stream->pa_held_bytes -= to_write;
>  }
>  
> -static void pulse_read(ACImpl *This)
> -{
> -    size_t bytes = pa_stream_readable_size(This->pulse_stream->stream);
> -
> -    TRACE("Readable total: %zu, fragsize: %u\n", bytes, pa_stream_get_buffer_attr(This->pulse_stream->stream)->fragsize);
> -
> -    bytes += This->pulse_stream->peek_len - This->pulse_stream->peek_ofs;
> -
> -    while (bytes >= This->pulse_stream->period_bytes) {
> -        BYTE *dst = NULL, *src;
> -        size_t src_len, copy, rem = This->pulse_stream->period_bytes;
> -
> -        if (This->pulse_stream->started) {
> -            LARGE_INTEGER stamp, freq;
> -            ACPacket *p, *next;
> -
> -            if (!(p = (ACPacket*)list_head(&This->pulse_stream->packet_free_head))) {
> -                p = (ACPacket*)list_head(&This->pulse_stream->packet_filled_head);
> -                if (!p) return;
> -                if (!p->discont) {
> -                    next = (ACPacket*)p->entry.next;
> -                    next->discont = 1;
> -                } else
> -                    p = (ACPacket*)list_tail(&This->pulse_stream->packet_filled_head);
> -            } else {
> -                This->pulse_stream->held_bytes += This->pulse_stream->period_bytes;
> -            }
> -            QueryPerformanceCounter(&stamp);
> -            QueryPerformanceFrequency(&freq);
> -            p->qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart;
> -            p->discont = 0;
> -            list_remove(&p->entry);
> -            list_add_tail(&This->pulse_stream->packet_filled_head, &p->entry);
> -
> -            dst = p->data;
> -        }
> -
> -        while (rem) {
> -            if (This->pulse_stream->peek_len) {
> -                copy = min(rem, This->pulse_stream->peek_len - This->pulse_stream->peek_ofs);
> -
> -                if (dst) {
> -                    memcpy(dst, This->pulse_stream->peek_buffer + This->pulse_stream->peek_ofs, copy);
> -                    dst += copy;
> -                }
> -
> -                rem -= copy;
> -                This->pulse_stream->peek_ofs += copy;
> -                if(This->pulse_stream->peek_len == This->pulse_stream->peek_ofs)
> -                    This->pulse_stream->peek_len = This->pulse_stream->peek_ofs = 0;
> -
> -            } else if (pa_stream_peek(This->pulse_stream->stream, (const void**)&src, &src_len) == 0 && src_len) {
> -
> -                copy = min(rem, src_len);
> -
> -                if (dst) {
> -                    if(src)
> -                        memcpy(dst, src, copy);
> -                    else
> -                        silence_buffer(This->pulse_stream->ss.format, dst, copy);
> -
> -                    dst += copy;
> -                }
> -
> -                rem -= copy;
> -
> -                if (copy < src_len) {
> -                    if (src_len > This->pulse_stream->peek_buffer_len) {
> -                        HeapFree(GetProcessHeap(), 0, This->pulse_stream->peek_buffer);
> -                        This->pulse_stream->peek_buffer = HeapAlloc(GetProcessHeap(), 0, src_len);
> -                        This->pulse_stream->peek_buffer_len = src_len;
> -                    }
> -
> -                    if(src)
> -                        memcpy(This->pulse_stream->peek_buffer, src + copy, src_len - copy);
> -                    else
> -                        silence_buffer(This->pulse_stream->ss.format, This->pulse_stream->peek_buffer, src_len - copy);
> -
> -                    This->pulse_stream->peek_len = src_len - copy;
> -                    This->pulse_stream->peek_ofs = 0;
> -                }
> -
> -                pa_stream_drop(This->pulse_stream->stream);
> -            }
> -        }
> -
> -        bytes -= This->pulse_stream->period_bytes;
> -    }
> -}
> -
>  static DWORD WINAPI pulse_timer_cb(void *user)
>  {
>      LARGE_INTEGER delay;
> @@ -595,7 +505,7 @@ static DWORD WINAPI pulse_timer_cb(void *user)
>                      This->pulse_stream->lcl_offs_bytes %= This->pulse_stream->real_bufsize_bytes;
>                      This->pulse_stream->held_bytes -= adv_bytes;
>                  }else if(This->dataflow == eCapture){
> -                    pulse_read(This);
> +                    pulse->read(This->pulse_stream);
>                  }
>              }else{
>                  This->pulse_stream->last_time = now;
> diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c
> index 260723815f6..d434f47d6dc 100644
> --- a/dlls/winepulse.drv/pulse.c
> +++ b/dlls/winepulse.drv/pulse.c
> @@ -851,6 +851,106 @@ static void WINAPI pulse_release_stream(struct pulse_stream *stream, HANDLE time
>      RtlFreeHeap(GetProcessHeap(), 0, stream);
>  }
>  
> +static void WINAPI pulse_read(struct pulse_stream *stream)
> +{
> +    size_t bytes = pa_stream_readable_size(stream->stream);
> +
> +    TRACE("Readable total: %zu, fragsize: %u\n", bytes, pa_stream_get_buffer_attr(stream->stream)->fragsize);
> +
> +    bytes += stream->peek_len - stream->peek_ofs;
> +
> +    while (bytes >= stream->period_bytes)
> +    {
> +        BYTE *dst = NULL, *src;
> +        size_t src_len, copy, rem = stream->period_bytes;
> +
> +        if (stream->started)
> +        {
> +            LARGE_INTEGER stamp, freq;
> +            ACPacket *p, *next;
> +
> +            if (!(p = (ACPacket*)list_head(&stream->packet_free_head)))
> +            {
> +                p = (ACPacket*)list_head(&stream->packet_filled_head);
> +                if (!p) return;
> +                if (!p->discont) {
> +                    next = (ACPacket*)p->entry.next;
> +                    next->discont = 1;
> +                } else
> +                    p = (ACPacket*)list_tail(&stream->packet_filled_head);
> +            }
> +            else
> +            {
> +                stream->held_bytes += stream->period_bytes;
> +            }
> +            NtQueryPerformanceCounter(&stamp, &freq);
> +            p->qpcpos = (stamp.QuadPart * (INT64)10000000) / freq.QuadPart;
> +            p->discont = 0;
> +            list_remove(&p->entry);
> +            list_add_tail(&stream->packet_filled_head, &p->entry);
> +
> +            dst = p->data;
> +        }
> +
> +        while (rem)
> +        {
> +            if (stream->peek_len)
> +            {
> +                copy = min(rem, stream->peek_len - stream->peek_ofs);
> +
> +                if (dst)
> +                {
> +                    memcpy(dst, stream->peek_buffer + stream->peek_ofs, copy);
> +                    dst += copy;
> +                }
> +
> +                rem -= copy;
> +                stream->peek_ofs += copy;
> +                if(stream->peek_len == stream->peek_ofs)
> +                    stream->peek_len = stream->peek_ofs = 0;
> +
> +            }
> +            else if (pa_stream_peek(stream->stream, (const void**)&src, &src_len) == 0 && src_len)
> +            {
> +                copy = min(rem, src_len);
> +
> +                if (dst) {
> +                    if(src)
> +                        memcpy(dst, src, copy);
> +                    else
> +                        silence_buffer(stream->ss.format, dst, copy);
> +
> +                    dst += copy;
> +                }
> +
> +                rem -= copy;
> +
> +                if (copy < src_len)
> +                {
> +                    if (src_len > stream->peek_buffer_len)
> +                    {
> +                        RtlFreeHeap(GetProcessHeap(), 0, stream->peek_buffer);
> +                        stream->peek_buffer = RtlAllocateHeap(GetProcessHeap(), 0, src_len);
> +                        stream->peek_buffer_len = src_len;
> +                    }
> +
> +                    if(src)
> +                        memcpy(stream->peek_buffer, src + copy, src_len - copy);
> +                    else
> +                        silence_buffer(stream->ss.format, stream->peek_buffer, src_len - copy);
> +
> +                    stream->peek_len = src_len - copy;
> +                    stream->peek_ofs = 0;
> +                }
> +
> +                pa_stream_drop(stream->stream);
> +            }
> +        }
> +
> +        bytes -= stream->period_bytes;
> +    }
> +}
> +
>  static const struct unix_funcs unix_funcs =
>  {
>      pulse_lock,
> @@ -860,6 +960,7 @@ static const struct unix_funcs unix_funcs =
>      pulse_main_loop,
>      pulse_create_stream,
>      pulse_release_stream,
> +    pulse_read,
>      pulse_test_connect,
>  };
>  
> diff --git a/dlls/winepulse.drv/unixlib.h b/dlls/winepulse.drv/unixlib.h
> index 51c850ac1ae..c725082e96d 100644
> --- a/dlls/winepulse.drv/unixlib.h
> +++ b/dlls/winepulse.drv/unixlib.h
> @@ -77,5 +77,6 @@ struct unix_funcs
>                                      const WAVEFORMATEX *fmt, UINT32 *channel_count,
>                                      struct pulse_stream **ret);
>      void (WINAPI *release_stream)(struct pulse_stream *stream, HANDLE timer);
> +    void (WINAPI *read)(struct pulse_stream *stream);
>      HRESULT (WINAPI *test_connect)(const char *name, struct pulse_config *config);
>  };
> 




More information about the wine-devel mailing list