From a444a6ccc5bada02d1478e94425c8fe7b76c05fc Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Sun, 28 Jul 2002 01:46:38 +0000 Subject: [PATCH] - move the state_change signal emit to a better place, before changing the parent state Original commit message from CVS: - move the state_change signal emit to a better place, before changing the parent state - also call the parent state change handler in a bin --- gst/gstbin.c | 17 +++++++++++------ gst/gstelement.c | 9 ++++++--- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/gst/gstbin.c b/gst/gstbin.c index c2eb63c..195b045 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -229,7 +229,8 @@ gst_bin_set_element_sched (GstElement *element, GstScheduler *sched) if (GST_IS_BIN (element)) { if (GST_FLAG_IS_SET (element, GST_BIN_FLAG_MANAGER)) { GST_INFO_ELEMENT (GST_CAT_PARENTAGE, element, "child is already a manager, not resetting"); - gst_scheduler_add_scheduler (sched, GST_ELEMENT_SCHED (element)); + if (GST_ELEMENT_SCHED (element)) + gst_scheduler_add_scheduler (sched, GST_ELEMENT_SCHED (element)); return; } @@ -565,9 +566,13 @@ gst_bin_change_state (GstElement * element) if (have_async) ret = GST_STATE_ASYNC; - else - ret = GST_STATE_SUCCESS; - + else { + if (parent_class->change_state) { + ret = parent_class->change_state(element); + } + else + ret = GST_STATE_SUCCESS; + } return ret; } @@ -577,9 +582,9 @@ gst_bin_change_state_norecurse (GstBin * bin) { GstElementStateReturn ret; - if (GST_ELEMENT_CLASS (parent_class)->change_state) { + if (parent_class->change_state) { GST_DEBUG_ELEMENT (GST_CAT_STATES, bin, "setting bin's own state"); - ret = GST_ELEMENT_CLASS (parent_class)->change_state (GST_ELEMENT (bin)); + ret = parent_class->change_state (GST_ELEMENT (bin)); return ret; } diff --git a/gst/gstelement.c b/gst/gstelement.c index d7ae6c4..d6cb4b0 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -2087,14 +2087,17 @@ gst_element_change_state (GstElement *element) parent = GST_ELEMENT_PARENT (element); + GST_DEBUG_ELEMENT (GST_CAT_STATES, element, "signaling state change from %s to %s", + gst_element_state_get_name (old_state), + gst_element_state_get_name (GST_STATE (element))); + g_signal_emit (G_OBJECT (element), gst_element_signals[STATE_CHANGE], + 0, old_state, GST_STATE (element)); + /* tell our parent about the state change */ if (parent && GST_IS_BIN (parent)) { gst_bin_child_state_change (GST_BIN (parent), old_state, GST_STATE (element), element); } - g_signal_emit (G_OBJECT (element), gst_element_signals[STATE_CHANGE], - 0, old_state, GST_STATE (element)); - /* signal the state change in case somebody is waiting for us */ g_mutex_lock (element->state_mutex); g_cond_signal (element->state_cond); -- 2.7.4