_gst_print_statename (GST_STATE (element)), GST_STATE_PENDING (element),
_gst_print_statename (GST_STATE_PENDING (element)));
- if (GST_STATE_PENDING (element) == GST_STATE_READY) {
- GstObject *parent;
-
- parent = gst_object_get_parent (GST_OBJECT (element));
-
- if (!parent || !GST_IS_BIN (parent))
- gst_bin_create_plan (bin);
- }
// g_return_val_if_fail(bin->numchildren != 0, GST_STATE_FAILURE);
// g_print("-->\n");
}
// g_print("<-- \"%s\"\n",gst_object_get_name(GST_OBJECT(bin)));
+ if (GST_STATE_PENDING (element) == GST_STATE_READY) {
+ GstObject *parent;
+
+ parent = gst_object_get_parent (GST_OBJECT (element));
+
+ if (!parent || !GST_IS_BIN (parent))
+ gst_bin_create_plan (bin);
+ }
return gst_bin_change_state_norecurse (bin);
}
gst_element_set_state (GstElement *element, GstElementState state)
{
GstElementClass *oclass;
+ GstElementState curpending;
GstElementStateReturn return_val = GST_STATE_SUCCESS;
// g_print("gst_element_set_state(\"%s\",%08lx)\n",
g_return_val_if_fail (element != NULL, GST_STATE_FAILURE);
g_return_val_if_fail (GST_IS_ELEMENT (element), GST_STATE_FAILURE);
- // first we set the pending state variable
- // FIXME should probably check to see that we don't already have one
- GST_STATE_PENDING (element) = state;
+ curpending = GST_STATE(element);
+ while (GST_STATE(element) != state) {
+ if (curpending < state) curpending++;
+ else curpending--;
- // now we call the state change function so it can set the state
- oclass = GST_ELEMENT_CLASS (GTK_OBJECT (element)->klass);
- if (oclass->change_state)
- return_val = (oclass->change_state)(element);
+ // first we set the pending state variable
+ // FIXME should probably check to see that we don't already have one
+ GST_STATE_PENDING (element) = curpending;
+
+ // now we call the state change function so it can set the state
+ oclass = GST_ELEMENT_CLASS (GTK_OBJECT (element)->klass);
+ if (oclass->change_state)
+ return_val = (oclass->change_state)(element);
+
+ if (return_val == GST_STATE_FAILURE) return return_val;
+ }
return return_val;
}