[gst-cvs] gst-plugins-base: baseaudiosink: Allocate and free the clock in NULL-> READY and reverse
Sebastian Dröge
slomo at kemper.freedesktop.org
Thu Jun 3 01:23:26 PDT 2010
Module: gst-plugins-base
Branch: master
Commit: cea2644ed86097aadedc9e8731e78a22ffc6246b
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/?id=cea2644ed86097aadedc9e8731e78a22ffc6246b
Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date: Wed Jun 2 12:19:00 2010 +0200
baseaudiosink: Allocate and free the clock in NULL->READY and reverse
---
gst-libs/gst/audio/gstbaseaudiosink.c | 28 ++++++++++++++++++----------
1 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/gst-libs/gst/audio/gstbaseaudiosink.c b/gst-libs/gst/audio/gstbaseaudiosink.c
index 4e685ae..5c82d71 100644
--- a/gst-libs/gst/audio/gstbaseaudiosink.c
+++ b/gst-libs/gst/audio/gstbaseaudiosink.c
@@ -272,9 +272,6 @@ gst_base_audio_sink_init (GstBaseAudioSink * baseaudiosink,
baseaudiosink->provide_clock = DEFAULT_PROVIDE_CLOCK;
baseaudiosink->priv->slave_method = DEFAULT_SLAVE_METHOD;
- baseaudiosink->provided_clock = gst_audio_clock_new ("GstAudioSinkClock",
- (GstAudioClockGetTimeFunc) gst_base_audio_sink_get_time, baseaudiosink);
-
GST_BASE_SINK (baseaudiosink)->can_activate_push = TRUE;
GST_BASE_SINK (baseaudiosink)->can_activate_pull = DEFAULT_CAN_ACTIVATE_PULL;
baseaudiosink->priv->drift_tolerance = DEFAULT_DRIFT_TOLERANCE;
@@ -310,10 +307,6 @@ gst_base_audio_sink_dispose (GObject * object)
sink = GST_BASE_AUDIO_SINK (object);
- if (sink->provided_clock)
- gst_object_unref (sink->provided_clock);
- sink->provided_clock = NULL;
-
if (sink->ringbuffer) {
gst_object_unparent (GST_OBJECT_CAST (sink->ringbuffer));
sink->ringbuffer = NULL;
@@ -1820,10 +1813,8 @@ gst_base_audio_sink_change_state (GstElement * element,
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
- if (sink->ringbuffer == NULL) {
- gst_audio_clock_reset (GST_AUDIO_CLOCK (sink->provided_clock), 0);
+ if (sink->ringbuffer == NULL)
sink->ringbuffer = gst_base_audio_sink_create_ringbuffer (sink);
- }
if (!gst_ring_buffer_open_device (sink->ringbuffer))
goto open_failed;
break;
@@ -1870,6 +1861,15 @@ gst_base_audio_sink_change_state (GstElement * element,
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ /* If the subclass doesn't provide a clock... */
+ if (!sink->provided_clock)
+ sink->provided_clock = gst_audio_clock_new ("GstAudioSinkClock",
+ (GstAudioClockGetTimeFunc) gst_base_audio_sink_get_time, sink);
+ gst_audio_clock_reset (GST_AUDIO_CLOCK (sink->provided_clock), 0);
+ gst_element_post_message (element,
+ gst_message_new_clock_provide (GST_OBJECT_CAST (element),
+ sink->provided_clock, TRUE));
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
/* stop slaving ourselves to the master, if any */
gst_clock_set_master (sink->provided_clock, NULL);
@@ -1886,9 +1886,17 @@ gst_base_audio_sink_change_state (GstElement * element,
gst_ring_buffer_activate (sink->ringbuffer, FALSE);
gst_ring_buffer_release (sink->ringbuffer);
gst_ring_buffer_close_device (sink->ringbuffer);
+
+ gst_element_post_message (element,
+ gst_message_new_clock_provide (GST_OBJECT_CAST (element),
+ NULL, FALSE));
+
GST_OBJECT_LOCK (sink);
gst_object_unparent (GST_OBJECT_CAST (sink->ringbuffer));
sink->ringbuffer = NULL;
+ if (sink->provided_clock)
+ gst_object_unref (sink->provided_clock);
+ sink->provided_clock = NULL;
GST_OBJECT_UNLOCK (sink);
break;
default:
More information about the Gstreamer-commits
mailing list