mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
simplify PlayerManager
PiperOrigin-RevId: 303170259
This commit is contained in:
parent
2842eb3eb4
commit
777d99da8a
@ -29,7 +29,6 @@ import com.google.android.exoplayer2.SimpleExoPlayer;
|
|||||||
import com.google.android.exoplayer2.Timeline;
|
import com.google.android.exoplayer2.Timeline;
|
||||||
import com.google.android.exoplayer2.ext.cast.CastPlayer;
|
import com.google.android.exoplayer2.ext.cast.CastPlayer;
|
||||||
import com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener;
|
import com.google.android.exoplayer2.ext.cast.SessionAvailabilityListener;
|
||||||
import com.google.android.exoplayer2.source.ConcatenatingMediaSource;
|
|
||||||
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
|
import com.google.android.exoplayer2.source.DefaultMediaSourceFactory;
|
||||||
import com.google.android.exoplayer2.source.TrackGroupArray;
|
import com.google.android.exoplayer2.source.TrackGroupArray;
|
||||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
||||||
@ -70,7 +69,6 @@ import java.util.ArrayList;
|
|||||||
private final CastPlayer castPlayer;
|
private final CastPlayer castPlayer;
|
||||||
private final ArrayList<MediaItem> mediaQueue;
|
private final ArrayList<MediaItem> mediaQueue;
|
||||||
private final Listener listener;
|
private final Listener listener;
|
||||||
private final ConcatenatingMediaSource concatenatingMediaSource;
|
|
||||||
|
|
||||||
private TrackGroupArray lastSeenTrackGroupArray;
|
private TrackGroupArray lastSeenTrackGroupArray;
|
||||||
private int currentItemIndex;
|
private int currentItemIndex;
|
||||||
@ -96,7 +94,6 @@ import java.util.ArrayList;
|
|||||||
this.castControlView = castControlView;
|
this.castControlView = castControlView;
|
||||||
mediaQueue = new ArrayList<>();
|
mediaQueue = new ArrayList<>();
|
||||||
currentItemIndex = C.INDEX_UNSET;
|
currentItemIndex = C.INDEX_UNSET;
|
||||||
concatenatingMediaSource = new ConcatenatingMediaSource();
|
|
||||||
|
|
||||||
trackSelector = new DefaultTrackSelector(context);
|
trackSelector = new DefaultTrackSelector(context);
|
||||||
exoPlayer = new SimpleExoPlayer.Builder(context).setTrackSelector(trackSelector).build();
|
exoPlayer = new SimpleExoPlayer.Builder(context).setTrackSelector(trackSelector).build();
|
||||||
@ -120,7 +117,7 @@ import java.util.ArrayList;
|
|||||||
* @param itemIndex The index of the item to play.
|
* @param itemIndex The index of the item to play.
|
||||||
*/
|
*/
|
||||||
public void selectQueueItem(int itemIndex) {
|
public void selectQueueItem(int itemIndex) {
|
||||||
setCurrentItem(itemIndex, C.TIME_UNSET, true);
|
setCurrentItem(itemIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the index of the currently played item. */
|
/** Returns the index of the currently played item. */
|
||||||
@ -135,10 +132,7 @@ import java.util.ArrayList;
|
|||||||
*/
|
*/
|
||||||
public void addItem(MediaItem item) {
|
public void addItem(MediaItem item) {
|
||||||
mediaQueue.add(item);
|
mediaQueue.add(item);
|
||||||
concatenatingMediaSource.addMediaSource(defaultMediaSourceFactory.createMediaSource(item));
|
currentPlayer.addMediaItem(item);
|
||||||
if (currentPlayer == castPlayer) {
|
|
||||||
castPlayer.addMediaItem(item);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the size of the media queue. */
|
/** Returns the size of the media queue. */
|
||||||
@ -167,16 +161,7 @@ import java.util.ArrayList;
|
|||||||
if (itemIndex == -1) {
|
if (itemIndex == -1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
concatenatingMediaSource.removeMediaSource(itemIndex);
|
currentPlayer.removeMediaItem(itemIndex);
|
||||||
if (currentPlayer == castPlayer) {
|
|
||||||
if (castPlayer.getPlaybackState() != Player.STATE_IDLE) {
|
|
||||||
Timeline castTimeline = castPlayer.getCurrentTimeline();
|
|
||||||
if (castTimeline.getPeriodCount() <= itemIndex) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
castPlayer.removeMediaItem(itemIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mediaQueue.remove(itemIndex);
|
mediaQueue.remove(itemIndex);
|
||||||
if (itemIndex == currentItemIndex && itemIndex == mediaQueue.size()) {
|
if (itemIndex == currentItemIndex && itemIndex == mediaQueue.size()) {
|
||||||
maybeSetCurrentItemAndNotify(C.INDEX_UNSET);
|
maybeSetCurrentItemAndNotify(C.INDEX_UNSET);
|
||||||
@ -198,17 +183,9 @@ import java.util.ArrayList;
|
|||||||
if (fromIndex == -1) {
|
if (fromIndex == -1) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Player update.
|
|
||||||
concatenatingMediaSource.moveMediaSource(fromIndex, newIndex);
|
|
||||||
if (currentPlayer == castPlayer && castPlayer.getPlaybackState() != Player.STATE_IDLE) {
|
|
||||||
Timeline castTimeline = castPlayer.getCurrentTimeline();
|
|
||||||
int periodCount = castTimeline.getPeriodCount();
|
|
||||||
if (periodCount <= fromIndex || periodCount <= newIndex) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
castPlayer.moveMediaItem(fromIndex, newIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Player update.
|
||||||
|
currentPlayer.moveMediaItem(fromIndex, newIndex);
|
||||||
mediaQueue.add(newIndex, mediaQueue.remove(fromIndex));
|
mediaQueue.add(newIndex, mediaQueue.remove(fromIndex));
|
||||||
|
|
||||||
// Index update.
|
// Index update.
|
||||||
@ -241,7 +218,6 @@ import java.util.ArrayList;
|
|||||||
public void release() {
|
public void release() {
|
||||||
currentItemIndex = C.INDEX_UNSET;
|
currentItemIndex = C.INDEX_UNSET;
|
||||||
mediaQueue.clear();
|
mediaQueue.clear();
|
||||||
concatenatingMediaSource.clear();
|
|
||||||
castPlayer.setSessionAvailabilityListener(null);
|
castPlayer.setSessionAvailabilityListener(null);
|
||||||
castPlayer.release();
|
castPlayer.release();
|
||||||
localPlayerView.setPlayer(null);
|
localPlayerView.setPlayer(null);
|
||||||
@ -345,32 +321,26 @@ import java.util.ArrayList;
|
|||||||
this.currentPlayer = currentPlayer;
|
this.currentPlayer = currentPlayer;
|
||||||
|
|
||||||
// Media queue management.
|
// Media queue management.
|
||||||
if (currentPlayer == exoPlayer) {
|
currentPlayer.setMediaItems(mediaQueue, windowIndex, playbackPositionMs);
|
||||||
exoPlayer.setMediaSource(concatenatingMediaSource, /* resetPosition= */ true);
|
currentPlayer.setPlayWhenReady(playWhenReady);
|
||||||
exoPlayer.prepare();
|
currentPlayer.prepare();
|
||||||
}
|
|
||||||
|
|
||||||
// Playback transition.
|
|
||||||
if (windowIndex != C.INDEX_UNSET) {
|
|
||||||
setCurrentItem(windowIndex, playbackPositionMs, playWhenReady);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts playback of the item at the given position.
|
* Starts playback of the item at the given index.
|
||||||
*
|
*
|
||||||
* @param itemIndex The index of the item to play.
|
* @param itemIndex The index of the item to play.
|
||||||
* @param positionMs The position at which playback should start.
|
|
||||||
* @param playWhenReady Whether the player should proceed when ready to do so.
|
|
||||||
*/
|
*/
|
||||||
private void setCurrentItem(int itemIndex, long positionMs, boolean playWhenReady) {
|
private void setCurrentItem(int itemIndex) {
|
||||||
maybeSetCurrentItemAndNotify(itemIndex);
|
maybeSetCurrentItemAndNotify(itemIndex);
|
||||||
if (currentPlayer == castPlayer && castPlayer.getCurrentTimeline().isEmpty()) {
|
if (currentPlayer.getCurrentTimeline().getWindowCount() != mediaQueue.size()) {
|
||||||
castPlayer.setMediaItems(mediaQueue, itemIndex, positionMs);
|
// This only happens with the cast player. The receiver app in the cast device clears the
|
||||||
|
// timeline when the last item of the timeline has been played to end.
|
||||||
|
currentPlayer.setMediaItems(mediaQueue, itemIndex, C.TIME_UNSET);
|
||||||
} else {
|
} else {
|
||||||
currentPlayer.seekTo(itemIndex, positionMs);
|
currentPlayer.seekTo(itemIndex, C.TIME_UNSET);
|
||||||
currentPlayer.setPlayWhenReady(playWhenReady);
|
|
||||||
}
|
}
|
||||||
|
currentPlayer.setPlayWhenReady(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void maybeSetCurrentItemAndNotify(int currentItemIndex) {
|
private void maybeSetCurrentItemAndNotify(int currentItemIndex) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user