From 996d66052e526c01faba2f3ed6525246574a294b Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 28 Feb 2023 11:15:05 +0000 Subject: [PATCH] Ensure getPlaybackHeadPosition isn't called if not needed Once the value returned from AudioTimestampPoller advances, we only need getPlaybackHeadPosition to sample sync params and verify the returned timestamp. Both of these happen less often and we can avoid calling getPlaybackHeadPosition if we don't actually need it. PiperOrigin-RevId: 512882170 (cherry picked from commit 4cf7d3c7acc7244bcbf2998f9fdb43c100ce51e1) --- .../audio/AudioTrackPositionTracker.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioTrackPositionTracker.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioTrackPositionTracker.java index 85aab54552..0b9892411d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioTrackPositionTracker.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioTrackPositionTracker.java @@ -451,13 +451,13 @@ import java.lang.reflect.Method; } private void maybeSampleSyncParams() { - long playbackPositionUs = getPlaybackHeadPositionUs(); - if (playbackPositionUs == 0) { - // The AudioTrack hasn't output anything yet. - return; - } long systemTimeUs = System.nanoTime() / 1000; if (systemTimeUs - lastPlayheadSampleTimeUs >= MIN_PLAYHEAD_OFFSET_SAMPLE_INTERVAL_US) { + long playbackPositionUs = getPlaybackHeadPositionUs(); + if (playbackPositionUs == 0) { + // The AudioTrack hasn't output anything yet. + return; + } // Take a new sample and update the smoothed offset between the system clock and the playhead. playheadOffsets[nextPlayheadOffsetIndex] = Util.getPlayoutDurationForMediaDuration(playbackPositionUs, audioTrackPlaybackSpeed) @@ -479,11 +479,11 @@ import java.lang.reflect.Method; return; } - maybePollAndCheckTimestamp(systemTimeUs, playbackPositionUs); + maybePollAndCheckTimestamp(systemTimeUs); maybeUpdateLatency(systemTimeUs); } - private void maybePollAndCheckTimestamp(long systemTimeUs, long playbackPositionUs) { + private void maybePollAndCheckTimestamp(long systemTimeUs) { AudioTimestampPoller audioTimestampPoller = checkNotNull(this.audioTimestampPoller); if (!audioTimestampPoller.maybePollTimestamp(systemTimeUs)) { return; @@ -492,6 +492,7 @@ import java.lang.reflect.Method; // Check the timestamp and accept/reject it. long audioTimestampSystemTimeUs = audioTimestampPoller.getTimestampSystemTimeUs(); long audioTimestampPositionFrames = audioTimestampPoller.getTimestampPositionFrames(); + long playbackPositionUs = getPlaybackHeadPositionUs(); if (Math.abs(audioTimestampSystemTimeUs - systemTimeUs) > MAX_AUDIO_TIMESTAMP_OFFSET_US) { listener.onSystemTimeUsMismatch( audioTimestampPositionFrames,