提交 4867748c 编写于 作者: T tonihei 提交者: Oliver Woodman

Add assertions to check that media sources are not prepared twice.

This lets apps fail-fast when they try to reuse media source instances.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=180934445
上级 4b018b4d
......@@ -131,7 +131,8 @@ public final class ClippingMediaSource implements MediaSource, MediaSource.Liste
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
this.sourceListener = listener;
Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
sourceListener = listener;
mediaSource.prepareSource(player, false, this);
}
......
......@@ -89,6 +89,7 @@ public final class ConcatenatingMediaSource implements MediaSource {
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.listener = listener;
if (mediaSources.length == 0) {
listener.onSourceInfoRefreshed(this, Timeline.EMPTY, null);
......
......@@ -331,6 +331,7 @@ public final class DynamicConcatenatingMediaSource implements MediaSource, Playe
@Override
public synchronized void prepareSource(ExoPlayer player, boolean isTopLevelSource,
Listener listener) {
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.player = player;
this.listener = listener;
preventListenerNotification = true;
......
......@@ -325,6 +325,7 @@ public final class ExtractorMediaSource implements MediaSource, ExtractorMediaPe
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
sourceListener = listener;
notifySourceInfoRefreshed(C.TIME_UNSET, false);
}
......@@ -356,7 +357,7 @@ public final class ExtractorMediaSource implements MediaSource, ExtractorMediaPe
@Override
public void releaseSource() {
sourceListener = null;
// Do nothing.
}
// ExtractorMediaPeriod.Listener implementation.
......
......@@ -36,6 +36,7 @@ public final class LoopingMediaSource implements MediaSource {
private final int loopCount;
private int childPeriodCount;
private boolean wasPrepareSourceCalled;
/**
* Loops the provided source indefinitely. Note that it is usually better to use
......@@ -61,6 +62,8 @@ public final class LoopingMediaSource implements MediaSource {
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, final Listener listener) {
Assertions.checkState(!wasPrepareSourceCalled, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
wasPrepareSourceCalled = true;
childSource.prepareSource(player, false, new Listener() {
@Override
public void onSourceInfoRefreshed(MediaSource source, Timeline timeline, Object manifest) {
......
......@@ -149,6 +149,8 @@ public interface MediaSource {
}
String MEDIA_SOURCE_REUSED_ERROR_MESSAGE = "MediaSource instances are not allowed to be reused.";
/**
* Starts preparation of the source.
* <p>
......
......@@ -19,6 +19,7 @@ import android.support.annotation.IntDef;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.util.Assertions;
import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
......@@ -97,6 +98,7 @@ public final class MergingMediaSource implements MediaSource {
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.listener = listener;
for (int i = 0; i < mediaSources.length; i++) {
final int sourceIndex = i;
......
......@@ -158,6 +158,8 @@ public final class SingleSampleMediaSource implements MediaSource {
private final boolean treatLoadErrorsAsEndOfStream;
private final Timeline timeline;
private boolean isPrepared;
/**
* @param uri The {@link Uri} of the media stream.
* @param dataSourceFactory The factory from which the {@link DataSource} to read the media will
......@@ -251,6 +253,8 @@ public final class SingleSampleMediaSource implements MediaSource {
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(!isPrepared, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
isPrepared = true;
listener.onSourceInfoRefreshed(this, timeline, null);
}
......
......@@ -204,6 +204,7 @@ public final class AdsMediaSource implements MediaSource {
@Override
public void prepareSource(final ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkArgument(isTopLevelSource);
Assertions.checkState(this.listener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
this.listener = listener;
this.player = player;
playerHandler = new Handler();
......
......@@ -483,6 +483,7 @@ public final class DashMediaSource implements MediaSource {
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
sourceListener = listener;
if (sideloadedManifest) {
loaderErrorThrower = new LoaderErrorThrower.Dummy();
......
......@@ -324,7 +324,7 @@ public final class HlsMediaSource implements MediaSource,
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(playlistTracker == null);
Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
playlistTracker = new HlsPlaylistTracker(manifestUri, dataSourceFactory, eventDispatcher,
minLoadableRetryCount, this, playlistParser);
sourceListener = listener;
......@@ -361,7 +361,6 @@ public final class HlsMediaSource implements MediaSource,
playlistTracker.release();
playlistTracker = null;
}
sourceListener = null;
}
@Override
......
......@@ -419,6 +419,7 @@ public final class SsMediaSource implements MediaSource,
@Override
public void prepareSource(ExoPlayer player, boolean isTopLevelSource, Listener listener) {
Assertions.checkState(sourceListener == null, MEDIA_SOURCE_REUSED_ERROR_MESSAGE);
sourceListener = listener;
if (manifest != null) {
manifestLoaderErrorThrower = new LoaderErrorThrower.Dummy();
......@@ -455,7 +456,6 @@ public final class SsMediaSource implements MediaSource,
@Override
public void releaseSource() {
sourceListener = null;
manifest = null;
manifestDataSource = null;
manifestLoadStartTimestamp = 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册