[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