baseaudiosink: recalibrate clock on setcaps
authorThijs Vermeir <thijsvermeir@gmail.com>
Fri, 19 Feb 2010 11:54:18 +0000 (12:54 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 23 May 2011 15:02:03 +0000 (17:02 +0200)
Because the spec for the ringbuffer can change when changing
the caps, we must recalibrate the clock.

https://bugzilla.gnome.org/show_bug.cgi?id=610443

gst-libs/gst/audio/gstbaseaudiosink.c

index 53267db8cf8ca31c54e68bae98db4632dfc8d350..fea7a8e273039177867f3cf67ea17096a883c2d5 100644 (file)
@@ -727,6 +727,7 @@ gst_base_audio_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
   GstBaseAudioSink *sink = GST_BASE_AUDIO_SINK (bsink);
   GstRingBufferSpec *spec;
   GstClockTime now;
+  GstClockTime crate_num, crate_denom;
 
   if (!sink->ringbuffer)
     return FALSE;
@@ -765,6 +766,13 @@ gst_base_audio_sink_setcaps (GstBaseSink * bsink, GstCaps * caps)
     gst_ring_buffer_activate (sink->ringbuffer, TRUE);
   }
 
+  /* due to possible changes in the spec file we should recalibrate the clock */
+  gst_clock_get_calibration (sink->provided_clock, NULL, NULL,
+      &crate_num, &crate_denom);
+  gst_clock_set_calibration (sink->provided_clock,
+      gst_clock_get_internal_time (sink->provided_clock), now, crate_num,
+      crate_denom);
+
   /* calculate actual latency and buffer times.
    * FIXME: In 0.11, store the latency_time internally in ns */
   spec->latency_time = gst_util_uint64_scale (spec->segsize,