[pulseaudio-commits] r2292 - /branches/glitch-free/src/pulsecore/protocol-native.c

svnmailer-noreply at 0pointer.de svnmailer-noreply at 0pointer.de
Mon Apr 21 18:11:22 PDT 2008


Author: lennart
Date: Tue Apr 22 03:11:16 2008
New Revision: 2292

URL: http://0pointer.de/cgi-bin/viewcvs.cgi?rev=2292&root=pulseaudio&view=rev
Log:
make sure the client buffer has space for 2*minreq+tlength. Explain why

Modified:
    branches/glitch-free/src/pulsecore/protocol-native.c

Modified: branches/glitch-free/src/pulsecore/protocol-native.c
URL: http://0pointer.de/cgi-bin/viewcvs.cgi/branches/glitch-free/src/pulsecore/protocol-native.c?rev=2292&root=pulseaudio&r1=2291&r2=2292&view=diff
==============================================================================
--- branches/glitch-free/src/pulsecore/protocol-native.c (original)
+++ branches/glitch-free/src/pulsecore/protocol-native.c Tue Apr 22 03:11:16 2008
@@ -793,9 +793,21 @@
          * half the latency will be spent on the hw buffer, the other
          * half of it in the async buffer queue we maintain for each
          * client. In between we'll have a safety space of size
-         * minreq.*/
-
-        sink_usec = (tlength_usec-minreq_usec)/2;
+         * 2*minreq. Why the 2*minreq? When the hw buffer is completey
+         * empty and needs to be filled, then our buffer must have
+         * enough data to fulfill this request immediatly and thus
+         * have at least the same tlength as the size of the hw
+         * buffer. It additionally needs space for 2 times minreq
+         * because if the buffer ran empty and a partial fillup
+         * happens immediately on the next iteration we need to be
+         * able to fulfill it and give the application also minreq
+         * time to fill it up again for the next request Makes 2 times
+         * minreq in plus.. */
+
+        if (tlength_usec > minreq_usec*2)
+            sink_usec = (tlength_usec - minreq_usec*2)/2;
+        else
+            sink_usec = 0;
 
     } else {
 
@@ -803,7 +815,10 @@
          * still need to make sure that the parameters from the user
          * do make sense. */
 
-        sink_usec = tlength_usec - minreq_usec;
+        if (tlength_usec > minreq_usec*2)
+            sink_usec = (tlength_usec - minreq_usec*2);
+        else
+            sink_usec = 0;
     }
 
     s->sink_latency = pa_sink_input_set_requested_latency(sink_input, sink_usec);
@@ -817,19 +832,19 @@
             tlength_usec -= s->sink_latency;
     }
 
-    if (tlength_usec < s->sink_latency + minreq_usec)
-        tlength_usec = s->sink_latency + minreq_usec;
+    if (tlength_usec < s->sink_latency + 2*minreq_usec)
+        tlength_usec = s->sink_latency + 2*minreq_usec;
 
     *tlength = pa_usec_to_bytes(tlength_usec, &sink_input->sample_spec);
     *minreq = pa_usec_to_bytes(minreq_usec, &sink_input->sample_spec);
 
     if (*minreq <= 0) {
-        *minreq = frame_size;
-        *tlength += frame_size;
+        *minreq += frame_size;
+        *tlength += frame_size*2;
     }
 
     if (*tlength <= *minreq)
-        *tlength = *minreq + frame_size;
+        *tlength =  *minreq*2 + frame_size;
 
     if (*prebuf <= 0)
         *prebuf = *tlength;




More information about the pulseaudio-commits mailing list