Jacek Caban : winepulse: Move pulse_read to unix lib.

Alexandre Julliard julliard at winehq.org
Mon May 17 15:45:33 CDT 2021


Module: wine
Branch: master
Commit: a5d4079c8285c10ab2019c9fd9d19a6b22babb76
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a5d4079c8285c10ab2019c9fd9d19a6b22babb76

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu May 13 16:03:19 2021 +0200

winepulse: Move pulse_read 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 |  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-cvs mailing list