Commit 472b7408 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

PulseAudio: do not ignore latency updates before stream trigger

Such a latency update is an opportunity to reschedule the stream
trigger time, or to trigger immediately if late. That can reduce the
initial audio delay in some cases.
(cherry picked from commit 1b06737a297cc5b9c48dd12e2e456b45bc6891d2)
parent b9aa608b
...@@ -203,10 +203,7 @@ static void stream_start(pa_stream *s, audio_output_t *aout) ...@@ -203,10 +203,7 @@ static void stream_start(pa_stream *s, audio_output_t *aout)
aout_sys_t *sys = aout->sys; aout_sys_t *sys = aout->sys;
pa_operation *op; pa_operation *op;
if (sys->trigger != NULL) { assert (sys->trigger == NULL);
vlc_pa_rttime_free(sys->mainloop, sys->trigger);
sys->trigger = NULL;
}
op = pa_stream_cork(s, 0, NULL, NULL); op = pa_stream_cork(s, 0, NULL, NULL);
if (op != NULL) if (op != NULL)
...@@ -237,8 +234,11 @@ static void stream_trigger_cb(pa_mainloop_api *api, pa_time_event *e, ...@@ -237,8 +234,11 @@ static void stream_trigger_cb(pa_mainloop_api *api, pa_time_event *e,
audio_output_t *aout = userdata; audio_output_t *aout = userdata;
aout_sys_t *sys = aout->sys; aout_sys_t *sys = aout->sys;
msg_Dbg(aout, "starting deferred");
assert (sys->trigger == e); assert (sys->trigger == e);
msg_Dbg(aout, "starting deferred");
vlc_pa_rttime_free(sys->mainloop, sys->trigger);
sys->trigger = NULL;
stream_start(sys->stream, aout); stream_start(sys->stream, aout);
(void) api; (void) e; (void) tv; (void) api; (void) e; (void) tv;
} }
...@@ -256,18 +256,21 @@ static void stream_resync(audio_output_t *aout, pa_stream *s) ...@@ -256,18 +256,21 @@ static void stream_resync(audio_output_t *aout, pa_stream *s)
assert (sys->pts != VLC_TS_INVALID); assert (sys->pts != VLC_TS_INVALID);
if (sys->trigger != NULL) {
vlc_pa_rttime_free(sys->mainloop, sys->trigger);
sys->trigger = NULL;
}
delta = vlc_pa_get_latency(aout, sys->context, s); delta = vlc_pa_get_latency(aout, sys->context, s);
if (unlikely(delta == VLC_TS_INVALID)) if (unlikely(delta == VLC_TS_INVALID))
delta = 0; /* screwed */ delta = 0; /* screwed */
delta = (sys->pts - mdate()) - delta; delta = (sys->pts - mdate()) - delta;
if (delta > 0) { if (delta > 0) {
if (sys->trigger == NULL) { msg_Dbg(aout, "deferring start (%"PRId64" us)", delta);
msg_Dbg(aout, "deferring start (%"PRId64" us)", delta); delta += pa_rtclock_now();
delta += pa_rtclock_now(); sys->trigger = pa_context_rttime_new(sys->context, delta,
sys->trigger = pa_context_rttime_new(sys->context, delta, stream_trigger_cb, aout);
stream_trigger_cb, aout);
}
} else { } else {
msg_Warn(aout, "starting late (%"PRId64" us)", delta); msg_Warn(aout, "starting late (%"PRId64" us)", delta);
stream_start(s, aout); stream_start(s, aout);
...@@ -280,13 +283,16 @@ static void stream_latency_cb(pa_stream *s, void *userdata) ...@@ -280,13 +283,16 @@ static void stream_latency_cb(pa_stream *s, void *userdata)
aout_sys_t *sys = aout->sys; aout_sys_t *sys = aout->sys;
mtime_t delta, change; mtime_t delta, change;
if (pa_stream_is_corked(s)) if (sys->paused != VLC_TS_INVALID)
return; return; /* nothing to do while paused */
if (sys->pts == VLC_TS_INVALID) if (sys->pts == VLC_TS_INVALID) {
{
msg_Dbg(aout, "missing latency from input"); msg_Dbg(aout, "missing latency from input");
return; return;
} }
if (pa_stream_is_corked(s) > 0) {
stream_resync(aout, s);
return;
}
/* Compute lip desynchronization */ /* Compute lip desynchronization */
delta = vlc_pa_get_latency(aout, sys->context, s); delta = vlc_pa_get_latency(aout, sys->context, s);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment