vlc/vlc-1.1 | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Apr 3 00:46:06 2011 +0300| [28007d8951da2aa13d28580bb49c982103d3ee6c] | committer: Rémi Denis-Courmont
PulseAudio: increase buffer size to max VLC can do This suppresses most hiccups. But it also decreases precision to slightly noticeable levels: about +/-150ms here. For reference, our audio output core target is +/-40ms. (cherry picked from commit 39b85ca6ba871a9e66c7d277e2ba4db72cadb8d8) (cherry picked from commit b26331994843bf2a1a3803eab449d10959815fa3) > http://git.videolan.org/gitweb.cgi/vlc/vlc-1.1.git/?a=commit;h=28007d8951da2aa13d28580bb49c982103d3ee6c --- modules/audio_output/pulse.c | 27 ++++++++++++++------------- 1 files changed, 14 insertions(+), 13 deletions(-) diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c index 712c7cc..3e2e0eb 100644 --- a/modules/audio_output/pulse.c +++ b/modules/audio_output/pulse.c @@ -179,23 +179,24 @@ static void Play(aout_instance_t *aout) /* This function should be called by the LibVLC core a header of time, * but not more than AOUT_MAX_PREPARE. The PulseAudio latency should be * shorter than that (though it might not be the case with some evil piece - * of audio output hardware). So we need to prepend the buffer with zeroes - * to keep audio and video in sync. */ + * of audio output hardware). So we may need to trigger playback early, + * (that is to say, short cut the PulseAudio prebuffering). Otherwise, + * audio and video may be out of synchronization. */ pa_usec_t latency; int negative; if (pa_stream_get_latency(s, &latency, &negative) < 0) { /* Especially at start of stream, latency may not be known (yet). */ if (pa_context_errno(sys->context) != PA_ERR_NODATA) error(aout, "cannot determine latency", sys->context); - latency = 0; - } - - mtime_t gap = aout_FifoFirstDate(aout, &aout->output.fifo) - mdate() + } else { + mtime_t gap = aout_FifoFirstDate(aout, &aout->output.fifo) - mdate() - latency; - if (gap > AOUT_PTS_TOLERANCE) - msg_Dbg(aout, "buffer too early (%"PRId64" us)", gap); - else if (latency != 0 && gap < -AOUT_PTS_TOLERANCE) - msg_Err(aout, "buffer too late (%"PRId64" us)", -gap); + + if (gap > AOUT_PTS_TOLERANCE) + msg_Dbg(aout, "buffer too early (%"PRId64" us)", gap); + else if (gap < -AOUT_PTS_TOLERANCE) + msg_Err(aout, "buffer too late (%"PRId64" us)", -gap); + } #endif #if 0 /* Fault injector to test underrun recovery */ static unsigned u = 0; @@ -356,9 +357,9 @@ static int Open(vlc_object_t *obj) const uint32_t byterate = pa_bytes_per_second(&ss); struct pa_buffer_attr attr; /* no point in larger buffers on PA side than VLC */ - attr.maxlength = byterate * AOUT_MAX_ADVANCE_TIME / CLOCK_FREQ; - attr.tlength = byterate * AOUT_MAX_PREPARE_TIME / CLOCK_FREQ; - attr.prebuf = byterate * AOUT_MIN_PREPARE_TIME / CLOCK_FREQ; + attr.maxlength = -1; + attr.tlength = byterate * AOUT_MAX_ADVANCE_TIME / CLOCK_FREQ; + attr.prebuf = byterate * AOUT_MAX_PREPARE_TIME / CLOCK_FREQ; attr.minreq = -1; attr.fragsize = 0; /* not used for output */ _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
