[vlc-devel] [PATCH 6/6] coreaudio: start deferred

Thomas Guillem thomas at gllm.fr
Wed Aug 21 09:01:26 CEST 2019



On Mon, Aug 19, 2019, at 14:14, Steve Lhomme wrote:
> On 2019-08-16 10:55, Thomas Guillem wrote:
> > It now use the play date argument to delay the first render until this date is
> > reached (TimeGet() will return -1 in during this step).
> > 
> > This aout module now respect the jitter delay from the new output clock.
> > ---
> >   modules/audio_output/coreaudio_common.c | 71 ++++++++++++++++++++++---
> >   modules/audio_output/coreaudio_common.h |  1 +
> >   2 files changed, 65 insertions(+), 7 deletions(-)
> > 
> > diff --git a/modules/audio_output/coreaudio_common.c b/modules/audio_output/coreaudio_common.c
> > index 8d3a78bede..fa03269d39 100644
> > --- a/modules/audio_output/coreaudio_common.c
> > +++ b/modules/audio_output/coreaudio_common.c
> > @@ -48,6 +48,18 @@ FramesToUs(struct aout_sys_common *p_sys, uint64_t i_nb_frames)
> >       return vlc_tick_from_samples(i_nb_frames, p_sys->i_rate);
> >   }
> >   
> > +static inline size_t
> > +FramesToBytes(struct aout_sys_common *p_sys, uint64_t i_frames)
> > +{
> > +    return i_frames * p_sys->i_bytes_per_frame / p_sys->i_frame_length;
> > +}
> > +
> > +static inline uint64_t
> > +UsToFrames(struct aout_sys_common *p_sys, vlc_tick_t i_us)
> > +{
> > +    return samples_from_vlc_tick(i_us, p_sys->i_rate);
> > +}
> > +
> >   static inline vlc_tick_t
> >   HostTimeToTick(uint64_t i_host_time)
> >   {
> > @@ -55,6 +67,13 @@ HostTimeToTick(uint64_t i_host_time)
> >       return i_host_time * tinfo.numer / tinfo.denom / 1000;
> >   }
> >   
> > +static inline uint64_t
> > +TickToHostTime(vlc_tick_t i_us)
> > +{
> > +    assert(tinfo.denom != 0);
> > +    return i_us * tinfo.denom / tinfo.numer * 1000;
> 
> Same thing here, CLOCK_FREQ should be involved, via 
> samples_from_vlc_tick() for example.

It's not samples but the host time with a different unit.

> 
> > +}
> > +
> >   static void
> >   ca_ClearOutBuffers(audio_output_t *p_aout)
> >   {
> > @@ -158,9 +177,6 @@ ca_Render(audio_output_t *p_aout, uint32_t i_frames, uint64_t i_host_time,
> >   
> >       lock_lock(p_sys);
> >   
> > -    p_sys->i_render_host_time = i_host_time;
> > -    p_sys->i_render_frames = i_frames;
> > -
> >       if (p_sys->b_do_flush)
> >       {
> >           ca_ClearOutBuffers(p_aout);
> > @@ -169,9 +185,42 @@ ca_Render(audio_output_t *p_aout, uint32_t i_frames, uint64_t i_host_time,
> >           vlc_sem_post(&p_sys->flush_sem);
> >       }
> >   
> > -    if (p_sys->b_paused)
> > +    if (p_sys->b_paused || unlikely(p_sys->i_first_render_host_time == 0))
> >           goto drop;
> >   
> > +    /* Start deferred: write silence (zeros) until we reach the first render
> > +     * host time. */
> > +    if (unlikely(p_sys->i_first_render_host_time > i_host_time ))
> > +    {
> > +        /* Convert the requested bytes into host time and check that it does
> > +         * not overlap between the first_render host time and the current one.
> > +         * */
> > +        const size_t i_requested_us =
> > +            FramesToUs(p_sys, BytesToFrames(p_sys, i_requested));
> > +        const uint64_t i_requested_host_time = TickToHostTime(i_requested_us);
> > +        if (p_sys->i_first_render_host_time >= i_host_time + i_requested_host_time)
> > +        {
> > +            /* Fill the buffer with silence */
> > +            goto drop;
> > +        }
> > +
> > +        /* Write silence to reach the first_render host time */
> > +        const vlc_tick_t i_silence_us =
> > +            HostTimeToTick(p_sys->i_first_render_host_time - i_host_time);
> > +
> > +        const uint64_t i_silence_bytes =
> > +            FramesToBytes(p_sys, UsToFrames(p_sys, i_silence_us));
> > +        assert(i_silence_bytes <= i_requested);
> > +        memset(p_output, 0, i_silence_bytes);
> > +
> > +        i_requested -= i_silence_bytes;
> > +
> > +        /* Start the first rendering */
> > +    }
> > +
> > +    p_sys->i_render_host_time = i_host_time;
> > +    p_sys->i_render_frames = i_frames;
> > +
> >       size_t i_copied = 0;
> >       block_t *p_block = p_sys->p_out_chain;
> >       while (p_block != NULL && i_requested != 0)
> > @@ -222,8 +271,9 @@ ca_TimeGet(audio_output_t *p_aout, vlc_tick_t *delay)
> >   
> >       lock_lock(p_sys);
> >   
> > -    if (p_sys->i_render_host_time == 0)
> > +    if (p_sys->i_render_host_time == 0 || p_sys->i_first_render_host_time == 0)
> >       {
> > +        /* Not yet started (or reached the first_render host time) */
> >           lock_unlock(p_sys);
> >           return -1;
> >       }
> > @@ -257,7 +307,7 @@ ca_Flush(audio_output_t *p_aout)
> >           lock_lock(p_sys);
> >       }
> >   
> > -    p_sys->i_render_host_time = 0;
> > +    p_sys->i_render_host_time = p_sys->i_first_render_host_time = 0;
> >       p_sys->i_render_frames = 0;
> >       lock_unlock(p_sys);
> >   
> > @@ -287,6 +337,13 @@ ca_Play(audio_output_t * p_aout, block_t * p_block, vlc_tick_t date)
> >                              VLC_CODEC_FL32);
> >   
> >       lock_lock(p_sys);
> > +
> > +    if (p_sys->i_first_render_host_time == 0)
> > +    {
> > +        /* Setup the first render time */
> > +        p_sys->i_first_render_host_time = TickToHostTime(date);
> > +    }
> > +
> >       do
> >       {
> >           const size_t i_avalaible_bytes =
> > @@ -359,7 +416,7 @@ ca_Initialize(audio_output_t *p_aout, const audio_sample_format_t *fmt,
> >   
> >       p_sys->i_underrun_size = 0;
> >       p_sys->b_paused = false;
> > -    p_sys->i_render_host_time = 0;
> > +    p_sys->i_render_host_time = p_sys->i_first_render_host_time = 0;
> >       p_sys->i_render_frames = 0;
> >   
> >       p_sys->i_rate = fmt->i_rate;
> > diff --git a/modules/audio_output/coreaudio_common.h b/modules/audio_output/coreaudio_common.h
> > index 60ef1fe9ca..06ee98407a 100644
> > --- a/modules/audio_output/coreaudio_common.h
> > +++ b/modules/audio_output/coreaudio_common.h
> > @@ -59,6 +59,7 @@ struct aout_sys_common
> >       block_t             *p_out_chain;
> >       block_t             **pp_out_last;
> >       uint64_t            i_render_host_time;
> > +    uint64_t            i_first_render_host_time;
> >       uint32_t            i_render_frames;
> >   
> >       vlc_sem_t           flush_sem;
> > -- 
> > 2.20.1
> > 
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> > 
> _______________________________________________
> 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