diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java index c747fd06f7..1cbfde0bca 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java @@ -214,12 +214,21 @@ public interface AudioSink { public final int errorCode; /** If the exception can be recovered by recreating the sink. */ public final boolean isRecoverable; + /** The input {@link Format} of the sink when the error occurs. */ + public final Format format; - /** @param errorCode The error value returned from the sink implementation. */ - public WriteException(int errorCode, boolean isRecoverable) { + /** + * Creates an instance. + * + * @param errorCode The error value returned from the sink implementation. + * @param format The input format of the sink when the error occurs. + * @param isRecoverable Whether the exception can be recovered by recreating the sink. + */ + public WriteException(int errorCode, Format format, boolean isRecoverable) { super("AudioTrack write failed: " + errorCode); this.isRecoverable = isRecoverable; this.errorCode = errorCode; + this.format = format; } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java index ea523714d9..dbf585c2b2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java @@ -261,7 +261,7 @@ public abstract class DecoderAudioRenderer< try { audioSink.playToEndOfStream(); } catch (AudioSink.WriteException e) { - throw createRendererException(e, inputFormat, e.isRecoverable); + throw createRendererException(e, e.format, e.isRecoverable); } return; } @@ -307,7 +307,7 @@ public abstract class DecoderAudioRenderer< } catch (AudioSink.InitializationException e) { throw createRendererException(e, e.format, e.isRecoverable); } catch (AudioSink.WriteException e) { - throw createRendererException(e, inputFormat, e.isRecoverable); + throw createRendererException(e, e.format, e.isRecoverable); } decoderCounters.ensureUpdated(); } @@ -395,7 +395,7 @@ public abstract class DecoderAudioRenderer< try { processEndOfStream(); } catch (AudioSink.WriteException e) { - throw createRendererException(e, getOutputFormat(decoder), e.isRecoverable); + throw createRendererException(e, e.format, e.isRecoverable); } } return false; 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 fd9d5fd943..145c92e94d 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 @@ -952,7 +952,7 @@ public final class DefaultAudioSink implements AudioSink { if (isRecoverable) { maybeDisableOffload(); } - WriteException e = new WriteException(error, isRecoverable); + WriteException e = new WriteException(error, configuration.inputFormat, isRecoverable); if (listener != null) { listener.onAudioSinkError(e); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index f9701f6b8e..eb3010b4ea 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -629,9 +629,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media try { audioSink.playToEndOfStream(); } catch (AudioSink.WriteException e) { - @Nullable Format outputFormat = getOutputFormat(); - throw createRendererException( - e, outputFormat != null ? outputFormat : getInputFormat(), e.isRecoverable); + throw createRendererException(e, e.format, e.isRecoverable); } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/audio/MediaCodecAudioRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/audio/MediaCodecAudioRendererTest.java index c8db4ebc5e..f90562e2ab 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/audio/MediaCodecAudioRendererTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/audio/MediaCodecAudioRendererTest.java @@ -310,7 +310,9 @@ public class MediaCodecAudioRendererTest { verify(audioSink, atLeastOnce()).setListener(listenerCaptor.capture()); AudioSink.Listener audioSinkListener = listenerCaptor.getValue(); - Exception error = new AudioSink.WriteException(/* errorCode= */ 1, /* isRecoverable= */ true); + Exception error = + new AudioSink.WriteException( + /* errorCode= */ 1, new Format.Builder().build(), /* isRecoverable= */ true); audioSinkListener.onAudioSinkError(error); shadowOf(Looper.getMainLooper()).idle();