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