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
const gchar *file, const gchar *function, gint line)
{
GError *error = NULL;
+ GstElement *e = NULL;
gchar *name;
gchar *sent_message;
gchar *sent_debug;
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);
#include "../gstconfig.h"
#include "../gstparse.h"
#include "../gstinfo.h"
+#include "../gsterror.h"
#include "../gsturi.h"
#include "types.h"
}
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;
}