[vlc-devel] [RFC PATCH 8/9] pulse: request timing asynchronously
Thomas Guillem
thomas at gllm.fr
Thu Dec 10 18:10:14 CET 2020
---
modules/audio_output/pulse.c | 40 +++++++++++++++---------------------
1 file changed, 16 insertions(+), 24 deletions(-)
diff --git a/modules/audio_output/pulse.c b/modules/audio_output/pulse.c
index 709f085c6f..49de51b5ed 100644
--- a/modules/audio_output/pulse.c
+++ b/modules/audio_output/pulse.c
@@ -69,6 +69,7 @@ typedef struct
pa_time_event *trigger; /**< Deferred stream trigger */
pa_cvolume cvolume; /**< actual sink input volume */
vlc_tick_t last_date; /**< Play system timestamp of last buffer */
+ vlc_tick_t last_pts; /**< PTS or last buffer */
pa_volume_t volume_force; /**< Forced volume (stream must be NULL) */
pa_stream_flags_t flags_force; /**< Forced flags (stream must be NULL) */
@@ -261,6 +262,16 @@ static void stream_latency_cb(pa_stream *s, void *userdata)
return; /* nothing to do if buffers are (still) empty */
if (pa_stream_is_corked(s) > 0)
stream_start(s, aout, sys->last_date);
+
+ if (sys->last_pts == VLC_TICK_INVALID)
+ return;
+
+ vlc_tick_t latency = vlc_pa_get_latency(aout, sys->context, s);
+ if (latency != VLC_TICK_INVALID)
+ {
+ vlc_tick_t now = vlc_tick_now();
+ aout_TimingReport(aout, now + latency, sys->last_pts);
+ }
}
@@ -334,6 +345,7 @@ static void stream_overflow_cb(pa_stream *s, void *userdata)
return;
pa_operation_unref(op);
sys->last_date = VLC_TICK_INVALID;
+ sys->last_pts = VLC_TICK_INVALID;
}
static void stream_started_cb(pa_stream *s, void *userdata)
@@ -438,29 +450,6 @@ static void context_cb(pa_context *ctx, pa_subscription_event_type_t type,
}
}
-
-/*** VLC audio output callbacks ***/
-
-static int TimeGet(audio_output_t *aout, vlc_tick_t *restrict delay)
-{
- aout_sys_t *sys = aout->sys;
- pa_stream *s = sys->stream;
- int ret = -1;
-
- pa_threaded_mainloop_lock(sys->mainloop);
- if (pa_stream_is_corked(s) <= 0)
- { /* latency is relevant only if not corked */
- vlc_tick_t delta = vlc_pa_get_latency(aout, sys->context, s);
- if (delta != VLC_TICK_INVALID)
- {
- *delay = delta;
- ret = 0;
- }
- }
- pa_threaded_mainloop_unlock(sys->mainloop);
- return ret;
-}
-
/**
* Queue one audio frame to the playback stream
*/
@@ -505,6 +494,7 @@ static void Play(audio_output_t *aout, block_t *block, vlc_tick_t date)
vlc_pa_error(aout, "cannot write", sys->context);
}
+ sys->last_pts = block->i_pts;
block_Release(block);
pa_threaded_mainloop_unlock(sys->mainloop);
@@ -547,6 +537,7 @@ static void Flush(audio_output_t *aout)
if (op != NULL)
pa_operation_unref(op);
sys->last_date = VLC_TICK_INVALID;
+ sys->last_pts = VLC_TICK_INVALID;
stream_stop(s, aout);
pa_threaded_mainloop_unlock(sys->mainloop);
@@ -577,6 +568,7 @@ static void Drain(audio_output_t *aout)
if (op != NULL)
pa_operation_unref(op);
sys->last_date = VLC_TICK_INVALID;
+ sys->last_pts = VLC_TICK_INVALID;
/* XXX: Loosy drain emulation.
* See #18141: drain callback is never received */
@@ -818,6 +810,7 @@ static int Start(audio_output_t *aout, audio_sample_format_t *restrict fmt)
sys->trigger = NULL;
pa_cvolume_init(&sys->cvolume);
sys->last_date = VLC_TICK_INVALID;
+ sys->last_pts = VLC_TICK_INVALID;
pa_format_info *formatv = pa_format_info_new();
formatv->encoding = encoding;
@@ -1033,7 +1026,6 @@ static int Open(vlc_object_t *obj)
aout->sys = sys;
aout->start = Start;
aout->stop = Stop;
- aout->time_get = TimeGet;
aout->play = Play;
aout->pause = Pause;
aout->flush = Flush;
--
2.29.2
More information about the vlc-devel
mailing list