diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 69b4920878..e01fb0bdee 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -904,7 +904,7 @@ import java.util.concurrent.atomic.AtomicBoolean; } private void attemptRendererErrorRecovery() throws ExoPlaybackException { - seekToCurrentPosition(/* sendDiscontinuity= */ true); + reselectTracksInternalAndSeek(); } private void updatePlaybackPositions() throws ExoPlaybackException { @@ -1688,6 +1688,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/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java index 59e2b142bd..5f50eb7901 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java @@ -453,7 +453,6 @@ public final class DefaultAudioSink implements AudioSink { @GuardedBy("releaseExecutorLock") private static int pendingReleaseCount; - private final AudioCapabilities audioCapabilities; private final com.google.android.exoplayer2.audio.AudioProcessorChain audioProcessorChain; private final boolean enableFloatOutput; private final ChannelMappingAudioProcessor channelMappingAudioProcessor; @@ -478,6 +477,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; @@ -1128,6 +1128,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);