From e052b63514106c55bb57fe5aced2a76a3ec744ba Mon Sep 17 00:00:00 2001 From: tianyifeng Date: Wed, 8 Mar 2023 11:18:26 +0000 Subject: [PATCH] Handle dead object error during writing buffer to AudioTrack PiperOrigin-RevId: 514989776 --- .../androidx/media3/exoplayer/ExoPlayerImplInternal.java | 7 ++++++- .../androidx/media3/exoplayer/audio/DefaultAudioSink.java | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java index ccdc6e74f5..411f61c325 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImplInternal.java @@ -912,7 +912,7 @@ import java.util.concurrent.atomic.AtomicBoolean; } private void attemptRendererErrorRecovery() throws ExoPlaybackException { - seekToCurrentPosition(/* sendDiscontinuity= */ true); + reselectTracksInternalAndSeek(); } private void updatePlaybackPositions() throws ExoPlaybackException { @@ -1696,6 +1696,11 @@ import java.util.concurrent.atomic.AtomicBoolean; enabledRendererCount--; } + private void reselectTracksInternalAndSeek() throws ExoPlaybackException { + reselectTracksInternal(); + seekToCurrentPosition(/* sendDiscontinuity= */ true); + } + private void reselectTracksInternal() throws ExoPlaybackException { float playbackSpeed = mediaClock.getPlaybackParameters().speed; // Reselect tracks on each period in turn, until the selection changes. 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 89e30db6c2..ae2a4b27d7 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 @@ -466,7 +466,6 @@ public final class DefaultAudioSink implements AudioSink { @GuardedBy("releaseExecutorLock") private static int pendingReleaseCount; - private final AudioCapabilities audioCapabilities; private final androidx.media3.common.audio.AudioProcessorChain audioProcessorChain; private final boolean enableFloatOutput; private final ChannelMappingAudioProcessor channelMappingAudioProcessor; @@ -491,6 +490,7 @@ public final class DefaultAudioSink implements AudioSink { private @MonotonicNonNull Configuration configuration; private @MonotonicNonNull AudioProcessingPipeline audioProcessingPipeline; @Nullable private AudioTrack audioTrack; + private AudioCapabilities audioCapabilities; private AudioAttributes audioAttributes; @Nullable private MediaPositionParameters afterDrainParameters; @@ -1141,6 +1141,8 @@ public final class DefaultAudioSink implements AudioSink { listener.onAudioSinkError(e); } if (e.isRecoverable) { + // Change to the audio capabilities supported by all the devices during the error recovery. + audioCapabilities = DEFAULT_AUDIO_CAPABILITIES; throw e; // Do not delay the exception if it can be recovered at higher level. } writeExceptionPendingExceptionHolder.throwExceptionIfDeadlineIsReached(e);