[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