Move playWhenReady update out of PlaybackInfoUpdate.
The update is actually unrelated and putting it all in one large update object complicates adding the same update mechanism for other values. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=222226825
This commit is contained in:
parent
edff52ba5f
commit
771db2c9fc
@ -61,7 +61,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
private final Handler internalPlayerHandler;
|
private final Handler internalPlayerHandler;
|
||||||
private final CopyOnWriteArraySet<Player.EventListener> listeners;
|
private final CopyOnWriteArraySet<Player.EventListener> listeners;
|
||||||
private final Timeline.Period period;
|
private final Timeline.Period period;
|
||||||
private final ArrayDeque<PlaybackInfoUpdate> pendingPlaybackInfoUpdates;
|
private final ArrayDeque<Runnable> pendingListenerNotifications;
|
||||||
|
|
||||||
private MediaSource mediaSource;
|
private MediaSource mediaSource;
|
||||||
private boolean playWhenReady;
|
private boolean playWhenReady;
|
||||||
@ -128,7 +128,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
playbackInfo = PlaybackInfo.createDummy(/* startPositionUs= */ 0, emptyTrackSelectorResult);
|
playbackInfo = PlaybackInfo.createDummy(/* startPositionUs= */ 0, emptyTrackSelectorResult);
|
||||||
pendingPlaybackInfoUpdates = new ArrayDeque<>();
|
pendingListenerNotifications = new ArrayDeque<>();
|
||||||
internalPlayer =
|
internalPlayer =
|
||||||
new ExoPlayerImplInternal(
|
new ExoPlayerImplInternal(
|
||||||
renderers,
|
renderers,
|
||||||
@ -222,8 +222,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
/* positionDiscontinuity= */ false,
|
/* positionDiscontinuity= */ false,
|
||||||
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
||||||
TIMELINE_CHANGE_REASON_RESET,
|
TIMELINE_CHANGE_REASON_RESET,
|
||||||
/* seekProcessed= */ false,
|
/* seekProcessed= */ false);
|
||||||
/* playWhenReadyChanged= */ false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -239,13 +238,8 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
}
|
}
|
||||||
if (this.playWhenReady != playWhenReady) {
|
if (this.playWhenReady != playWhenReady) {
|
||||||
this.playWhenReady = playWhenReady;
|
this.playWhenReady = playWhenReady;
|
||||||
updatePlaybackInfo(
|
notifyListeners(
|
||||||
playbackInfo,
|
new PlayWhenReadyUpdate(listeners, playWhenReady, playbackInfo.playbackState));
|
||||||
/* positionDiscontinuity= */ false,
|
|
||||||
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
|
||||||
/* ignored */ TIMELINE_CHANGE_REASON_RESET,
|
|
||||||
/* seekProcessed= */ false,
|
|
||||||
/* playWhenReadyChanged= */ true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,8 +384,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
/* positionDiscontinuity= */ false,
|
/* positionDiscontinuity= */ false,
|
||||||
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
/* ignored */ DISCONTINUITY_REASON_INTERNAL,
|
||||||
TIMELINE_CHANGE_REASON_RESET,
|
TIMELINE_CHANGE_REASON_RESET,
|
||||||
/* seekProcessed= */ false,
|
/* seekProcessed= */ false);
|
||||||
/* playWhenReadyChanged= */ false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -651,8 +644,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
positionDiscontinuity,
|
positionDiscontinuity,
|
||||||
positionDiscontinuityReason,
|
positionDiscontinuityReason,
|
||||||
timelineChangeReason,
|
timelineChangeReason,
|
||||||
seekProcessed,
|
seekProcessed);
|
||||||
/* playWhenReadyChanged= */ false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -694,29 +686,32 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
boolean positionDiscontinuity,
|
boolean positionDiscontinuity,
|
||||||
@Player.DiscontinuityReason int positionDiscontinuityReason,
|
@Player.DiscontinuityReason int positionDiscontinuityReason,
|
||||||
@Player.TimelineChangeReason int timelineChangeReason,
|
@Player.TimelineChangeReason int timelineChangeReason,
|
||||||
boolean seekProcessed,
|
boolean seekProcessed) {
|
||||||
boolean playWhenReadyChanged) {
|
// Assign playback info immediately such that all getters return the right values.
|
||||||
boolean isRunningRecursiveListenerNotification = !pendingPlaybackInfoUpdates.isEmpty();
|
PlaybackInfo previousPlaybackInfo = this.playbackInfo;
|
||||||
pendingPlaybackInfoUpdates.addLast(
|
this.playbackInfo = playbackInfo;
|
||||||
|
notifyListeners(
|
||||||
new PlaybackInfoUpdate(
|
new PlaybackInfoUpdate(
|
||||||
playbackInfo,
|
playbackInfo,
|
||||||
/* previousPlaybackInfo= */ this.playbackInfo,
|
previousPlaybackInfo,
|
||||||
listeners,
|
listeners,
|
||||||
trackSelector,
|
trackSelector,
|
||||||
positionDiscontinuity,
|
positionDiscontinuity,
|
||||||
positionDiscontinuityReason,
|
positionDiscontinuityReason,
|
||||||
timelineChangeReason,
|
timelineChangeReason,
|
||||||
seekProcessed,
|
seekProcessed,
|
||||||
playWhenReady,
|
playWhenReady));
|
||||||
playWhenReadyChanged));
|
}
|
||||||
// Assign playback info immediately such that all getters return the right values.
|
|
||||||
this.playbackInfo = playbackInfo;
|
private void notifyListeners(Runnable listenerNotificationRunnable) {
|
||||||
|
boolean isRunningRecursiveListenerNotification = !pendingListenerNotifications.isEmpty();
|
||||||
|
pendingListenerNotifications.addLast(listenerNotificationRunnable);
|
||||||
if (isRunningRecursiveListenerNotification) {
|
if (isRunningRecursiveListenerNotification) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while (!pendingPlaybackInfoUpdates.isEmpty()) {
|
while (!pendingListenerNotifications.isEmpty()) {
|
||||||
pendingPlaybackInfoUpdates.peekFirst().notifyListeners();
|
pendingListenerNotifications.peekFirst().run();
|
||||||
pendingPlaybackInfoUpdates.removeFirst();
|
pendingListenerNotifications.removeFirst();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -731,7 +726,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
return playbackInfo.timeline.isEmpty() || pendingOperationAcks > 0;
|
return playbackInfo.timeline.isEmpty() || pendingOperationAcks > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class PlaybackInfoUpdate {
|
private static final class PlaybackInfoUpdate implements Runnable {
|
||||||
|
|
||||||
private final PlaybackInfo playbackInfo;
|
private final PlaybackInfo playbackInfo;
|
||||||
private final Set<Player.EventListener> listeners;
|
private final Set<Player.EventListener> listeners;
|
||||||
@ -740,11 +735,11 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
private final @Player.DiscontinuityReason int positionDiscontinuityReason;
|
private final @Player.DiscontinuityReason int positionDiscontinuityReason;
|
||||||
private final @Player.TimelineChangeReason int timelineChangeReason;
|
private final @Player.TimelineChangeReason int timelineChangeReason;
|
||||||
private final boolean seekProcessed;
|
private final boolean seekProcessed;
|
||||||
private final boolean playWhenReady;
|
private final boolean playbackStateChanged;
|
||||||
private final boolean playbackStateOrPlayWhenReadyChanged;
|
|
||||||
private final boolean timelineOrManifestChanged;
|
private final boolean timelineOrManifestChanged;
|
||||||
private final boolean isLoadingChanged;
|
private final boolean isLoadingChanged;
|
||||||
private final boolean trackSelectorResultChanged;
|
private final boolean trackSelectorResultChanged;
|
||||||
|
private final boolean playWhenReady;
|
||||||
|
|
||||||
public PlaybackInfoUpdate(
|
public PlaybackInfoUpdate(
|
||||||
PlaybackInfo playbackInfo,
|
PlaybackInfo playbackInfo,
|
||||||
@ -755,8 +750,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
@Player.DiscontinuityReason int positionDiscontinuityReason,
|
@Player.DiscontinuityReason int positionDiscontinuityReason,
|
||||||
@Player.TimelineChangeReason int timelineChangeReason,
|
@Player.TimelineChangeReason int timelineChangeReason,
|
||||||
boolean seekProcessed,
|
boolean seekProcessed,
|
||||||
boolean playWhenReady,
|
boolean playWhenReady) {
|
||||||
boolean playWhenReadyChanged) {
|
|
||||||
this.playbackInfo = playbackInfo;
|
this.playbackInfo = playbackInfo;
|
||||||
this.listeners = listeners;
|
this.listeners = listeners;
|
||||||
this.trackSelector = trackSelector;
|
this.trackSelector = trackSelector;
|
||||||
@ -765,8 +759,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
this.timelineChangeReason = timelineChangeReason;
|
this.timelineChangeReason = timelineChangeReason;
|
||||||
this.seekProcessed = seekProcessed;
|
this.seekProcessed = seekProcessed;
|
||||||
this.playWhenReady = playWhenReady;
|
this.playWhenReady = playWhenReady;
|
||||||
playbackStateOrPlayWhenReadyChanged =
|
playbackStateChanged = previousPlaybackInfo.playbackState != playbackInfo.playbackState;
|
||||||
playWhenReadyChanged || previousPlaybackInfo.playbackState != playbackInfo.playbackState;
|
|
||||||
timelineOrManifestChanged =
|
timelineOrManifestChanged =
|
||||||
previousPlaybackInfo.timeline != playbackInfo.timeline
|
previousPlaybackInfo.timeline != playbackInfo.timeline
|
||||||
|| previousPlaybackInfo.manifest != playbackInfo.manifest;
|
|| previousPlaybackInfo.manifest != playbackInfo.manifest;
|
||||||
@ -775,7 +768,8 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
previousPlaybackInfo.trackSelectorResult != playbackInfo.trackSelectorResult;
|
previousPlaybackInfo.trackSelectorResult != playbackInfo.trackSelectorResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void notifyListeners() {
|
@Override
|
||||||
|
public void run() {
|
||||||
if (timelineOrManifestChanged || timelineChangeReason == TIMELINE_CHANGE_REASON_PREPARED) {
|
if (timelineOrManifestChanged || timelineChangeReason == TIMELINE_CHANGE_REASON_PREPARED) {
|
||||||
for (Player.EventListener listener : listeners) {
|
for (Player.EventListener listener : listeners) {
|
||||||
listener.onTimelineChanged(
|
listener.onTimelineChanged(
|
||||||
@ -799,7 +793,7 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
listener.onLoadingChanged(playbackInfo.isLoading);
|
listener.onLoadingChanged(playbackInfo.isLoading);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (playbackStateOrPlayWhenReadyChanged) {
|
if (playbackStateChanged) {
|
||||||
for (Player.EventListener listener : listeners) {
|
for (Player.EventListener listener : listeners) {
|
||||||
listener.onPlayerStateChanged(playWhenReady, playbackInfo.playbackState);
|
listener.onPlayerStateChanged(playWhenReady, playbackInfo.playbackState);
|
||||||
}
|
}
|
||||||
@ -811,4 +805,25 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final class PlayWhenReadyUpdate implements Runnable {
|
||||||
|
|
||||||
|
private final Set<Player.EventListener> listeners;
|
||||||
|
private final boolean playWhenReady;
|
||||||
|
private final int playbackState;
|
||||||
|
|
||||||
|
public PlayWhenReadyUpdate(
|
||||||
|
Set<Player.EventListener> listeners, boolean playWhenReady, int playbackState) {
|
||||||
|
this.listeners = listeners;
|
||||||
|
this.playWhenReady = playWhenReady;
|
||||||
|
this.playbackState = playbackState;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
for (Player.EventListener listener : listeners) {
|
||||||
|
listener.onPlayerStateChanged(playWhenReady, playbackState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user