diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSource.java index d02478f8d5..5928010620 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DynamicConcatenatingMediaSource.java @@ -333,7 +333,6 @@ public final class DynamicConcatenatingMediaSource extends CompositeMediaSource< public synchronized void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) { super.prepareSource(player, isTopLevelSource, listener); - Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE); this.player = player; this.listener = listener; preventListenerNotification = true; @@ -372,6 +371,17 @@ public final class DynamicConcatenatingMediaSource extends CompositeMediaSource< } } + @Override + public void releaseSource() { + super.releaseSource(); + mediaSourceHolders.clear(); + player = null; + listener = null; + shuffleOrder = shuffleOrder.cloneAndClear(); + windowCount = 0; + periodCount = 0; + } + @Override protected void onChildSourceInfoRefreshed( MediaSourceHolder mediaSourceHolder, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ShuffleOrder.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ShuffleOrder.java index 4307fd2c19..f5f98e4d8a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ShuffleOrder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ShuffleOrder.java @@ -136,6 +136,11 @@ public interface ShuffleOrder { return new DefaultShuffleOrder(newShuffled, new Random(random.nextLong())); } + @Override + public ShuffleOrder cloneAndClear() { + return new DefaultShuffleOrder(/* length= */ 0, new Random(random.nextLong())); + } + private static int[] createShuffledList(int length, Random random) { int[] shuffled = new int[length]; for (int i = 0; i < length; i++) { @@ -199,6 +204,10 @@ public interface ShuffleOrder { return new UnshuffledShuffleOrder(length - 1); } + @Override + public ShuffleOrder cloneAndClear() { + return new UnshuffledShuffleOrder(/* length= */ 0); + } } /** @@ -237,7 +246,7 @@ public interface ShuffleOrder { int getFirstIndex(); /** - * Return a copy of the shuffle order with newly inserted elements. + * Returns a copy of the shuffle order with newly inserted elements. * * @param insertionIndex The index in the unshuffled order at which elements are inserted. * @param insertionCount The number of elements inserted at {@code insertionIndex}. @@ -246,11 +255,13 @@ public interface ShuffleOrder { ShuffleOrder cloneAndInsert(int insertionIndex, int insertionCount); /** - * Return a copy of the shuffle order with one element removed. + * Returns a copy of the shuffle order with one element removed. * * @param removalIndex The index of the element in the unshuffled order which is to be removed. * @return A copy of this {@link ShuffleOrder} without the removed element. */ ShuffleOrder cloneAndRemove(int removalIndex); + /** Returns a copy of the shuffle order with all elements removed. */ + ShuffleOrder cloneAndClear(); } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeShuffleOrder.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeShuffleOrder.java index 0664f47023..cb70c75bdb 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeShuffleOrder.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeShuffleOrder.java @@ -65,4 +65,8 @@ public final class FakeShuffleOrder implements ShuffleOrder { return new FakeShuffleOrder(length - 1); } + @Override + public ShuffleOrder cloneAndClear() { + return new FakeShuffleOrder(/* length= */ 0); + } }