diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | ext/gconf/gstswitchsink.c | 16 |
2 files changed, 16 insertions, 8 deletions
@@ -1,3 +1,11 @@ +2007-03-05 Jan Schmidt <thaytan@mad.scientist.com> + + * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset), + (gst_switch_commit_new_kid), (gst_switch_sink_set_child): + Install fakesink in NULL by fixing some broken logic. This obviates + the need to manually set _IS_SINK. + Add some comments and remove a little cruft while I'm at it. + 2007-03-05 Wim Taymans <wim@fluendo.com> * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset): diff --git a/ext/gconf/gstswitchsink.c b/ext/gconf/gstswitchsink.c index 0d5003aa..b5105acc 100644 --- a/ext/gconf/gstswitchsink.c +++ b/ext/gconf/gstswitchsink.c @@ -79,11 +79,12 @@ gst_switch_sink_class_init (GstSwitchSinkClass * klass) static void gst_switch_sink_reset (GstSwitchSink * sink) { - /* this will install fakesink if no other child has been set */ + /* this will install fakesink if no other child has been set, + * otherwise we rely on the subclass to know when to unset its + * custom kid */ if (sink->kid == NULL) { gst_switch_sink_set_child (sink, NULL); } - GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_IS_SINK); } static void @@ -143,6 +144,8 @@ gst_switch_commit_new_kid (GstSwitchSink * sink) GST_OBJECT_LOCK (sink); old_kid = sink->kid; sink->kid = new_kid; + /* Mark whether a custom kid or fakesink has been installed */ + sink->have_kid = !is_fakesink; GST_OBJECT_UNLOCK (sink); /* kill old element */ @@ -176,10 +179,11 @@ gst_switch_sink_set_child (GstSwitchSink * sink, GstElement * new_kid) GstState cur, next; GstElement **p_kid; - /* Nothing to do if clearing the child and we don't have one anyway */ - if (new_kid == NULL && sink->have_kid == FALSE) + /* Nothing to do if clearing the child and we've already installed fakesink */ + if (new_kid == NULL && sink->kid != NULL && sink->have_kid == FALSE) return TRUE; + /* Store the new kid to be committed later */ GST_OBJECT_LOCK (sink); cur = GST_STATE (sink); next = GST_STATE_NEXT (sink); @@ -187,10 +191,6 @@ gst_switch_sink_set_child (GstSwitchSink * sink, GstElement * new_kid) gst_object_replace ((GstObject **) p_kid, (GstObject *) new_kid); GST_OBJECT_UNLOCK (sink); - if (cur == GST_STATE_PAUSED && next == GST_STATE_READY) { - return gst_switch_commit_new_kid (sink); - } - /* Sometime, it would be lovely to allow sink changes even when * already running, but this involves sending an appropriate new-segment * and possibly prerolling etc */ |