From 31a540953c1b6ef9390fe0361b451563b08fbca6 Mon Sep 17 00:00:00 2001 From: Colin Kho Date: Tue, 17 Sep 2024 09:59:15 -0700 Subject: [PATCH 1/3] Add method to MediaSourceEventListener.EventDispatcher to submit events through a lambda function. This allows clients that implement this interface to submit customized event dispatching logic to the EventDispatcher's listeners --- .../source/MediaSourceEventListener.java | 61 ++++++++----------- 1 file changed, 24 insertions(+), 37 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java index 4583dc9991..965c6f01b7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java @@ -26,6 +26,7 @@ import androidx.media3.common.C.DataType; import androidx.media3.common.Format; import androidx.media3.common.Player; import androidx.media3.common.util.Assertions; +import androidx.media3.common.util.Consumer; import androidx.media3.common.util.UnstableApi; import androidx.media3.exoplayer.source.MediaSource.MediaPeriodId; import java.io.IOException; @@ -259,12 +260,9 @@ public interface MediaSourceEventListener { /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ public void loadStarted(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { - for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { - MediaSourceEventListener listener = listenerAndHandler.listener; - postOrRun( - listenerAndHandler.handler, - () -> listener.onLoadStarted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); - } + dispatchEvent( + (listener) -> + listener.onLoadStarted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); } /** Dispatches {@link #onLoadCompleted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ @@ -304,13 +302,9 @@ public interface MediaSourceEventListener { /** Dispatches {@link #onLoadCompleted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ public void loadCompleted(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { - for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { - MediaSourceEventListener listener = listenerAndHandler.listener; - postOrRun( - listenerAndHandler.handler, - () -> - listener.onLoadCompleted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); - } + dispatchEvent( + (listener) -> + listener.onLoadCompleted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); } /** Dispatches {@link #onLoadCanceled(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ @@ -350,13 +344,9 @@ public interface MediaSourceEventListener { /** Dispatches {@link #onLoadCanceled(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ public void loadCanceled(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { - for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { - MediaSourceEventListener listener = listenerAndHandler.listener; - postOrRun( - listenerAndHandler.handler, - () -> - listener.onLoadCanceled(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); - } + dispatchEvent( + (listener) -> + listener.onLoadCanceled(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); } /** @@ -419,14 +409,10 @@ public interface MediaSourceEventListener { MediaLoadData mediaLoadData, IOException error, boolean wasCanceled) { - for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { - MediaSourceEventListener listener = listenerAndHandler.listener; - postOrRun( - listenerAndHandler.handler, - () -> - listener.onLoadError( - windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData, error, wasCanceled)); - } + dispatchEvent( + (listener) -> + listener.onLoadError( + windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData, error, wasCanceled)); } /** Dispatches {@link #onUpstreamDiscarded(int, MediaPeriodId, MediaLoadData)}. */ @@ -445,12 +431,8 @@ public interface MediaSourceEventListener { /** Dispatches {@link #onUpstreamDiscarded(int, MediaPeriodId, MediaLoadData)}. */ public void upstreamDiscarded(MediaLoadData mediaLoadData) { MediaPeriodId mediaPeriodId = Assertions.checkNotNull(this.mediaPeriodId); - for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { - MediaSourceEventListener listener = listenerAndHandler.listener; - postOrRun( - listenerAndHandler.handler, - () -> listener.onUpstreamDiscarded(windowIndex, mediaPeriodId, mediaLoadData)); - } + dispatchEvent( + (listener) -> listener.onUpstreamDiscarded(windowIndex, mediaPeriodId, mediaLoadData)); } /** Dispatches {@link #onDownstreamFormatChanged(int, MediaPeriodId, MediaLoadData)}. */ @@ -473,11 +455,16 @@ public interface MediaSourceEventListener { /** Dispatches {@link #onDownstreamFormatChanged(int, MediaPeriodId, MediaLoadData)}. */ public void downstreamFormatChanged(MediaLoadData mediaLoadData) { + dispatchEvent( + (listener) -> + listener.onDownstreamFormatChanged(windowIndex, mediaPeriodId, mediaLoadData)); + } + + /** Dispatches to a function that supplies a (@link MediaSourceEventListener} */ + public void dispatchEvent(Consumer event) { for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { MediaSourceEventListener listener = listenerAndHandler.listener; - postOrRun( - listenerAndHandler.handler, - () -> listener.onDownstreamFormatChanged(windowIndex, mediaPeriodId, mediaLoadData)); + postOrRun(listenerAndHandler.handler, () -> event.accept(listener)); } } From 508a1d800d21f01ba752554548e6f81f2d22b8fc Mon Sep 17 00:00:00 2001 From: Tianyi Feng Date: Mon, 23 Sep 2024 17:16:35 +0000 Subject: [PATCH 2/3] Add release note --- RELEASENOTES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 427de24b98..fb662efb34 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -45,6 +45,9 @@ overriding this method in `DefaultLoadControl`). The default implementation of `LoadControl` disables preloading in case an app is using a custom implementation of `LoadControl`. + * Add method `MediaSourceEventListener.EventDispatcher.dispatchEvent()` to + allow invoking events of subclass listeners + ([1736](https://github.com/androidx/media/pull/1736)). * Transformer: * Track Selection: * Extractors: From b303498834580556b649927ab82f943543fb8044 Mon Sep 17 00:00:00 2001 From: Tianyi Feng Date: Thu, 19 Sep 2024 22:33:35 +0000 Subject: [PATCH 3/3] Fix the typo in javadoc --- .../media3/exoplayer/source/MediaSourceEventListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java index 965c6f01b7..440625ed19 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java @@ -460,7 +460,7 @@ public interface MediaSourceEventListener { listener.onDownstreamFormatChanged(windowIndex, mediaPeriodId, mediaLoadData)); } - /** Dispatches to a function that supplies a (@link MediaSourceEventListener} */ + /** Dispatches to a function that supplies a {@link MediaSourceEventListener}. */ public void dispatchEvent(Consumer event) { for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { MediaSourceEventListener listener = listenerAndHandler.listener;