gst/gstelement.c: make elements try to recursively change state to PAUSED on all...
authorThomas Vander Stichele <thomas@apestaart.org>
Fri, 5 Mar 2004 13:07:48 +0000 (13:07 +0000)
committerThomas Vander Stichele <thomas@apestaart.org>
Fri, 5 Mar 2004 13:07:48 +0000 (13:07 +0000)
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
gst/gstelement.c
gst/parse/grammar.y

index 57ef13d..a2880cf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2004-03-05  Thomas Vander Stichele  <thomas at apestaart dot org>
 
+       * 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  <thomas at apestaart dot org>
+
        * configure.ac: use ${libdir} for PLUGINS_DIR since on 64bit
           it contains lib64; use AS_AC_EXPAND to handle it properly
 
index 7b076c4..09a4255 100644 (file)
@@ -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;
-
-    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));
+  /* recursively leave PLAYING state */
+  e = element;
+  while (e)
+  {
+    if (GST_STATE (e) == GST_STATE_PLAYING) {
+      GstElementStateReturn ret;
+
+      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);
index f4cf717..5adb2ab 100644 (file)
@@ -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;
   }