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:
tonihei 2018-11-20 04:45:11 -08:00 committed by Oliver Woodman
parent edff52ba5f
commit 771db2c9fc

View File

@ -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);
}
}
}
} }