@Test public void enableRendererMediaClockWithFixedButSamePlaybackParameters_shouldNotTriggerCallback() throws ExoPlaybackException { FakeMediaClockRenderer mediaClockRenderer = new MediaClockRenderer(PlaybackParameters.DEFAULT, /* playbackParametersAreMutable= */ false); mediaClock.onRendererEnabled(mediaClockRenderer); verifyNoMoreInteractions(listener); }
@Test public void enableSameRendererClockTwice_shouldNotThrow() throws ExoPlaybackException { MediaClockRenderer mediaClockRenderer = new MediaClockRenderer(); mediaClock.onRendererEnabled(mediaClockRenderer); mediaClock.onRendererEnabled(mediaClockRenderer); mediaClockRenderer.positionUs = TEST_POSITION_US; assertThat(mediaClock.syncAndGetPositionUs()).isEqualTo(TEST_POSITION_US); }
@Test public void enableRendererMediaClockWithFixedParameters_shouldTriggerCallback() throws ExoPlaybackException { FakeMediaClockRenderer mediaClockRenderer = new MediaClockRenderer(TEST_PLAYBACK_PARAMETERS, /* playbackParametersAreMutable= */ false); mediaClock.onRendererEnabled(mediaClockRenderer); verify(listener).onPlaybackParametersChanged(TEST_PLAYBACK_PARAMETERS); }
@Test public void enableRendererMediaClock_shouldOverwriteRendererPlaybackParametersIfPossible() throws ExoPlaybackException { FakeMediaClockRenderer mediaClockRenderer = new MediaClockRenderer(TEST_PLAYBACK_PARAMETERS, /* playbackParametersAreMutable= */ true); mediaClock.onRendererEnabled(mediaClockRenderer); assertThat(mediaClock.getPlaybackParameters()).isEqualTo(PlaybackParameters.DEFAULT); verifyNoMoreInteractions(listener); }
@Test public void getPositionWithPlaybackParameterChange_shouldTriggerCallback() throws ExoPlaybackException { MediaClockRenderer mediaClockRenderer = new MediaClockRenderer(PlaybackParameters.DEFAULT, /* playbackParametersAreMutable= */ true); mediaClock.onRendererEnabled(mediaClockRenderer); // Silently change playback parameters of renderer clock. mediaClockRenderer.playbackParameters = TEST_PLAYBACK_PARAMETERS; mediaClock.syncAndGetPositionUs(); verify(listener).onPlaybackParametersChanged(TEST_PLAYBACK_PARAMETERS); }
@Test public void rendererClockSetPlaybackParametersOverwrite_shouldTriggerCallback() throws ExoPlaybackException { FakeMediaClockRenderer mediaClockRenderer = new MediaClockRenderer(PlaybackParameters.DEFAULT, /* playbackParametersAreMutable= */ false); mediaClock.onRendererEnabled(mediaClockRenderer); mediaClock.setPlaybackParameters(TEST_PLAYBACK_PARAMETERS); verify(listener).onPlaybackParametersChanged(PlaybackParameters.DEFAULT); }
@Test public void enableOtherRendererClock_shouldThrow() throws ExoPlaybackException { MediaClockRenderer mediaClockRenderer1 = new MediaClockRenderer(); MediaClockRenderer mediaClockRenderer2 = new MediaClockRenderer(); mediaClockRenderer1.positionUs = TEST_POSITION_US; mediaClock.onRendererEnabled(mediaClockRenderer1); try { mediaClock.onRendererEnabled(mediaClockRenderer2); fail(); } catch (ExoPlaybackException e) { // Expected. } assertThat(mediaClock.syncAndGetPositionUs()).isEqualTo(TEST_POSITION_US); }
@Test public void enableRendererMediaClockWithFixedParameters_usesRendererPlaybackParameters() throws ExoPlaybackException { FakeMediaClockRenderer mediaClockRenderer = new MediaClockRenderer(TEST_PLAYBACK_PARAMETERS, /* playbackParametersAreMutable= */ false); mediaClock.onRendererEnabled(mediaClockRenderer); assertThat(mediaClock.getPlaybackParameters()).isEqualTo(TEST_PLAYBACK_PARAMETERS); }
@Test public void rendererClockSetPlaybackParameters_shouldTriggerCallback() throws ExoPlaybackException { FakeMediaClockRenderer mediaClockRenderer = new MediaClockRenderer(PlaybackParameters.DEFAULT, /* playbackParametersAreMutable= */ true); mediaClock.onRendererEnabled(mediaClockRenderer); mediaClock.setPlaybackParameters(TEST_PLAYBACK_PARAMETERS); verify(listener).onPlaybackParametersChanged(TEST_PLAYBACK_PARAMETERS); }
@Test public void rendererClockSetPlaybackParametersOverwrite_getParametersShouldReturnSameValue() throws ExoPlaybackException { FakeMediaClockRenderer mediaClockRenderer = new MediaClockRenderer(PlaybackParameters.DEFAULT, /* playbackParametersAreMutable= */ false); mediaClock.onRendererEnabled(mediaClockRenderer); PlaybackParameters parameters = mediaClock.setPlaybackParameters(TEST_PLAYBACK_PARAMETERS); assertThat(parameters).isEqualTo(PlaybackParameters.DEFAULT); assertThat(mediaClock.getPlaybackParameters()).isEqualTo(PlaybackParameters.DEFAULT); }
@Test public void rendererClockSetPlaybackParameters_getPlaybackParametersShouldReturnSameValue() throws ExoPlaybackException { FakeMediaClockRenderer mediaClockRenderer = new MediaClockRenderer(PlaybackParameters.DEFAULT, /* playbackParametersAreMutable= */ true); mediaClock.onRendererEnabled(mediaClockRenderer); PlaybackParameters parameters = mediaClock.setPlaybackParameters(TEST_PLAYBACK_PARAMETERS); assertThat(parameters).isEqualTo(TEST_PLAYBACK_PARAMETERS); assertThat(mediaClock.getPlaybackParameters()).isEqualTo(TEST_PLAYBACK_PARAMETERS); }
@Test public void disableRendererMediaClock_shouldKeepPlaybackParameters() throws ExoPlaybackException { FakeMediaClockRenderer mediaClockRenderer = new MediaClockRenderer(TEST_PLAYBACK_PARAMETERS, /* playbackParametersAreMutable= */ false); mediaClock.onRendererEnabled(mediaClockRenderer); mediaClock.onRendererDisabled(mediaClockRenderer); assertThat(mediaClock.getPlaybackParameters()).isEqualTo(TEST_PLAYBACK_PARAMETERS); }
@Test public void rendererEnded_shouldFallbackToStandaloneClock() throws ExoPlaybackException { MediaClockRenderer mediaClockRenderer = new MediaClockRenderer(/* isReady= */ true, /* isEnded= */ true, /* hasReadStreamToEnd= */ true); mediaClock.start(); mediaClock.onRendererEnabled(mediaClockRenderer); assertClockIsRunning(); }
@Test public void rendererNotReady_shouldStillUseRendererClock() throws ExoPlaybackException { MediaClockRenderer mediaClockRenderer = new MediaClockRenderer(/* isReady= */ false, /* isEnded= */ false, /* hasReadStreamToEnd= */ false); mediaClock.start(); mediaClock.onRendererEnabled(mediaClockRenderer); // We're not advancing the renderer media clock. Thus, the clock should appear to be stopped. assertClockIsStopped(); }
@Test public void rendererNotReadyAndReadStreamToEnd_shouldFallbackToStandaloneClock() throws ExoPlaybackException { MediaClockRenderer mediaClockRenderer = new MediaClockRenderer(/* isReady= */ false, /* isEnded= */ false, /* hasReadStreamToEnd= */ true); mediaClock.start(); mediaClock.onRendererEnabled(mediaClockRenderer); assertClockIsRunning(); }
@Test public void enableRendererMediaClock_usesRendererClockPosition() throws ExoPlaybackException { MediaClockRenderer mediaClockRenderer = new MediaClockRenderer(); mediaClock.start(); mediaClock.onRendererEnabled(mediaClockRenderer); mediaClockRenderer.positionUs = TEST_POSITION_US; assertThat(mediaClock.syncAndGetPositionUs()).isEqualTo(TEST_POSITION_US); // We're not advancing the renderer media clock. Thus, the clock should appear to be stopped. assertClockIsStopped(); }
@Test public void resetPositionWhileUsingRendererMediaClock_shouldHaveNoEffect() throws ExoPlaybackException { MediaClockRenderer mediaClockRenderer = new MediaClockRenderer(); mediaClock.start(); mediaClock.onRendererEnabled(mediaClockRenderer); mediaClockRenderer.positionUs = TEST_POSITION_US; assertThat(mediaClock.syncAndGetPositionUs()).isEqualTo(TEST_POSITION_US); mediaClock.resetPosition(0); assertThat(mediaClock.syncAndGetPositionUs()).isEqualTo(TEST_POSITION_US); }
private void enableRenderer( int rendererIndex, boolean wasRendererEnabled, int enabledRendererIndex) throws ExoPlaybackException { MediaPeriodHolder playingPeriodHolder = queue.getPlayingPeriod(); Renderer renderer = renderers[rendererIndex]; enabledRenderers[enabledRendererIndex] = renderer; if (renderer.getState() == Renderer.STATE_DISABLED) { RendererConfiguration rendererConfiguration = playingPeriodHolder.trackSelectorResult.rendererConfigurations[rendererIndex]; TrackSelection newSelection = playingPeriodHolder.trackSelectorResult.selections.get( rendererIndex); Format[] formats = getFormats(newSelection); // The renderer needs enabling with its new track selection. boolean playing = playWhenReady && playbackInfo.playbackState == Player.STATE_READY; // Consider as joining only if the renderer was previously disabled. boolean joining = !wasRendererEnabled && playing; // Enable the renderer. renderer.enable(rendererConfiguration, formats, playingPeriodHolder.sampleStreams[rendererIndex], rendererPositionUs, joining, playingPeriodHolder.getRendererOffset()); mediaClock.onRendererEnabled(renderer); // Start the renderer if playing. if (playing) { renderer.start(); } } }
@Test public void disableRendererMediaClock_standaloneShouldBeSynced() throws ExoPlaybackException { MediaClockRenderer mediaClockRenderer = new MediaClockRenderer(); mediaClock.start(); mediaClock.onRendererEnabled(mediaClockRenderer); mediaClockRenderer.positionUs = TEST_POSITION_US; mediaClock.syncAndGetPositionUs(); mediaClock.onRendererDisabled(mediaClockRenderer); fakeClock.advanceTime(SLEEP_TIME_MS); assertThat(mediaClock.syncAndGetPositionUs()) .isEqualTo(TEST_POSITION_US + C.msToUs(SLEEP_TIME_MS)); assertClockIsRunning(); }