From ab64ca809a32b5475f65d874e73022865523a5a7 Mon Sep 17 00:00:00 2001 From: michaelkatz Date: Wed, 8 May 2024 03:59:41 -0700 Subject: [PATCH] Reset tracker for offload track completion prior to stopping AudioTrack For offloaded playback, reset the tracking field for stream completion in `DefaultAudioSink` prior to calling `AudioTrack.stop()` so that `AudioTrack.StreamEventCallback#onPresentationEnded` correctly identifies when all pending data has been played. #minor-release PiperOrigin-RevId: 631744805 --- RELEASENOTES.md | 4 ++++ .../androidx/media3/exoplayer/audio/DefaultAudioSink.java | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a234c0a0d6..b06cdf2c94 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -35,6 +35,10 @@ * Audio: * Fix DTS:X Profile 2 encoding attributes for passthrough playback ([#1299](https://github.com/androidx/media/pull/1299)). + * For offloaded playback, reset the tracking field for stream completion + in `DefaultAudioSink` prior to calling `AudioTrack.stop()` so that + `AudioTrack.StreamEventCallback#onPresentationEnded` correctly + identifies when all pending data has been played. * Video: * Text: * Fix issue where subtitles starting before a seek position are skipped. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java index 19f321741c..c9000e69ce 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java @@ -1869,6 +1869,11 @@ public final class DefaultAudioSink implements AudioSink { if (!stoppedAudioTrack) { stoppedAudioTrack = true; audioTrackPositionTracker.handleEndOfStream(getWrittenFrames()); + if (isOffloadedPlayback(audioTrack)) { + // Reset handledOffloadOnPresentationEnded to track completion after + // this following stop call. + handledOffloadOnPresentationEnded = false; + } audioTrack.stop(); bytesUntilNextAvSync = 0; }