audiobasesink: Don't wait on gap events

Don't call wait_event() at all for gap events, as basesink will
end up waiting for the time that the gap event would be rendered
out at the audio device. There's no need to render it at all,
just treat it as a handy point to resync the audio if needed,
let the ringbuffer render silence, and place the next buffer
into the ringbuffer where it belongs.

The only thing we really need to do is make sure the ringbuffer
and clock are running, and wait for preroll.

Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2749

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5953>
This commit is contained in:
Jan Schmidt 2023-08-12 10:43:14 +10:00 committed by Tim-Philipp Müller
parent 4950fcc6de
commit 8e923a8e2d

View file

@ -1124,6 +1124,15 @@ gst_audio_base_sink_wait_event (GstBaseSink * bsink, GstEvent * event)
/* Make sure the ringbuffer will start again if interrupted during event_wait() */
g_atomic_int_set (&sink->eos_rendering, 1);
clear_force_start_flag = TRUE;
/* For gap events, don't actually wait for the clock to
* reach that time, or it will drain the ringbuffer, just
* ensure we're prerolled and let the next actual buffer
* get rendered where it belongs */
if (GST_EVENT_TYPE (event) == GST_EVENT_GAP) {
ret = gst_base_sink_do_preroll (bsink, GST_MINI_OBJECT_CAST (event));
goto done;
}
break;
default:
break;