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

This commit is contained in:
Colin Kho 2024-09-17 09:59:15 -07:00 committed by Tianyi Feng
parent b884d7ee9b
commit 31a540953c

View File

@ -26,6 +26,7 @@ import androidx.media3.common.C.DataType;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.Player; import androidx.media3.common.Player;
import androidx.media3.common.util.Assertions; import androidx.media3.common.util.Assertions;
import androidx.media3.common.util.Consumer;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import androidx.media3.exoplayer.source.MediaSource.MediaPeriodId; import androidx.media3.exoplayer.source.MediaSource.MediaPeriodId;
import java.io.IOException; import java.io.IOException;
@ -259,12 +260,9 @@ public interface MediaSourceEventListener {
/** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */
public void loadStarted(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { public void loadStarted(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {
for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { dispatchEvent(
MediaSourceEventListener listener = listenerAndHandler.listener; (listener) ->
postOrRun( listener.onLoadStarted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData));
listenerAndHandler.handler,
() -> listener.onLoadStarted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData));
}
} }
/** Dispatches {@link #onLoadCompleted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ /** Dispatches {@link #onLoadCompleted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */
@ -304,14 +302,10 @@ public interface MediaSourceEventListener {
/** Dispatches {@link #onLoadCompleted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ /** Dispatches {@link #onLoadCompleted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */
public void loadCompleted(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { public void loadCompleted(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {
for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { dispatchEvent(
MediaSourceEventListener listener = listenerAndHandler.listener; (listener) ->
postOrRun(
listenerAndHandler.handler,
() ->
listener.onLoadCompleted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); listener.onLoadCompleted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData));
} }
}
/** Dispatches {@link #onLoadCanceled(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ /** Dispatches {@link #onLoadCanceled(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */
public void loadCanceled(LoadEventInfo loadEventInfo, @DataType int dataType) { public void loadCanceled(LoadEventInfo loadEventInfo, @DataType int dataType) {
@ -350,14 +344,10 @@ public interface MediaSourceEventListener {
/** Dispatches {@link #onLoadCanceled(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ /** Dispatches {@link #onLoadCanceled(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */
public void loadCanceled(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { public void loadCanceled(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {
for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { dispatchEvent(
MediaSourceEventListener listener = listenerAndHandler.listener; (listener) ->
postOrRun(
listenerAndHandler.handler,
() ->
listener.onLoadCanceled(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); listener.onLoadCanceled(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData));
} }
}
/** /**
* Dispatches {@link #onLoadError(int, MediaPeriodId, LoadEventInfo, MediaLoadData, IOException, * Dispatches {@link #onLoadError(int, MediaPeriodId, LoadEventInfo, MediaLoadData, IOException,
@ -419,15 +409,11 @@ public interface MediaSourceEventListener {
MediaLoadData mediaLoadData, MediaLoadData mediaLoadData,
IOException error, IOException error,
boolean wasCanceled) { boolean wasCanceled) {
for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { dispatchEvent(
MediaSourceEventListener listener = listenerAndHandler.listener; (listener) ->
postOrRun(
listenerAndHandler.handler,
() ->
listener.onLoadError( listener.onLoadError(
windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData, error, wasCanceled)); windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData, error, wasCanceled));
} }
}
/** Dispatches {@link #onUpstreamDiscarded(int, MediaPeriodId, MediaLoadData)}. */ /** Dispatches {@link #onUpstreamDiscarded(int, MediaPeriodId, MediaLoadData)}. */
public void upstreamDiscarded(int trackType, long mediaStartTimeUs, long mediaEndTimeUs) { public void upstreamDiscarded(int trackType, long mediaStartTimeUs, long mediaEndTimeUs) {
@ -445,12 +431,8 @@ public interface MediaSourceEventListener {
/** Dispatches {@link #onUpstreamDiscarded(int, MediaPeriodId, MediaLoadData)}. */ /** Dispatches {@link #onUpstreamDiscarded(int, MediaPeriodId, MediaLoadData)}. */
public void upstreamDiscarded(MediaLoadData mediaLoadData) { public void upstreamDiscarded(MediaLoadData mediaLoadData) {
MediaPeriodId mediaPeriodId = Assertions.checkNotNull(this.mediaPeriodId); MediaPeriodId mediaPeriodId = Assertions.checkNotNull(this.mediaPeriodId);
for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { dispatchEvent(
MediaSourceEventListener listener = listenerAndHandler.listener; (listener) -> listener.onUpstreamDiscarded(windowIndex, mediaPeriodId, mediaLoadData));
postOrRun(
listenerAndHandler.handler,
() -> listener.onUpstreamDiscarded(windowIndex, mediaPeriodId, mediaLoadData));
}
} }
/** Dispatches {@link #onDownstreamFormatChanged(int, MediaPeriodId, MediaLoadData)}. */ /** Dispatches {@link #onDownstreamFormatChanged(int, MediaPeriodId, MediaLoadData)}. */
@ -473,11 +455,16 @@ public interface MediaSourceEventListener {
/** Dispatches {@link #onDownstreamFormatChanged(int, MediaPeriodId, MediaLoadData)}. */ /** Dispatches {@link #onDownstreamFormatChanged(int, MediaPeriodId, MediaLoadData)}. */
public void downstreamFormatChanged(MediaLoadData 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<MediaSourceEventListener> event) {
for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) { for (ListenerAndHandler listenerAndHandler : listenerAndHandlers) {
MediaSourceEventListener listener = listenerAndHandler.listener; MediaSourceEventListener listener = listenerAndHandler.listener;
postOrRun( postOrRun(listenerAndHandler.handler, () -> event.accept(listener));
listenerAndHandler.handler,
() -> listener.onDownstreamFormatChanged(windowIndex, mediaPeriodId, mediaLoadData));
} }
} }