[vlc-commits] [Git][videolan/vlc][master] 2 commits: coreaudio: use aout_TimingReport
Hugo Beauzée-Luyssen (@chouquette)
gitlab at videolan.org
Mon Jul 11 06:21:02 UTC 2022
Hugo Beauzée-Luyssen pushed to branch master at VideoLAN / VLC
Commits:
adf1d933 by Thomas Guillem at 2022-07-11T06:02:14+00:00
coreaudio: use aout_TimingReport
Refs #27023
- - - - -
cf049ad4 by Thomas Guillem at 2022-07-11T06:02:14+00:00
coreaudio: remove render_frames handling
Partially revert feaa3e792b259099771987635f5cdc8f56d776af
and f18fef325af25113875b09c8f727017febc6198a
- - - - -
3 changed files:
- modules/audio_output/auhal.c
- modules/audio_output/coreaudio_common.c
- modules/audio_output/coreaudio_common.h
Changes:
=====================================
modules/audio_output/auhal.c
=====================================
@@ -959,7 +959,7 @@ RenderCallbackSPDIF(AudioDeviceID inDevice, const AudioTimeStamp * inNow,
uint64_t i_host_time = (inOutputTime->mFlags & kAudioTimeStampHostTimeValid)
? inOutputTime->mHostTime : 0;
- ca_Render(p_aout, 0, i_host_time, p_output, i_size, NULL);
+ ca_Render(p_aout, i_host_time, p_output, i_size, NULL);
return noErr;
}
=====================================
modules/audio_output/coreaudio_common.c
=====================================
@@ -132,18 +132,20 @@ 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;
}
/* Called from render callbacks. No lock, wait, and IO here */
void
-ca_Render(audio_output_t *p_aout, uint32_t i_frames, uint64_t i_host_time,
+ca_Render(audio_output_t *p_aout, uint64_t i_host_time,
uint8_t *p_output, size_t i_requested, bool *is_silence)
{
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)
@@ -194,9 +196,7 @@ ca_Render(audio_output_t *p_aout, uint32_t i_frames, uint64_t i_host_time,
/* 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;
@@ -230,6 +230,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 +242,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:
@@ -256,34 +276,10 @@ ca_GetLatencyLocked(audio_output_t *p_aout)
struct aout_sys_common *p_sys = (struct aout_sys_common *) p_aout->sys;
const int64_t i_out_frames = BytesToFrames(p_sys, p_sys->i_out_size);
- return FramesToTicks(p_sys, i_out_frames + p_sys->i_render_frames)
+ return FramesToTicks(p_sys, i_out_frames)
+ 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)
{
@@ -303,7 +299,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;
@@ -434,7 +431,8 @@ ca_Initialize(audio_output_t *p_aout, const audio_sample_format_t *fmt,
p_sys->b_paused = false;
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;
@@ -547,12 +545,13 @@ RenderCallback(void *p_data, AudioUnitRenderActionFlags *ioActionFlags,
VLC_UNUSED(ioActionFlags);
VLC_UNUSED(inTimeStamp);
VLC_UNUSED(inBusNumber);
+ VLC_UNUSED(inNumberFrames);
uint64_t i_host_time = (inTimeStamp->mFlags & kAudioTimeStampHostTimeValid)
? inTimeStamp->mHostTime : 0;
bool is_silence;
- ca_Render(p_data, inNumberFrames, i_host_time, ioData->mBuffers[0].mData,
+ ca_Render(p_data, i_host_time, ioData->mBuffers[0].mData,
ioData->mBuffers[0].mDataByteSize, &is_silence);
if (is_silence)
*ioActionFlags |= kAudioUnitRenderAction_OutputIsSilence;
=====================================
modules/audio_output/coreaudio_common.h
=====================================
@@ -63,7 +63,8 @@ struct aout_sys_common
block_t **pp_out_last;
uint64_t i_render_host_time;
uint64_t i_first_render_host_time;
- uint32_t i_render_frames;
+ vlc_tick_t i_last_latency_ticks;
+ uint64_t i_total_frames;
vlc_sem_t flush_sem;
@@ -87,7 +88,7 @@ struct aout_sys_common
int ca_Open(audio_output_t *p_aout);
-void ca_Render(audio_output_t *p_aout, uint32_t i_nb_samples, uint64_t i_host_time,
+void ca_Render(audio_output_t *p_aout, uint64_t i_host_time,
uint8_t *p_output, size_t i_requested, bool *is_silence);
int ca_TimeGet(audio_output_t *p_aout, vlc_tick_t *delay);
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/99f59dcbb9e09616ec25e22843f1e411d6224385...cf049ad4ab715f342d727fbc724d2b0dd702c21f
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/99f59dcbb9e09616ec25e22843f1e411d6224385...cf049ad4ab715f342d727fbc724d2b0dd702c21f
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list