Clean up state change

Original commit message from CVS:
Clean up state change
This commit is contained in:
Wim Taymans 2003-01-15 21:01:58 +00:00
parent 95abdf3bce
commit a722e87b12
2 changed files with 94 additions and 38 deletions

View file

@ -581,11 +581,11 @@ gst_queue_handle_src_event (GstPad *pad, GstEvent *event)
if (gst_element_get_state (GST_ELEMENT (queue)) == GST_STATE_PLAYING) { if (gst_element_get_state (GST_ELEMENT (queue)) == GST_STATE_PLAYING) {
/* push the event to the queue for upstream consumption */ /* push the event to the queue for upstream consumption */
g_async_queue_push(queue->events, event); g_async_queue_push(queue->events, event);
g_mutex_unlock (queue->qlock);
g_warning ("FIXME: sending event in a running queue"); g_warning ("FIXME: sending event in a running queue");
/* FIXME wait for delivery of the event here, then return the result /* FIXME wait for delivery of the event here, then return the result
* instead of FALSE */ * instead of FALSE */
return FALSE; res = FALSE;
goto done;
} }
event_type = GST_EVENT_TYPE (event); event_type = GST_EVENT_TYPE (event);
@ -606,10 +606,12 @@ gst_queue_handle_src_event (GstPad *pad, GstEvent *event)
default: default:
break; break;
} }
done:
g_mutex_unlock (queue->qlock); g_mutex_unlock (queue->qlock);
/* we have to claim success, but we don't really know */ /* we have to claim success, but we don't really know */
return TRUE; return res;
} }
static gboolean static gboolean
@ -633,8 +635,6 @@ gst_queue_change_state (GstElement *element)
{ {
GstQueue *queue; GstQueue *queue;
GstElementStateReturn ret; GstElementStateReturn ret;
GstElementState new_state;
g_return_val_if_fail (GST_IS_QUEUE (element), GST_STATE_FAILURE);
queue = GST_QUEUE (element); queue = GST_QUEUE (element);
@ -645,25 +645,53 @@ gst_queue_change_state (GstElement *element)
*/ */
g_mutex_lock (queue->qlock); g_mutex_lock (queue->qlock);
new_state = GST_STATE_PENDING (element); switch (GST_STATE_TRANSITION (element)) {
case GST_STATE_NULL_TO_READY:
gst_queue_locked_flush (queue);
break;
case GST_STATE_READY_TO_PAUSED:
break;
case GST_STATE_PAUSED_TO_PLAYING:
if (!GST_PAD_IS_LINKED (queue->sinkpad)) {
GST_DEBUG_ELEMENT (GST_CAT_STATES, queue, "queue %s is not linked", GST_ELEMENT_NAME (queue));
/* FIXME can this be? */
if (queue->reader)
g_cond_signal (queue->not_empty);
if (new_state == GST_STATE_READY) { ret = GST_STATE_FAILURE;
gst_queue_locked_flush (queue); goto error;
} }
else if (new_state == GST_STATE_PLAYING) { else {
if (!GST_PAD_IS_LINKED (queue->sinkpad)) { GstScheduler *src_sched, *sink_sched;
GST_DEBUG_ELEMENT (GST_CAT_STATES, queue, "queue %s is not linked", GST_ELEMENT_NAME (queue));
/* FIXME can this be? */ src_sched = gst_pad_get_scheduler (GST_PAD_CAST (queue->srcpad));
if (queue->reader) sink_sched = gst_pad_get_scheduler (GST_PAD_CAST (queue->sinkpad));
g_cond_signal (queue->not_empty);
g_mutex_unlock (queue->qlock);
return GST_STATE_FAILURE; if (src_sched == sink_sched) {
} GST_DEBUG_ELEMENT (GST_CAT_STATES, queue, "queue %s does not connect different schedulers",
queue->interrupt = FALSE; GST_ELEMENT_NAME (queue));
g_warning ("queue %s does connect different schedulers",
GST_ELEMENT_NAME (queue));
ret = GST_STATE_FAILURE;
goto error;
}
}
queue->interrupt = FALSE;
break;
case GST_STATE_PLAYING_TO_PAUSED:
break;
case GST_STATE_PAUSED_TO_READY:
gst_queue_locked_flush (queue);
break;
case GST_STATE_READY_TO_NULL:
break;
} }
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element);
error:
g_mutex_unlock (queue->qlock); g_mutex_unlock (queue->qlock);
GST_DEBUG_LEAVE("('%s')", GST_ELEMENT_NAME (element)); GST_DEBUG_LEAVE("('%s')", GST_ELEMENT_NAME (element));

View file

@ -581,11 +581,11 @@ gst_queue_handle_src_event (GstPad *pad, GstEvent *event)
if (gst_element_get_state (GST_ELEMENT (queue)) == GST_STATE_PLAYING) { if (gst_element_get_state (GST_ELEMENT (queue)) == GST_STATE_PLAYING) {
/* push the event to the queue for upstream consumption */ /* push the event to the queue for upstream consumption */
g_async_queue_push(queue->events, event); g_async_queue_push(queue->events, event);
g_mutex_unlock (queue->qlock);
g_warning ("FIXME: sending event in a running queue"); g_warning ("FIXME: sending event in a running queue");
/* FIXME wait for delivery of the event here, then return the result /* FIXME wait for delivery of the event here, then return the result
* instead of FALSE */ * instead of FALSE */
return FALSE; res = FALSE;
goto done;
} }
event_type = GST_EVENT_TYPE (event); event_type = GST_EVENT_TYPE (event);
@ -606,10 +606,12 @@ gst_queue_handle_src_event (GstPad *pad, GstEvent *event)
default: default:
break; break;
} }
done:
g_mutex_unlock (queue->qlock); g_mutex_unlock (queue->qlock);
/* we have to claim success, but we don't really know */ /* we have to claim success, but we don't really know */
return TRUE; return res;
} }
static gboolean static gboolean
@ -633,8 +635,6 @@ gst_queue_change_state (GstElement *element)
{ {
GstQueue *queue; GstQueue *queue;
GstElementStateReturn ret; GstElementStateReturn ret;
GstElementState new_state;
g_return_val_if_fail (GST_IS_QUEUE (element), GST_STATE_FAILURE);
queue = GST_QUEUE (element); queue = GST_QUEUE (element);
@ -645,25 +645,53 @@ gst_queue_change_state (GstElement *element)
*/ */
g_mutex_lock (queue->qlock); g_mutex_lock (queue->qlock);
new_state = GST_STATE_PENDING (element); switch (GST_STATE_TRANSITION (element)) {
case GST_STATE_NULL_TO_READY:
gst_queue_locked_flush (queue);
break;
case GST_STATE_READY_TO_PAUSED:
break;
case GST_STATE_PAUSED_TO_PLAYING:
if (!GST_PAD_IS_LINKED (queue->sinkpad)) {
GST_DEBUG_ELEMENT (GST_CAT_STATES, queue, "queue %s is not linked", GST_ELEMENT_NAME (queue));
/* FIXME can this be? */
if (queue->reader)
g_cond_signal (queue->not_empty);
if (new_state == GST_STATE_READY) { ret = GST_STATE_FAILURE;
gst_queue_locked_flush (queue); goto error;
} }
else if (new_state == GST_STATE_PLAYING) { else {
if (!GST_PAD_IS_LINKED (queue->sinkpad)) { GstScheduler *src_sched, *sink_sched;
GST_DEBUG_ELEMENT (GST_CAT_STATES, queue, "queue %s is not linked", GST_ELEMENT_NAME (queue));
/* FIXME can this be? */ src_sched = gst_pad_get_scheduler (GST_PAD_CAST (queue->srcpad));
if (queue->reader) sink_sched = gst_pad_get_scheduler (GST_PAD_CAST (queue->sinkpad));
g_cond_signal (queue->not_empty);
g_mutex_unlock (queue->qlock);
return GST_STATE_FAILURE; if (src_sched == sink_sched) {
} GST_DEBUG_ELEMENT (GST_CAT_STATES, queue, "queue %s does not connect different schedulers",
queue->interrupt = FALSE; GST_ELEMENT_NAME (queue));
g_warning ("queue %s does connect different schedulers",
GST_ELEMENT_NAME (queue));
ret = GST_STATE_FAILURE;
goto error;
}
}
queue->interrupt = FALSE;
break;
case GST_STATE_PLAYING_TO_PAUSED:
break;
case GST_STATE_PAUSED_TO_READY:
gst_queue_locked_flush (queue);
break;
case GST_STATE_READY_TO_NULL:
break;
} }
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element);
error:
g_mutex_unlock (queue->qlock); g_mutex_unlock (queue->qlock);
GST_DEBUG_LEAVE("('%s')", GST_ELEMENT_NAME (element)); GST_DEBUG_LEAVE("('%s')", GST_ELEMENT_NAME (element));