[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