[vlc-devel] [RFC PATCH 8/9] pulse: request timing asynchronously
Thomas Guillem
thomas at gllm.fr
Thu Dec 10 19:57:15 CET 2020
On Thu, Dec 10, 2020, at 19:51, Rémi Denis-Courmont wrote:
> Le jeudi 10 décembre 2020, 19:10:14 EET Thomas Guillem a écrit :
> > ---
> > 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)
>
> This all patch seems eerily familiar. Is this some kind of revert-revert?
I wrote it from scratch. Indeed, we are storing the last_pts in VLC 3.0.
TBH, I struggle a lot with AV SYNC in VLC, so I may have gone into one direction and backward. This is worse with Android AudioTrack, I really don't know how to get a good latency. There is like 3000 lines of hacks in exoplayer arround AudioTrack latency. That is why I tried the AAudio way.
>
> > */ @@ -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;
>
>
> --
> Rémi Denis-Courmont
>
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list