diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackAudioOutput.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackAudioOutput.java index d2f61c663cc..0c698fd8a49 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackAudioOutput.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/AudioTrackAudioOutput.java @@ -86,7 +86,7 @@ public final class AudioTrackAudioOutput implements AudioOutput { private final AudioTrack audioTrack; private final OutputConfig config; @Nullable private final CapabilityChangeListener capabilityChangeListener; - @Nullable private OnRoutingChangedListenerApi24 onRoutingChangedListener; + @Nullable private OnRoutingChangedListener onRoutingChangedListener; private final AudioTrackPositionTracker audioTrackPositionTracker; private final boolean isOutputPcm; private final int pcmFrameSize; @@ -142,9 +142,8 @@ public AudioTrackAudioOutput( pcmFrameSize, config.bufferSize); - if (SDK_INT >= 24 && capabilityChangeListener != null) { - onRoutingChangedListener = - new OnRoutingChangedListenerApi24(audioTrack, capabilityChangeListener); + if (capabilityChangeListener != null) { + onRoutingChangedListener = new OnRoutingChangedListener(audioTrack, capabilityChangeListener); } offloadStreamEventCallbackV29 = isOffloadedPlayback() ? new StreamEventCallbackV29() : null; } @@ -288,7 +287,7 @@ public void release() { if (SDK_INT >= 29 && isOffloadedPlayback()) { checkNotNull(offloadStreamEventCallbackV29).unregister(); } - if (SDK_INT >= 24 && onRoutingChangedListener != null) { + if (onRoutingChangedListener != null) { onRoutingChangedListener.release(); onRoutingChangedListener = null; } @@ -566,31 +565,46 @@ private InvalidAudioTrackTimestampException(String message) { } } - @RequiresApi(24) - private static final class OnRoutingChangedListenerApi24 { + private static final class OnRoutingChangedListener { private final AudioTrack audioTrack; private final CapabilityChangeListener capabilityChangeListener; private final Handler playbackThreadHandler; + @Nullable private AudioTrack.OnRoutingChangedListener listenerApi23; @Nullable private AudioRouting.OnRoutingChangedListener listener; - private OnRoutingChangedListenerApi24( + private OnRoutingChangedListener( AudioTrack audioTrack, CapabilityChangeListener capabilityChangeListener) { this.audioTrack = audioTrack; this.capabilityChangeListener = capabilityChangeListener; this.playbackThreadHandler = Util.createHandlerForCurrentLooper(); - this.listener = this::onRoutingChanged; - audioTrack.addOnRoutingChangedListener(listener, playbackThreadHandler); + if (SDK_INT >= 24) { + this.listener = this::onRoutingChanged; + audioTrack.addOnRoutingChangedListener(listener, playbackThreadHandler); + } else { + this.listenerApi23 = this::onRoutingChanged; + audioTrack.addOnRoutingChangedListener(listenerApi23, playbackThreadHandler); + } } private void release() { - audioTrack.removeOnRoutingChangedListener(checkNotNull(listener)); - listener = null; + if (SDK_INT >= 24) { + audioTrack.removeOnRoutingChangedListener(checkNotNull(listener)); + listener = null; + } else { + audioTrack.removeOnRoutingChangedListener(checkNotNull(listenerApi23)); + listenerApi23 = null; + } } + @RequiresApi(24) private void onRoutingChanged(AudioRouting router) { - if (listener == null) { + onRoutingChanged((AudioTrack) router); + } + + private void onRoutingChanged(AudioTrack router) { + if (listener == null && listenerApi23 == null) { // Stale event. return; } @@ -601,7 +615,7 @@ private void onRoutingChanged(AudioRouting router) { if (routedDevice != null) { playbackThreadHandler.post( () -> { - if (listener == null) { + if (listener == null && listenerApi23 == null) { // Stale event. return; }