baseaudiosink: start ringbuffer upon going to PLAYING and already EOS

... otherwise we may end up without running clock in PLAYING.

Fixes #636886.
This commit is contained in:
Mark Nauwelaerts 2011-03-03 19:14:38 +01:00
parent cf9aaffcb9
commit ba2e500bd9

View file

@ -56,7 +56,6 @@ struct _GstBaseAudioSinkPrivate
gboolean sync_latency; gboolean sync_latency;
GstClockTime eos_time; GstClockTime eos_time;
gint eos_rendering;
gboolean do_time_offset; gboolean do_time_offset;
/* number of microseconds we alow timestamps or clock slaving to drift /* number of microseconds we alow timestamps or clock slaving to drift
@ -837,10 +836,6 @@ gst_base_audio_sink_drain (GstBaseAudioSink * sink)
if (!sink->ringbuffer->spec.rate) if (!sink->ringbuffer->spec.rate)
return TRUE; return TRUE;
/* if PLAYING is interrupted,
* arrange to have clock running when going to PLAYING again */
g_atomic_int_set (&sink->priv->eos_rendering, 1);
/* need to start playback before we can drain, but only when /* need to start playback before we can drain, but only when
* we have successfully negotiated a format and thus acquired the * we have successfully negotiated a format and thus acquired the
* ringbuffer. */ * ringbuffer. */
@ -858,7 +853,6 @@ gst_base_audio_sink_drain (GstBaseAudioSink * sink)
GST_DEBUG_OBJECT (sink, "drained audio"); GST_DEBUG_OBJECT (sink, "drained audio");
} }
g_atomic_int_set (&sink->priv->eos_rendering, 0);
return TRUE; return TRUE;
} }
@ -1888,7 +1882,6 @@ gst_base_audio_sink_change_state (GstElement * element,
sink->next_sample = -1; sink->next_sample = -1;
sink->priv->last_align = -1; sink->priv->last_align = -1;
sink->priv->eos_time = -1; sink->priv->eos_time = -1;
sink->priv->eos_rendering = 0;
gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE); gst_ring_buffer_set_flushing (sink->ringbuffer, FALSE);
gst_ring_buffer_may_start (sink->ringbuffer, FALSE); gst_ring_buffer_may_start (sink->ringbuffer, FALSE);
@ -1903,19 +1896,24 @@ gst_base_audio_sink_change_state (GstElement * element,
sink->provided_clock, TRUE)); sink->provided_clock, TRUE));
break; break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING: case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
{
gboolean eos;
GST_OBJECT_LOCK (sink); GST_OBJECT_LOCK (sink);
GST_DEBUG_OBJECT (sink, "ringbuffer may start now"); GST_DEBUG_OBJECT (sink, "ringbuffer may start now");
sink->priv->sync_latency = TRUE; sink->priv->sync_latency = TRUE;
eos = GST_BASE_SINK (sink)->eos;
GST_OBJECT_UNLOCK (sink); GST_OBJECT_UNLOCK (sink);
gst_ring_buffer_may_start (sink->ringbuffer, TRUE); gst_ring_buffer_may_start (sink->ringbuffer, TRUE);
if (GST_BASE_SINK_CAST (sink)->pad_mode == GST_ACTIVATE_PULL || if (GST_BASE_SINK_CAST (sink)->pad_mode == GST_ACTIVATE_PULL || eos) {
g_atomic_int_get (&sink->priv->eos_rendering)) {
/* we always start the ringbuffer in pull mode immediatly */ /* we always start the ringbuffer in pull mode immediatly */
/* sync rendering on eos needs running clock */ /* sync rendering on eos needs running clock,
* and others need running clock when finished rendering eos */
gst_ring_buffer_start (sink->ringbuffer); gst_ring_buffer_start (sink->ringbuffer);
} }
break; break;
}
case GST_STATE_CHANGE_PLAYING_TO_PAUSED: case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
/* ringbuffer cannot start anymore */ /* ringbuffer cannot start anymore */
gst_ring_buffer_may_start (sink->ringbuffer, FALSE); gst_ring_buffer_may_start (sink->ringbuffer, FALSE);