From 674e6a9a02eb2f700b37301023183be855ab55fc Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Fri, 5 Mar 2004 13:07:48 +0000 Subject: [PATCH] gst/gstelement.c: make elements try to recursively change state to PAUSED on all parents after an error to suppress e... Original commit message from CVS: * gst/gstelement.c: (gst_element_error_full): make elements try to recursively change state to PAUSED on all parents after an error to suppress ensuing warnings * gst/parse/grammar.y: make it check if it was able to sync the state, and throw an error if not, so stuff like oggdemux ! vorbisdec ! osssink gets caught --- ChangeLog | 10 ++++++++++ gst/gstelement.c | 21 +++++++++++++++------ gst/parse/grammar.y | 11 ++++++++++- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 57ef13dec2..a2880cf248 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2004-03-05 Thomas Vander Stichele + + * gst/gstelement.c: (gst_element_error_full): + make elements try to recursively change state to PAUSED on all + parents after an error to suppress ensuing warnings + * gst/parse/grammar.y: + make it check if it was able to sync the state, and throw an error + if not, so stuff like + oggdemux ! vorbisdec ! osssink gets caught + 2004-03-05 Thomas Vander Stichele * configure.ac: use ${libdir} for PLUGINS_DIR since on 64bit diff --git a/gst/gstelement.c b/gst/gstelement.c index 7b076c4346..09a4255f75 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -2412,6 +2412,7 @@ gst_element_error_full const gchar *file, const gchar *function, gint line) { GError *error = NULL; + GstElement *e = NULL; gchar *name; gchar *sent_message; gchar *sent_debug; @@ -2475,14 +2476,22 @@ gst_element_error_full gst_scheduler_error (element->sched, element); } - if (GST_STATE (element) == GST_STATE_PLAYING) { - GstElementStateReturn ret; + /* recursively leave PLAYING state */ + e = element; + while (e) + { + if (GST_STATE (e) == GST_STATE_PLAYING) { + GstElementStateReturn ret; - ret = gst_element_set_state (element, GST_STATE_PAUSED); - if (ret != GST_STATE_SUCCESS) { - g_warning ("could not PAUSE element \"%s\" after error, help!", - GST_ELEMENT_NAME (element)); + ret = gst_element_set_state (e, GST_STATE_PAUSED); + /* only check if this worked for current element, not parents, since + this is likely to fail anyway */ + if (ret != GST_STATE_SUCCESS && e == element) { + g_warning ("could not PAUSE element \"%s\" after error, help!", + GST_ELEMENT_NAME (e)); + } } + e = GST_ELEMENT (GST_ELEMENT_PARENT (e)); } GST_FLAG_UNSET (element, GST_ELEMENT_IN_ERROR); diff --git a/gst/parse/grammar.y b/gst/parse/grammar.y index f4cf717a4b..5adb2ab1aa 100644 --- a/gst/parse/grammar.y +++ b/gst/parse/grammar.y @@ -11,6 +11,7 @@ #include "../gstconfig.h" #include "../gstparse.h" #include "../gstinfo.h" +#include "../gsterror.h" #include "../gsturi.h" #include "types.h" @@ -370,9 +371,17 @@ gst_parse_element_lock (GstElement *element, gboolean lock) } if (!(lock && unlocked_peer)) { + GST_CAT_DEBUG (GST_CAT_PIPELINE, "setting locked state on element"); gst_element_set_locked_state (element, lock); if (!lock) - gst_element_sync_state_with_parent (element); + { + /* try to sync state with parent */ + GST_CAT_DEBUG (GST_CAT_PIPELINE, "trying to sync state of element with parent"); + /* FIXME: it would be nice if we can figure out why it failed + (e.g. caps nego) and give an error about that instead. */ + if (!gst_element_sync_state_with_parent (element)) + GST_ELEMENT_ERROR (element, CORE, STATE_CHANGE, (NULL), (NULL)); + } } else { return; }