From fc168339035cfe091c75d5c169840be61d34170c Mon Sep 17 00:00:00 2001 From: tonihei Date: Thu, 3 Jan 2019 09:36:35 +0000 Subject: [PATCH] Use Handler instead of ExoPlayer messages in ConcatenatingMediaSource ExoPlayer methods must not be called from any thread besides the specified app thread. Therefore we shouldn't use them here. Using a regular Handler instead is fully equivalent. Issue:#5240 PiperOrigin-RevId: 227650489 --- RELEASENOTES.md | 3 + .../source/ConcatenatingMediaSource.java | 97 +++++++++---------- 2 files changed, 47 insertions(+), 53 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index b3e3d75ef6..d92e4174f6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -4,6 +4,9 @@ * IMA extension: Clear ads loader listeners on release ([#4114](https://github.com/google/ExoPlayer/issues/4114)). +* Fix issue where sending callbacks for playlist changes may cause problems + because of parallel player access + ([#5240](https://github.com/google/ExoPlayer/issues/5240)). ### 2.9.3 ### diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java index 03ccd56645..4e8cccaa23 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java @@ -16,13 +16,12 @@ package com.google.android.exoplayer2.source; import android.os.Handler; +import android.os.Message; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Pair; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; -import com.google.android.exoplayer2.PlayerMessage; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder; import com.google.android.exoplayer2.source.ShuffleOrder.DefaultShuffleOrder; @@ -45,8 +44,7 @@ import java.util.Map; * during playback. It is valid for the same {@link MediaSource} instance to be present more than * once in the concatenation. Access to this class is thread-safe. */ -public class ConcatenatingMediaSource extends CompositeMediaSource - implements PlayerMessage.Target { +public class ConcatenatingMediaSource extends CompositeMediaSource { private static final int MSG_ADD = 0; private static final int MSG_REMOVE = 1; @@ -68,8 +66,8 @@ public class ConcatenatingMediaSource extends CompositeMediaSource(index, mediaSourceHolders, actionOnCompletion)) - .send(); + if (playbackThreadHandler != null && !mediaSources.isEmpty()) { + playbackThreadHandler + .obtainMessage(MSG_ADD, new MessageData<>(index, mediaSourceHolders, actionOnCompletion)) + .sendToTarget(); } else if (actionOnCompletion != null) { actionOnCompletion.run(); } @@ -328,12 +324,10 @@ public class ConcatenatingMediaSource extends CompositeMediaSource(fromIndex, toIndex, actionOnCompletion)) - .send(); + if (playbackThreadHandler != null) { + playbackThreadHandler + .obtainMessage(MSG_REMOVE, new MessageData<>(fromIndex, toIndex, actionOnCompletion)) + .sendToTarget(); } else if (actionOnCompletion != null) { actionOnCompletion.run(); } @@ -371,12 +365,10 @@ public class ConcatenatingMediaSource extends CompositeMediaSource(currentIndex, newIndex, actionOnCompletion)) - .send(); + if (playbackThreadHandler != null) { + playbackThreadHandler + .obtainMessage(MSG_MOVE, new MessageData<>(currentIndex, newIndex, actionOnCompletion)) + .sendToTarget(); } else if (actionOnCompletion != null) { actionOnCompletion.run(); } @@ -430,8 +422,8 @@ public class ConcatenatingMediaSource extends CompositeMediaSource(/* index= */ 0, shuffleOrder, actionOnCompletion)) - .send(); + playbackThreadHandler + .obtainMessage( + MSG_SET_SHUFFLE_ORDER, + new MessageData<>(/* index= */ 0, shuffleOrder, actionOnCompletion)) + .sendToTarget(); } else { this.shuffleOrder = shuffleOrder.getLength() > 0 ? shuffleOrder.cloneAndClear() : shuffleOrder; @@ -465,8 +457,8 @@ public class ConcatenatingMediaSource extends CompositeMediaSource> addMessage = - (MessageData>) Util.castNonNull(message); + (MessageData>) Util.castNonNull(msg.obj); shuffleOrder = shuffleOrder.cloneAndInsert(addMessage.index, addMessage.customData.size()); addMediaSourcesInternal(addMessage.index, addMessage.customData); scheduleListenerNotification(addMessage.actionOnCompletion); break; case MSG_REMOVE: - MessageData removeMessage = (MessageData) Util.castNonNull(message); + MessageData removeMessage = (MessageData) Util.castNonNull(msg.obj); int fromIndex = removeMessage.index; int toIndex = removeMessage.customData; if (fromIndex == 0 && toIndex == shuffleOrder.getLength()) { @@ -587,7 +577,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource moveMessage = (MessageData) Util.castNonNull(message); + MessageData moveMessage = (MessageData) Util.castNonNull(msg.obj); shuffleOrder = shuffleOrder.cloneAndRemove(moveMessage.index, moveMessage.index + 1); shuffleOrder = shuffleOrder.cloneAndInsert(moveMessage.customData, 1); moveMediaSourceInternal(moveMessage.index, moveMessage.customData); @@ -595,7 +585,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource shuffleOrderMessage = - (MessageData) Util.castNonNull(message); + (MessageData) Util.castNonNull(msg.obj); shuffleOrder = shuffleOrderMessage.customData; scheduleListenerNotification(shuffleOrderMessage.actionOnCompletion); break; @@ -603,8 +593,8 @@ public class ConcatenatingMediaSource extends CompositeMediaSource actionsOnCompletion = (List) Util.castNonNull(message); - Handler handler = Assertions.checkNotNull(playerApplicationHandler); + List actionsOnCompletion = (List) Util.castNonNull(msg.obj); + Handler handler = Assertions.checkNotNull(applicationThreadHandler); for (int i = 0; i < actionsOnCompletion.size(); i++) { handler.post(actionsOnCompletion.get(i)); } @@ -612,11 +602,14 @@ public class ConcatenatingMediaSource extends CompositeMediaSource