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

Steve Lhomme robux4 at ycbcr.xyz
Thu Aug 22 13:06:28 CEST 2019


On 2019-08-21 9:01, Thomas Guillem wrote:
> 
> 
> 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.

The "samples" name is an indication as it's what it's usually used for.

In this case it seems that we need a tick to "unit" function with unit a 
fraction of seconds.

>>
>>> +}
>>> +
>>>    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
> _______________________________________________
> 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