From fe710871aad3e4e6b4e0798f1cf762d5ecfebedb Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 7 Mar 2023 16:57:43 +0000 Subject: [PATCH] Use current position code when checking if AudioTrack has pending data We currently rely on the raw playback head position to check if any data is pending in the AudioTrack (e.g. to know if the renderer is still ready). We can use the value returned from getCurrentPositionUs instead to align the "isReady" logic with the playback position logic. This has the side effect that getPlaybackHeadPosition position is called less often when the position is obtained via getTimestamp. PiperOrigin-RevId: 514747613 --- .../exoplayer2/audio/AudioTrackPositionTracker.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 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 0b9892411d..8dde4b049a 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 @@ -420,7 +420,8 @@ import java.lang.reflect.Method; * @return Whether the audio track has any pending data to play out. */ public boolean hasPendingData(long writtenFrames) { - return writtenFrames > getPlaybackHeadPosition() || forceHasPendingData(); + return writtenFrames > durationUsToFrames(getCurrentPositionUs(/* sourceEnded= */ false)) + || forceHasPendingData(); } /** @@ -542,6 +543,10 @@ import java.lang.reflect.Method; return (frameCount * C.MICROS_PER_SECOND) / outputSampleRate; } + private long durationUsToFrames(long durationUs) { + return (durationUs * outputSampleRate) / C.MICROS_PER_SECOND; + } + private void resetSyncParams() { smoothedPlayheadOffsetUs = 0; playheadOffsetCount = 0; @@ -591,7 +596,7 @@ import java.lang.reflect.Method; long elapsedTimeSinceStopUs = (currentTimeMs * 1000) - stopTimestampUs; long mediaTimeSinceStopUs = Util.getMediaDurationForPlayoutDuration(elapsedTimeSinceStopUs, audioTrackPlaybackSpeed); - long framesSinceStop = (mediaTimeSinceStopUs * outputSampleRate) / C.MICROS_PER_SECOND; + long framesSinceStop = durationUsToFrames(mediaTimeSinceStopUs); return min(endPlaybackHeadPosition, stopPlaybackHeadPosition + framesSinceStop); } if (currentTimeMs - lastRawPlaybackHeadPositionSampleTimeMs