audiobasesink: clip start samples to match clipped start time

Clock slaving can clip start time to zero, giving us a shorted
duration than we originally got. To keep in sync, we must then
discard the samples falling before that zero timestamp.

This possibly fixes random distortion caused by constant PA
underflows which are never resynced.
This commit is contained in:
Vincent Penquerc'h 2014-02-24 11:17:05 -05:00
parent 675d0400e1
commit 169166d0a2

View file

@ -1853,6 +1853,23 @@ gst_audio_base_sink_render (GstBaseSink * bsink, GstBuffer * buf)
render_start = gst_util_uint64_scale_int (render_start, rate, GST_SECOND);
render_stop = gst_util_uint64_scale_int (render_stop, rate, GST_SECOND);
/* If the slaving got us an interval spanning 0, render_start will
have been set to 0. So if render_start is 0, we check whether
render_stop is set to contain all samples. If not, we need to
drop samples to match. */
if (render_start == 0) {
guint nsamples = render_stop - render_start;
if (nsamples < samples) {
guint diff;
diff = samples - nsamples;
GST_DEBUG_OBJECT (bsink, "Clipped start: %u/%u samples", nsamples,
samples);
samples -= diff;
offset += diff * bpf;
}
}
/* positive playback rate, first sample is render_start, negative rate, first
* sample is render_stop. When no rate conversion is active, render exactly
* the amount of input samples to avoid aligning to rounding errors. */