From c0c11af29f46d64e7bfc7f9e7c63319ee97bc6d5 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 5 Mar 2018 07:52:22 -0800 Subject: [PATCH] Reuse media sources in demo apps. Especially the cast demo app benefits from this feature as it can keep its ConcatenatingMediaSource all the time without having to repopulate it when switching players. Issue:#3498 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=187866048 --- .../exoplayer2/castdemo/PlayerManager.java | 23 ++--- .../exoplayer2/demo/PlayerActivity.java | 96 ++++++++++--------- 2 files changed, 58 insertions(+), 61 deletions(-) diff --git a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java index 70c4831bc5..9956cc827b 100644 --- a/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java +++ b/demos/cast/src/main/java/com/google/android/exoplayer2/castdemo/PlayerManager.java @@ -79,8 +79,8 @@ import java.util.ArrayList; private final CastPlayer castPlayer; private final ArrayList mediaQueue; private final QueuePositionListener queuePositionListener; + private final ConcatenatingMediaSource concatenatingMediaSource; - private ConcatenatingMediaSource concatenatingMediaSource; private boolean castMediaQueueCreationPending; private int currentItemIndex; private Player currentPlayer; @@ -116,6 +116,7 @@ import java.util.ArrayList; this.castControlView = castControlView; mediaQueue = new ArrayList<>(); currentItemIndex = C.INDEX_UNSET; + concatenatingMediaSource = new ConcatenatingMediaSource(); DefaultTrackSelector trackSelector = new DefaultTrackSelector(BANDWIDTH_METER); RenderersFactory renderersFactory = new DefaultRenderersFactory(context, null); @@ -154,9 +155,8 @@ import java.util.ArrayList; */ public void addItem(Sample sample) { mediaQueue.add(sample); - if (currentPlayer == exoPlayer) { - concatenatingMediaSource.addMediaSource(buildMediaSource(sample)); - } else { + concatenatingMediaSource.addMediaSource(buildMediaSource(sample)); + if (currentPlayer == castPlayer) { castPlayer.addItems(buildMediaQueueItem(sample)); } } @@ -185,9 +185,8 @@ import java.util.ArrayList; * @return Whether the removal was successful. */ public boolean removeItem(int itemIndex) { - if (currentPlayer == exoPlayer) { - concatenatingMediaSource.removeMediaSource(itemIndex); - } else { + concatenatingMediaSource.removeMediaSource(itemIndex); + if (currentPlayer == castPlayer) { if (castPlayer.getPlaybackState() != Player.STATE_IDLE) { Timeline castTimeline = castPlayer.getCurrentTimeline(); if (castTimeline.getPeriodCount() <= itemIndex) { @@ -214,9 +213,8 @@ import java.util.ArrayList; */ public boolean moveItem(int fromIndex, int toIndex) { // Player update. - if (currentPlayer == exoPlayer) { - concatenatingMediaSource.moveMediaSource(fromIndex, toIndex); - } else if (castPlayer.getPlaybackState() != Player.STATE_IDLE) { + concatenatingMediaSource.moveMediaSource(fromIndex, toIndex); + if (currentPlayer == castPlayer && castPlayer.getPlaybackState() != Player.STATE_IDLE) { Timeline castTimeline = castPlayer.getCurrentTimeline(); int periodCount = castTimeline.getPeriodCount(); if (periodCount <= fromIndex || periodCount <= toIndex) { @@ -262,6 +260,7 @@ import java.util.ArrayList; public void release() { currentItemIndex = C.INDEX_UNSET; mediaQueue.clear(); + concatenatingMediaSource.clear(); castPlayer.setSessionAvailabilityListener(null); castPlayer.release(); localPlayerView.setPlayer(null); @@ -349,10 +348,6 @@ import java.util.ArrayList; // Media queue management. castMediaQueueCreationPending = currentPlayer == castPlayer; if (currentPlayer == exoPlayer) { - concatenatingMediaSource = new ConcatenatingMediaSource(); - for (int i = 0; i < mediaQueue.size(); i++) { - concatenatingMediaSource.addMediaSource(buildMediaSource(mediaQueue.get(i))); - } exoPlayer.prepare(concatenatingMediaSource); } diff --git a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java index e91feaa291..97b1eb8269 100644 --- a/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java +++ b/demos/main/src/main/java/com/google/android/exoplayer2/demo/PlayerActivity.java @@ -118,6 +118,7 @@ public class PlayerActivity extends Activity private DataSource.Factory mediaDataSourceFactory; private SimpleExoPlayer player; + private MediaSource mediaSource; private DefaultTrackSelector trackSelector; private TrackSelectionHelper trackSelectionHelper; private DebugTextViewHelper debugViewHelper; @@ -253,9 +254,8 @@ public class PlayerActivity extends Activity // Internal methods private void initializePlayer() { - Intent intent = getIntent(); - boolean needNewPlayer = player == null; - if (needNewPlayer) { + if (player == null) { + Intent intent = getIntent(); TrackSelection.Factory adaptiveTrackSelectionFactory = new AdaptiveTrackSelection.Factory(BANDWIDTH_METER); trackSelector = new DefaultTrackSelector(adaptiveTrackSelectionFactory); @@ -315,52 +315,53 @@ public class PlayerActivity extends Activity playerView.setPlaybackPreparer(this); debugViewHelper = new DebugTextViewHelper(player, debugTextView); debugViewHelper.start(); - } - String action = intent.getAction(); - Uri[] uris; - String[] extensions; - if (ACTION_VIEW.equals(action)) { - uris = new Uri[]{intent.getData()}; - extensions = new String[]{intent.getStringExtra(EXTENSION_EXTRA)}; - } else if (ACTION_VIEW_LIST.equals(action)) { - String[] uriStrings = intent.getStringArrayExtra(URI_LIST_EXTRA); - uris = new Uri[uriStrings.length]; - for (int i = 0; i < uriStrings.length; i++) { - uris[i] = Uri.parse(uriStrings[i]); - } - extensions = intent.getStringArrayExtra(EXTENSION_LIST_EXTRA); - if (extensions == null) { - extensions = new String[uriStrings.length]; - } - } else { - showToast(getString(R.string.unexpected_intent_action, action)); - return; - } - if (Util.maybeRequestReadExternalStoragePermission(this, uris)) { - // The player will be reinitialized if the permission is granted. - return; - } - MediaSource[] mediaSources = new MediaSource[uris.length]; - for (int i = 0; i < uris.length; i++) { - mediaSources[i] = buildMediaSource(uris[i], extensions[i], mainHandler, eventLogger); - } - MediaSource mediaSource = mediaSources.length == 1 ? mediaSources[0] - : new ConcatenatingMediaSource(mediaSources); - String adTagUriString = intent.getStringExtra(AD_TAG_URI_EXTRA); - if (adTagUriString != null) { - Uri adTagUri = Uri.parse(adTagUriString); - if (!adTagUri.equals(loadedAdTagUri)) { - releaseAdsLoader(); - loadedAdTagUri = adTagUri; - } - MediaSource adsMediaSource = createAdsMediaSource(mediaSource, Uri.parse(adTagUriString)); - if (adsMediaSource != null) { - mediaSource = adsMediaSource; + + String action = intent.getAction(); + Uri[] uris; + String[] extensions; + if (ACTION_VIEW.equals(action)) { + uris = new Uri[] {intent.getData()}; + extensions = new String[] {intent.getStringExtra(EXTENSION_EXTRA)}; + } else if (ACTION_VIEW_LIST.equals(action)) { + String[] uriStrings = intent.getStringArrayExtra(URI_LIST_EXTRA); + uris = new Uri[uriStrings.length]; + for (int i = 0; i < uriStrings.length; i++) { + uris[i] = Uri.parse(uriStrings[i]); + } + extensions = intent.getStringArrayExtra(EXTENSION_LIST_EXTRA); + if (extensions == null) { + extensions = new String[uriStrings.length]; + } } else { - showToast(R.string.ima_not_loaded); + showToast(getString(R.string.unexpected_intent_action, action)); + return; + } + if (Util.maybeRequestReadExternalStoragePermission(this, uris)) { + // The player will be reinitialized if the permission is granted. + return; + } + MediaSource[] mediaSources = new MediaSource[uris.length]; + for (int i = 0; i < uris.length; i++) { + mediaSources[i] = buildMediaSource(uris[i], extensions[i], mainHandler, eventLogger); + } + mediaSource = + mediaSources.length == 1 ? mediaSources[0] : new ConcatenatingMediaSource(mediaSources); + String adTagUriString = intent.getStringExtra(AD_TAG_URI_EXTRA); + if (adTagUriString != null) { + Uri adTagUri = Uri.parse(adTagUriString); + if (!adTagUri.equals(loadedAdTagUri)) { + releaseAdsLoader(); + loadedAdTagUri = adTagUri; + } + MediaSource adsMediaSource = createAdsMediaSource(mediaSource, Uri.parse(adTagUriString)); + if (adsMediaSource != null) { + mediaSource = adsMediaSource; + } else { + showToast(R.string.ima_not_loaded); + } + } else { + releaseAdsLoader(); } - } else { - releaseAdsLoader(); } boolean haveResumePosition = resumeWindow != C.INDEX_UNSET; if (haveResumePosition) { @@ -424,6 +425,7 @@ public class PlayerActivity extends Activity updateResumePosition(); player.release(); player = null; + mediaSource = null; trackSelector = null; trackSelectionHelper = null; eventLogger = null;