From 4d4e2356974f2f605ee035e0113b76ae152498e5 Mon Sep 17 00:00:00 2001 From: krocard Date: Wed, 5 May 2021 10:03:46 +0100 Subject: [PATCH] Allow disabling offload gapless Issues have been identified around offload gapless track transitions blocking the track timestamp. Until those issues are root caused, this settings allows to disable gapless offload completely. PiperOrigin-RevId: 372081545 --- .../exoplayer2/audio/DefaultAudioSink.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) 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 47bfba9efe..10ac561014 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 @@ -221,7 +221,8 @@ public final class DefaultAudioSink implements AudioSink { @IntDef({ OFFLOAD_MODE_DISABLED, OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED, - OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED + OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED, + OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED }) public @interface OffloadMode {} @@ -243,6 +244,13 @@ public final class DefaultAudioSink implements AudioSink { * transitions between tracks of the same album. */ public static final int OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED = 2; + /** + * The audio sink will prefer offload playback, disabling gapless offload support. + * + *

Use this option if gapless has undesirable side effects. For example if it introduces + * hardware issues. + */ + public static final int OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED = 3; @Documented @Retention(RetentionPolicy.SOURCE) @@ -653,8 +661,10 @@ public final class DefaultAudioSink implements AudioSink { audioTrack = buildAudioTrack(); if (isOffloadedPlayback(audioTrack)) { registerStreamEventCallbackV29(audioTrack); - audioTrack.setOffloadDelayPadding( - configuration.inputFormat.encoderDelay, configuration.inputFormat.encoderPadding); + if (offloadMode != OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED) { + audioTrack.setOffloadDelayPadding( + configuration.inputFormat.encoderDelay, configuration.inputFormat.encoderPadding); + } } audioSessionId = audioTrack.getAudioSessionId(); audioTrackPositionTracker.setAudioTrack( @@ -710,7 +720,8 @@ public final class DefaultAudioSink implements AudioSink { // The current audio track can be reused for the new configuration. configuration = pendingConfiguration; pendingConfiguration = null; - if (isOffloadedPlayback(audioTrack)) { + if (isOffloadedPlayback(audioTrack) + && offloadMode != OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED) { audioTrack.setOffloadEndOfStream(); audioTrack.setOffloadDelayPadding( configuration.inputFormat.encoderDelay, configuration.inputFormat.encoderPadding);