mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-09-03 10:43:55 +00:00
ringbuffer: Improve audiosink startup performance
When we start the ringbuffer, immediatly continue processing samples if the writer prepared some for us. Fixes #545807
This commit is contained in:
parent
066f9be5c9
commit
8ad8591e41
1 changed files with 19 additions and 8 deletions
|
@ -1399,6 +1399,9 @@ gst_ring_buffer_clear_all (GstRingBuffer * buf)
|
||||||
static gboolean
|
static gboolean
|
||||||
wait_segment (GstRingBuffer * buf)
|
wait_segment (GstRingBuffer * buf)
|
||||||
{
|
{
|
||||||
|
gint segments;
|
||||||
|
gboolean wait = TRUE;
|
||||||
|
|
||||||
/* buffer must be started now or we deadlock since nobody is reading */
|
/* buffer must be started now or we deadlock since nobody is reading */
|
||||||
if (G_UNLIKELY (g_atomic_int_get (&buf->state) !=
|
if (G_UNLIKELY (g_atomic_int_get (&buf->state) !=
|
||||||
GST_RING_BUFFER_STATE_STARTED)) {
|
GST_RING_BUFFER_STATE_STARTED)) {
|
||||||
|
@ -1407,7 +1410,13 @@ wait_segment (GstRingBuffer * buf)
|
||||||
goto no_start;
|
goto no_start;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (buf, "start!");
|
GST_DEBUG_OBJECT (buf, "start!");
|
||||||
|
segments = g_atomic_int_get (&buf->segdone);
|
||||||
gst_ring_buffer_start (buf);
|
gst_ring_buffer_start (buf);
|
||||||
|
|
||||||
|
/* After starting, the writer may have wrote segments already and then we
|
||||||
|
* don't need to wait anymore */
|
||||||
|
if (G_LIKELY (g_atomic_int_get (&buf->segdone) != segments))
|
||||||
|
wait = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* take lock first, then update our waiting flag */
|
/* take lock first, then update our waiting flag */
|
||||||
|
@ -1419,16 +1428,18 @@ wait_segment (GstRingBuffer * buf)
|
||||||
GST_RING_BUFFER_STATE_STARTED))
|
GST_RING_BUFFER_STATE_STARTED))
|
||||||
goto not_started;
|
goto not_started;
|
||||||
|
|
||||||
if (g_atomic_int_compare_and_exchange (&buf->waiting, 0, 1)) {
|
if (G_LIKELY (wait)) {
|
||||||
GST_DEBUG_OBJECT (buf, "waiting..");
|
if (g_atomic_int_compare_and_exchange (&buf->waiting, 0, 1)) {
|
||||||
GST_RING_BUFFER_WAIT (buf);
|
GST_DEBUG_OBJECT (buf, "waiting..");
|
||||||
|
GST_RING_BUFFER_WAIT (buf);
|
||||||
|
|
||||||
if (G_UNLIKELY (buf->abidata.ABI.flushing))
|
if (G_UNLIKELY (buf->abidata.ABI.flushing))
|
||||||
goto flushing;
|
goto flushing;
|
||||||
|
|
||||||
if (G_UNLIKELY (g_atomic_int_get (&buf->state) !=
|
if (G_UNLIKELY (g_atomic_int_get (&buf->state) !=
|
||||||
GST_RING_BUFFER_STATE_STARTED))
|
GST_RING_BUFFER_STATE_STARTED))
|
||||||
goto not_started;
|
goto not_started;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
GST_OBJECT_UNLOCK (buf);
|
GST_OBJECT_UNLOCK (buf);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue