From adf1d933f72de1925f3733e1ee6abd2eeee12e9b Mon Sep 17 00:00:00 2001 From: Thomas Guillem <thomas@gllm.fr> Date: Mon, 20 Jun 2022 17:25:31 +0200 Subject: [PATCH] coreaudio: use aout_TimingReport Refs #27023 --- modules/audio_output/coreaudio_common.c | 52 +++++++++++++------------ modules/audio_output/coreaudio_common.h | 2 + 2 files changed, 29 insertions(+), 25 deletions(-) diff --git a/modules/audio_output/coreaudio_common.c b/modules/audio_output/coreaudio_common.c index 5f6e526a7b1e..e513bc4bb197 100644 --- a/modules/audio_output/coreaudio_common.c +++ b/modules/audio_output/coreaudio_common.c @@ -132,7 +132,7 @@ ca_Open(audio_output_t *p_aout) p_aout->play = ca_Play; p_aout->pause = ca_Pause; p_aout->flush = ca_Flush; - p_aout->time_get = ca_TimeGet; + p_aout->time_get = NULL; return VLC_SUCCESS; } @@ -144,6 +144,8 @@ ca_Render(audio_output_t *p_aout, uint32_t i_frames, uint64_t i_host_time, { struct aout_sys_common *p_sys = (struct aout_sys_common *) p_aout->sys; + vlc_tick_t i_now_ticks = vlc_tick_now(); + lock_lock(p_sys); if (p_sys->b_do_flush) @@ -230,6 +232,8 @@ ca_Render(audio_output_t *p_aout, uint32_t i_frames, uint64_t i_host_time, p_sys->pp_out_last = &p_sys->p_out_chain; p_sys->i_out_size -= i_copied; + p_sys->i_total_frames += i_copied; + /* Pad with 0 */ if (i_requested > 0) { @@ -240,7 +244,25 @@ ca_Render(audio_output_t *p_aout, uint32_t i_frames, uint64_t i_host_time, if (is_silence != NULL) *is_silence = p_sys->b_muted; + + /* Convert host time to ticks */ + vlc_tick_t i_host_ticks = HostTimeToTick(p_sys, i_host_time - mach_absolute_time()) + + i_now_ticks; + + /* Report a timing every seconds */ + if (p_sys->i_last_latency_ticks == VLC_TICK_INVALID + || i_host_ticks - p_sys->i_last_latency_ticks >= VLC_TICK_FROM_SEC(1)) + { + vlc_tick_t frames_tick = FramesToTicks(p_sys, + BytesToFrames(p_sys, p_sys->i_total_frames)) + + p_sys->i_dev_latency_ticks; + + aout_TimingReport(p_aout, i_host_ticks, frames_tick); + p_sys->i_last_latency_ticks = i_host_ticks; + } + lock_unlock(p_sys); + return; drop: @@ -260,30 +282,6 @@ ca_GetLatencyLocked(audio_output_t *p_aout) + p_sys->i_dev_latency_ticks; } -int -ca_TimeGet(audio_output_t *p_aout, vlc_tick_t *delay) -{ - struct aout_sys_common *p_sys = (struct aout_sys_common *) p_aout->sys; - - lock_lock(p_sys); - - 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; - } - - int64_t i_render_delay_host_time = p_sys->i_render_host_time - - mach_absolute_time(); - const vlc_tick_t i_render_delay = - HostTimeToTick(p_sys, i_render_delay_host_time); - - *delay = ca_GetLatencyLocked(p_aout) + i_render_delay; - lock_unlock(p_sys); - return 0; -} - void ca_Flush(audio_output_t *p_aout) { @@ -304,6 +302,8 @@ ca_Flush(audio_output_t *p_aout) p_sys->i_render_host_time = p_sys->i_first_render_host_time = 0; p_sys->i_render_frames = 0; + p_sys->i_last_latency_ticks = VLC_TICK_INVALID; + p_sys->i_total_frames = 0; lock_unlock(p_sys); p_sys->b_played = false; @@ -435,6 +435,8 @@ ca_Initialize(audio_output_t *p_aout, const audio_sample_format_t *fmt, p_sys->b_muted = false; p_sys->i_render_host_time = p_sys->i_first_render_host_time = 0; p_sys->i_render_frames = 0; + p_sys->i_last_latency_ticks = VLC_TICK_INVALID; + p_sys->i_total_frames = 0; p_sys->i_rate = fmt->i_rate; p_sys->i_bytes_per_frame = fmt->i_bytes_per_frame; diff --git a/modules/audio_output/coreaudio_common.h b/modules/audio_output/coreaudio_common.h index 4d6f05c36783..ddc8e7df75bf 100644 --- a/modules/audio_output/coreaudio_common.h +++ b/modules/audio_output/coreaudio_common.h @@ -63,6 +63,8 @@ struct aout_sys_common block_t **pp_out_last; uint64_t i_render_host_time; uint64_t i_first_render_host_time; + vlc_tick_t i_last_latency_ticks; + uint64_t i_total_frames; uint32_t i_render_frames; vlc_sem_t flush_sem; -- GitLab