From b3594051a1546c6d271da1285e9518ebb127c4b6 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Fri, 1 May 2015 20:35:54 +0100 Subject: [PATCH] Fix DemoPlayer's spurious transition through STATE_IDLE. The spurious transitions were caused by calling pushTrackSelection in onRenderers after changing the renderer building state to BUILT and before calling player.prepare. pushTrackSelection can cause the ExoPlayer to generate state changes, since it can call setPlayWhenReady. This change transitions the renderer building state later, so that when this happens getPlaybackState correctly masks the state and returns STATE_PREPARING. --- .../android/exoplayer/demo/player/DemoPlayer.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java index 5427a41bcf..dd83694659 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/player/DemoPlayer.java @@ -295,9 +295,11 @@ public class DemoPlayer implements ExoPlayer.Listener, ChunkSampleSource.EventLi if (builderCallback != null) { builderCallback.cancel(); } + videoFormat = null; + videoRenderer = null; + multiTrackSources = null; rendererBuildingState = RENDERER_BUILDING_STATE_BUILDING; maybeReportPlayerState(); - videoFormat = null; builderCallback = new InternalRendererBuilderCallback(); rendererBuilder.buildRenderers(this, builderCallback); } @@ -324,15 +326,15 @@ public class DemoPlayer implements ExoPlayer.Listener, ChunkSampleSource.EventLi } } // Complete preparation. - this.videoRenderer = renderers[TYPE_VIDEO]; this.trackNames = trackNames; + this.videoRenderer = renderers[TYPE_VIDEO]; this.multiTrackSources = multiTrackSources; - rendererBuildingState = RENDERER_BUILDING_STATE_BUILT; pushSurface(false); pushTrackSelection(TYPE_VIDEO, true); pushTrackSelection(TYPE_AUDIO, true); pushTrackSelection(TYPE_TEXT, true); player.prepare(renderers); + rendererBuildingState = RENDERER_BUILDING_STATE_BUILT; } /* package */ void onRenderersError(Exception e) { @@ -571,7 +573,7 @@ public class DemoPlayer implements ExoPlayer.Listener, ChunkSampleSource.EventLi } private void pushSurface(boolean blockForSurfacePush) { - if (rendererBuildingState != RENDERER_BUILDING_STATE_BUILT) { + if (videoRenderer == null) { return; } @@ -585,7 +587,7 @@ public class DemoPlayer implements ExoPlayer.Listener, ChunkSampleSource.EventLi } private void pushTrackSelection(int type, boolean allowRendererEnable) { - if (rendererBuildingState != RENDERER_BUILDING_STATE_BUILT) { + if (multiTrackSources == null) { return; }