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 f883fbc96b..0fe08f4fee 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 @@ -48,14 +48,11 @@ public class ConcatenatingMediaSource extends CompositeMediaSource mediaSourcesPublic; @@ -180,18 +177,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource(index, mediaSourceHolder, actionOnCompletion)) - .send(); - } else if (actionOnCompletion != null) { - actionOnCompletion.run(); - } + addMediaSources(index, Collections.singletonList(mediaSource), actionOnCompletion); } /** @@ -253,7 +239,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource(index, mediaSourceHolders, actionOnCompletion)) .send(); } else if (actionOnCompletion != null) { @@ -293,16 +279,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource(index, null, actionOnCompletion)) - .send(); - } else if (actionOnCompletion != null) { - actionOnCompletion.run(); - } + removeMediaSourceRange(index, index + 1, actionOnCompletion); } /** @@ -351,7 +328,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource(fromIndex, toIndex, actionOnCompletion)) .send(); } else if (actionOnCompletion != null) { @@ -411,12 +388,7 @@ public class ConcatenatingMediaSource extends CompositeMediaSource addMessage = (MessageData) message; - shuffleOrder = shuffleOrder.cloneAndInsert(addMessage.index, 1); - addMediaSourceInternal(addMessage.index, addMessage.customData); + MessageData> addMessage = + (MessageData>) message; + shuffleOrder = shuffleOrder.cloneAndInsert(addMessage.index, addMessage.customData.size()); + addMediaSourcesInternal(addMessage.index, addMessage.customData); scheduleListenerNotification(addMessage.actionOnCompletion); break; - case MSG_ADD_MULTIPLE: - MessageData> addMultipleMessage = - (MessageData>) message; - shuffleOrder = - shuffleOrder.cloneAndInsert( - addMultipleMessage.index, addMultipleMessage.customData.size()); - addMediaSourcesInternal(addMultipleMessage.index, addMultipleMessage.customData); - scheduleListenerNotification(addMultipleMessage.actionOnCompletion); - break; case MSG_REMOVE: - MessageData removeMessage = (MessageData) message; - shuffleOrder = shuffleOrder.cloneAndRemove(removeMessage.index); - removeMediaSourceInternal(removeMessage.index); - scheduleListenerNotification(removeMessage.actionOnCompletion); - break; - case MSG_REMOVE_RANGE: - MessageData removeRangeMessage = (MessageData) message; - int fromIndex = removeRangeMessage.index; - int toIndex = removeRangeMessage.customData; - for (int index = toIndex - 1; index >= fromIndex; index--) { - shuffleOrder = shuffleOrder.cloneAndRemove(index); + MessageData removeMessage = (MessageData) message; + int fromIndex = removeMessage.index; + int toIndex = removeMessage.customData; + if (fromIndex == 0 && toIndex == shuffleOrder.getLength()) { + shuffleOrder = shuffleOrder.cloneAndClear(); + } else { + for (int index = toIndex - 1; index >= fromIndex; index--) { + shuffleOrder = shuffleOrder.cloneAndRemove(index); + } } for (int index = toIndex - 1; index >= fromIndex; index--) { removeMediaSourceInternal(index); } - scheduleListenerNotification(removeRangeMessage.actionOnCompletion); + scheduleListenerNotification(removeMessage.actionOnCompletion); break; case MSG_MOVE: MessageData moveMessage = (MessageData) message; @@ -617,10 +579,6 @@ public class ConcatenatingMediaSource extends CompositeMediaSource shuffleOrderMessage = (MessageData) message; shuffleOrder = shuffleOrderMessage.customData; @@ -671,6 +629,13 @@ public class ConcatenatingMediaSource extends CompositeMediaSource mediaSourceHolders) { + for (MediaSourceHolder mediaSourceHolder : mediaSourceHolders) { + addMediaSourceInternal(index++, mediaSourceHolder); + } + } + private void addMediaSourceInternal(int newIndex, MediaSourceHolder newMediaSourceHolder) { if (newIndex > 0) { MediaSourceHolder previousHolder = mediaSourceHolders.get(newIndex - 1); @@ -695,13 +660,6 @@ public class ConcatenatingMediaSource extends CompositeMediaSource mediaSourceHolders) { - for (MediaSourceHolder mediaSourceHolder : mediaSourceHolders) { - addMediaSourceInternal(index++, mediaSourceHolder); - } - } - private void updateMediaSourceInternal(MediaSourceHolder mediaSourceHolder, Timeline timeline) { if (mediaSourceHolder == null) { throw new IllegalArgumentException(); @@ -737,12 +695,6 @@ public class ConcatenatingMediaSource extends CompositeMediaSource= 0; index--) { - removeMediaSourceInternal(index); - } - } - private void removeMediaSourceInternal(int index) { MediaSourceHolder holder = mediaSourceHolders.remove(index); mediaSourceByUid.remove(holder.uid);