Andrew Eikum : winepulse.drv: Don' t hold PA-owned buffer between capture callbacks.

Alexandre Julliard julliard at winehq.org
Fri Oct 7 15:09:14 CDT 2016


Module: wine
Branch: stable
Commit: 6b14bf5a106fb4691d310fd442038aa6e05f3fad
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6b14bf5a106fb4691d310fd442038aa6e05f3fad

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Tue Jul 26 12:51:16 2016 -0500

winepulse.drv: Don't hold PA-owned buffer between capture callbacks.

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit ee2310f7674c95b1ebc6229e3acd5b2bc408ba73)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/winepulse.drv/mmdevdrv.c | 55 +++++++++++++++++++++++++++----------------
 1 file changed, 35 insertions(+), 20 deletions(-)

diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
index 4d7e40b..ed91f71 100644
--- a/dlls/winepulse.drv/mmdevdrv.c
+++ b/dlls/winepulse.drv/mmdevdrv.c
@@ -173,8 +173,8 @@ struct ACImpl {
 
     INT32 locked;
     UINT32 bufsize_frames, bufsize_bytes, capture_period, pad, started, peek_ofs, wri_offs_bytes, lcl_offs_bytes;
-    UINT32 tmp_buffer_bytes, held_bytes;
-    BYTE *local_buffer, *tmp_buffer;
+    UINT32 tmp_buffer_bytes, held_bytes, peek_len, peek_buffer_len;
+    BYTE *local_buffer, *tmp_buffer, *peek_buffer;
     void *locked_ptr;
 
     pa_stream *stream;
@@ -760,28 +760,42 @@ static void pulse_rd_loop(ACImpl *This, size_t bytes)
 
         dst = p->data;
         while (rem) {
-            pa_stream_peek(This->stream, (const void**)&src, &src_len);
-            assert(src_len);
-            assert(This->peek_ofs < src_len);
-            src += This->peek_ofs;
-            src_len -= This->peek_ofs;
-            assert(src_len <= bytes);
+            if (This->peek_len) {
+                copy = min(rem, This->peek_len - This->peek_ofs);
 
-            copy = rem;
-            if (copy > src_len)
-                copy = src_len;
-            memcpy(dst, src, rem);
-            src += copy;
-            src_len -= copy;
-            dst += copy;
-            rem -= copy;
+                memcpy(dst, This->peek_buffer + This->peek_ofs, copy);
 
-            if (!src_len) {
-                This->peek_ofs = 0;
-                pa_stream_drop(This->stream);
-            } else
+                rem -= copy;
+                dst += copy;
                 This->peek_ofs += copy;
+                if(This->peek_len == This->peek_ofs)
+                    This->peek_len = 0;
+            } else {
+                pa_stream_peek(This->stream, (const void**)&src, &src_len);
+
+                copy = min(rem, src_len);
+
+                memcpy(dst, src, rem);
+
+                dst += copy;
+                rem -= copy;
+
+                if (copy < src_len) {
+                    if (src_len > This->peek_buffer_len) {
+                        HeapFree(GetProcessHeap(), 0, This->peek_buffer);
+                        This->peek_buffer = HeapAlloc(GetProcessHeap(), 0, src_len);
+                        This->peek_buffer_len = src_len;
+                    }
+
+                    memcpy(This->peek_buffer, src + copy, src_len - copy);
+                    This->peek_len = src_len - copy;
+                    This->peek_ofs = 0;
+                }
+
+                pa_stream_drop(This->stream);
+            }
         }
+
         bytes -= This->capture_period;
     }
 }
@@ -1032,6 +1046,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient *iface)
         IUnknown_Release(This->marshal);
         IMMDevice_Release(This->parent);
         HeapFree(GetProcessHeap(), 0, This->tmp_buffer);
+        HeapFree(GetProcessHeap(), 0, This->peek_buffer);
         HeapFree(GetProcessHeap(), 0, This->local_buffer);
         HeapFree(GetProcessHeap(), 0, This);
     }




More information about the wine-cvs mailing list