From 45616f916b28c9187b3e0f0dd18797464a079cdc Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 26 Apr 2021 18:02:56 +0100 Subject: [PATCH] Add missing removeDrmEventListener calls. We remove other source related listeners if a MediaSource is removed from the playlist or the player/source is released. This isn't currently done for the DRM listener. #minor-release PiperOrigin-RevId: 370482571 --- .../android/exoplayer2/MediaSourceList.java | 6 ++-- .../source/CompositeMediaSource.java | 28 +++++++++++-------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java b/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java index 1418a03a02..6a7d298955 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MediaSourceList.java @@ -340,6 +340,7 @@ import java.util.Set; Log.e(TAG, "Failed to release child source.", e); } childSource.mediaSource.removeEventListener(childSource.eventListener); + childSource.mediaSource.removeDrmEventListener(childSource.eventListener); } childSources.clear(); enabledMediaSourceHolders.clear(); @@ -449,6 +450,7 @@ import java.util.Set; Assertions.checkNotNull(childSources.remove(mediaSourceHolder)); removedChild.mediaSource.releaseSource(removedChild.caller); removedChild.mediaSource.removeEventListener(removedChild.eventListener); + removedChild.mediaSource.removeDrmEventListener(removedChild.eventListener); enabledMediaSourceHolders.remove(mediaSourceHolder); } } @@ -504,12 +506,12 @@ import java.util.Set; public final MediaSource mediaSource; public final MediaSource.MediaSourceCaller caller; - public final MediaSourceEventListener eventListener; + public final ForwardingEventListener eventListener; public MediaSourceAndListener( MediaSource mediaSource, MediaSource.MediaSourceCaller caller, - MediaSourceEventListener eventListener) { + ForwardingEventListener eventListener) { this.mediaSource = mediaSource; this.caller = caller; this.eventListener = eventListener; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java index e6bba9ae46..062199ef00 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java @@ -35,7 +35,7 @@ import java.util.HashMap; */ public abstract class CompositeMediaSource extends BaseMediaSource { - private final HashMap childSources; + private final HashMap> childSources; @Nullable private Handler eventHandler; @Nullable private TransferListener mediaTransferListener; @@ -55,7 +55,7 @@ public abstract class CompositeMediaSource extends BaseMediaSource { @Override @CallSuper public void maybeThrowSourceInfoRefreshError() throws IOException { - for (MediaSourceAndListener childSource : childSources.values()) { + for (MediaSourceAndListener childSource : childSources.values()) { childSource.mediaSource.maybeThrowSourceInfoRefreshError(); } } @@ -63,7 +63,7 @@ public abstract class CompositeMediaSource extends BaseMediaSource { @Override @CallSuper protected void enableInternal() { - for (MediaSourceAndListener childSource : childSources.values()) { + for (MediaSourceAndListener childSource : childSources.values()) { childSource.mediaSource.enable(childSource.caller); } } @@ -71,7 +71,7 @@ public abstract class CompositeMediaSource extends BaseMediaSource { @Override @CallSuper protected void disableInternal() { - for (MediaSourceAndListener childSource : childSources.values()) { + for (MediaSourceAndListener childSource : childSources.values()) { childSource.mediaSource.disable(childSource.caller); } } @@ -79,9 +79,10 @@ public abstract class CompositeMediaSource extends BaseMediaSource { @Override @CallSuper protected void releaseSourceInternal() { - for (MediaSourceAndListener childSource : childSources.values()) { + for (MediaSourceAndListener childSource : childSources.values()) { childSource.mediaSource.releaseSource(childSource.caller); childSource.mediaSource.removeEventListener(childSource.eventListener); + childSource.mediaSource.removeDrmEventListener(childSource.eventListener); } childSources.clear(); } @@ -113,7 +114,7 @@ public abstract class CompositeMediaSource extends BaseMediaSource { MediaSourceCaller caller = (source, timeline) -> onChildSourceInfoRefreshed(id, source, timeline); ForwardingEventListener eventListener = new ForwardingEventListener(id); - childSources.put(id, new MediaSourceAndListener(mediaSource, caller, eventListener)); + childSources.put(id, new MediaSourceAndListener<>(mediaSource, caller, eventListener)); mediaSource.addEventListener(Assertions.checkNotNull(eventHandler), eventListener); mediaSource.addDrmEventListener(Assertions.checkNotNull(eventHandler), eventListener); mediaSource.prepareSource(caller, mediaTransferListener); @@ -128,7 +129,7 @@ public abstract class CompositeMediaSource extends BaseMediaSource { * @param id The unique id used to prepare the child source. */ protected final void enableChildSource(@UnknownNull T id) { - MediaSourceAndListener enabledChild = Assertions.checkNotNull(childSources.get(id)); + MediaSourceAndListener enabledChild = Assertions.checkNotNull(childSources.get(id)); enabledChild.mediaSource.enable(enabledChild.caller); } @@ -138,7 +139,7 @@ public abstract class CompositeMediaSource extends BaseMediaSource { * @param id The unique id used to prepare the child source. */ protected final void disableChildSource(@UnknownNull T id) { - MediaSourceAndListener disabledChild = Assertions.checkNotNull(childSources.get(id)); + MediaSourceAndListener disabledChild = Assertions.checkNotNull(childSources.get(id)); disabledChild.mediaSource.disable(disabledChild.caller); } @@ -148,9 +149,10 @@ public abstract class CompositeMediaSource extends BaseMediaSource { * @param id The unique id used to prepare the child source. */ protected final void releaseChildSource(@UnknownNull T id) { - MediaSourceAndListener removedChild = Assertions.checkNotNull(childSources.remove(id)); + MediaSourceAndListener removedChild = Assertions.checkNotNull(childSources.remove(id)); removedChild.mediaSource.releaseSource(removedChild.caller); removedChild.mediaSource.removeEventListener(removedChild.eventListener); + removedChild.mediaSource.removeDrmEventListener(removedChild.eventListener); } /** @@ -193,14 +195,16 @@ public abstract class CompositeMediaSource extends BaseMediaSource { return mediaTimeMs; } - private static final class MediaSourceAndListener { + private static final class MediaSourceAndListener { public final MediaSource mediaSource; public final MediaSourceCaller caller; - public final MediaSourceEventListener eventListener; + public final CompositeMediaSource.ForwardingEventListener eventListener; public MediaSourceAndListener( - MediaSource mediaSource, MediaSourceCaller caller, MediaSourceEventListener eventListener) { + MediaSource mediaSource, + MediaSourceCaller caller, + CompositeMediaSource.ForwardingEventListener eventListener) { this.mediaSource = mediaSource; this.caller = caller; this.eventListener = eventListener;