Commit 771db2c9 by tonihei Committed by Oliver Woodman

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
parent edff52ba
...@@ -61,7 +61,7 @@ import java.util.concurrent.CopyOnWriteArraySet; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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; ...@@ -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);
}
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment