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/5178>
This commit is contained in:
Jan Schmidt 2023-08-12 10:43:14 +10:00 committed by GStreamer Marge Bot
parent ae04702d23
commit 62f09513e5

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() */ /* Make sure the ringbuffer will start again if interrupted during event_wait() */
g_atomic_int_set (&sink->eos_rendering, 1); g_atomic_int_set (&sink->eos_rendering, 1);
clear_force_start_flag = TRUE; 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; break;
default: default:
break; break;