g_thread_pool_push (pool, gst_object_ref (bin), NULL);
}
+struct _GstAsyncThreadData
+{
+ GstElement *element;
+ GstState state;
+};
+
static void
-set_state_async_thread_func (GstElement * element, gpointer statep)
+set_state_async_thread_func (struct _GstAsyncThreadData *data, gpointer unused)
{
- GstState state = GPOINTER_TO_INT (statep);
GstState current, pending;
GstStateChangeReturn ret = GST_STATE_CHANGE_ASYNC;
- GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, data->element,
"new thread ensuring state change to %s",
- gst_element_state_get_name (state));
+ gst_element_state_get_name (data->state));
while (TRUE) {
/* wait indefinitely */
- ret = gst_element_get_state (element, ¤t, &pending, NULL);
- GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ ret = gst_element_get_state (data->element, ¤t, &pending, NULL);
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, data->element,
"get_state returned %d, current %s, pending %s", ret,
gst_element_state_get_name (current),
gst_element_state_get_name (pending));
/* can only be SUCCESS or FAILURE */
if (ret == GST_STATE_CHANGE_FAILURE) {
/* we can only break, hopefully an error message was posted as well */
- GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, data->element,
"FAILURE during state change");
break;
} else if (ret == GST_STATE_CHANGE_SUCCESS) {
- if (current == state) {
- GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ if (current == data->state) {
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, data->element,
"successfully reached final state");
break;
}
- GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
- "setting target state %s again", gst_element_state_get_name (state));
- gst_element_set_state (element, state);
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, data->element,
+ "setting target state %s again",
+ gst_element_state_get_name (data->state));
+ gst_element_set_state (data->element, data->state);
} else {
g_assert_not_reached ();
}
}
- GST_CAT_INFO_OBJECT (GST_CAT_STATES, element,
+ GST_CAT_INFO_OBJECT (GST_CAT_STATES, data->element,
"thread done waiting on state change");
- gst_object_unref (element);
+ gst_object_unref (data->element);
+ g_free (data);
}
/**
gst_element_set_state_async (GstElement * element, GstState state)
{
GstStateChangeReturn ret;
+ struct _GstAsyncThreadData *data;
ret = gst_element_set_state (element, state);
if (ret == GST_STATE_CHANGE_ASYNC) {
g_static_mutex_lock (&mutex);
if (pool == NULL)
pool = g_thread_pool_new ((GFunc) set_state_async_thread_func,
- GINT_TO_POINTER (state), -1, FALSE, NULL);
+ NULL, -1, FALSE, NULL);
g_static_mutex_unlock (&mutex);
- g_thread_pool_push (pool, gst_object_ref (element), NULL);
+ data = g_new0 (struct _GstAsyncThreadData, 1);
+
+ gst_object_ref (element);
+ data->element = element;
+ data->state = state;
+ g_thread_pool_push (pool, data, NULL);
}
return ret;