1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.google.android.exoplayer2; 17 18 import android.content.Context; 19 import android.os.Looper; 20 import android.view.Surface; 21 import android.view.SurfaceHolder; 22 import android.view.SurfaceView; 23 import android.view.TextureView; 24 import androidx.annotation.IntDef; 25 import androidx.annotation.Nullable; 26 import com.google.android.exoplayer2.C.VideoScalingMode; 27 import com.google.android.exoplayer2.audio.AudioAttributes; 28 import com.google.android.exoplayer2.audio.AudioListener; 29 import com.google.android.exoplayer2.audio.AuxEffectInfo; 30 import com.google.android.exoplayer2.device.DeviceInfo; 31 import com.google.android.exoplayer2.device.DeviceListener; 32 import com.google.android.exoplayer2.metadata.MetadataOutput; 33 import com.google.android.exoplayer2.source.TrackGroupArray; 34 import com.google.android.exoplayer2.text.TextOutput; 35 import com.google.android.exoplayer2.trackselection.TrackSelectionArray; 36 import com.google.android.exoplayer2.util.Util; 37 import com.google.android.exoplayer2.video.VideoDecoderOutputBufferRenderer; 38 import com.google.android.exoplayer2.video.VideoFrameMetadataListener; 39 import com.google.android.exoplayer2.video.VideoListener; 40 import com.google.android.exoplayer2.video.spherical.CameraMotionListener; 41 import java.lang.annotation.Documented; 42 import java.lang.annotation.Retention; 43 import java.lang.annotation.RetentionPolicy; 44 import java.util.List; 45 46 /** 47 * A media player interface defining traditional high-level functionality, such as the ability to 48 * play, pause, seek and query properties of the currently playing media. 49 * 50 * <p>Some important properties of media players that implement this interface are: 51 * 52 * <ul> 53 * <li>They can provide a {@link Timeline} representing the structure of the media being played, 54 * which can be obtained by calling {@link #getCurrentTimeline()}. 55 * <li>They can provide a {@link TrackGroupArray} defining the currently available tracks, which 56 * can be obtained by calling {@link #getCurrentTrackGroups()}. 57 * <li>They contain a number of renderers, each of which is able to render tracks of a single type 58 * (e.g. audio, video or text). The number of renderers and their respective track types can 59 * be obtained by calling {@link #getRendererCount()} and {@link #getRendererType(int)}. 60 * <li>They can provide a {@link TrackSelectionArray} defining which of the currently available 61 * tracks are selected to be rendered by each renderer. This can be obtained by calling {@link 62 * #getCurrentTrackSelections()}}. 63 * </ul> 64 */ 65 public interface Player { 66 67 /** The audio component of a {@link Player}. */ 68 interface AudioComponent { 69 70 /** 71 * Adds a listener to receive audio events. 72 * 73 * @param listener The listener to register. 74 */ addAudioListener(AudioListener listener)75 void addAudioListener(AudioListener listener); 76 77 /** 78 * Removes a listener of audio events. 79 * 80 * @param listener The listener to unregister. 81 */ removeAudioListener(AudioListener listener)82 void removeAudioListener(AudioListener listener); 83 84 /** 85 * Sets the attributes for audio playback, used by the underlying audio track. If not set, the 86 * default audio attributes will be used. They are suitable for general media playback. 87 * 88 * <p>Setting the audio attributes during playback may introduce a short gap in audio output as 89 * the audio track is recreated. A new audio session id will also be generated. 90 * 91 * <p>If tunneling is enabled by the track selector, the specified audio attributes will be 92 * ignored, but they will take effect if audio is later played without tunneling. 93 * 94 * <p>If the device is running a build before platform API version 21, audio attributes cannot 95 * be set directly on the underlying audio track. In this case, the usage will be mapped onto an 96 * equivalent stream type using {@link Util#getStreamTypeForAudioUsage(int)}. 97 * 98 * @param audioAttributes The attributes to use for audio playback. 99 * @deprecated Use {@link AudioComponent#setAudioAttributes(AudioAttributes, boolean)}. 100 */ 101 @Deprecated setAudioAttributes(AudioAttributes audioAttributes)102 void setAudioAttributes(AudioAttributes audioAttributes); 103 104 /** 105 * Sets the attributes for audio playback, used by the underlying audio track. If not set, the 106 * default audio attributes will be used. They are suitable for general media playback. 107 * 108 * <p>Setting the audio attributes during playback may introduce a short gap in audio output as 109 * the audio track is recreated. A new audio session id will also be generated. 110 * 111 * <p>If tunneling is enabled by the track selector, the specified audio attributes will be 112 * ignored, but they will take effect if audio is later played without tunneling. 113 * 114 * <p>If the device is running a build before platform API version 21, audio attributes cannot 115 * be set directly on the underlying audio track. In this case, the usage will be mapped onto an 116 * equivalent stream type using {@link Util#getStreamTypeForAudioUsage(int)}. 117 * 118 * <p>If audio focus should be handled, the {@link AudioAttributes#usage} must be {@link 119 * C#USAGE_MEDIA} or {@link C#USAGE_GAME}. Other usages will throw an {@link 120 * IllegalArgumentException}. 121 * 122 * @param audioAttributes The attributes to use for audio playback. 123 * @param handleAudioFocus True if the player should handle audio focus, false otherwise. 124 */ setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus)125 void setAudioAttributes(AudioAttributes audioAttributes, boolean handleAudioFocus); 126 127 /** Returns the attributes for audio playback. */ getAudioAttributes()128 AudioAttributes getAudioAttributes(); 129 130 /** 131 * Sets the ID of the audio session to attach to the underlying {@link 132 * android.media.AudioTrack}. 133 * 134 * <p>The audio session ID can be generated using {@link C#generateAudioSessionIdV21(Context)} 135 * for API 21+. 136 * 137 * @param audioSessionId The audio session ID, or {@link C#AUDIO_SESSION_ID_UNSET} if it should 138 * be generated by the framework. 139 */ setAudioSessionId(int audioSessionId)140 void setAudioSessionId(int audioSessionId); 141 142 /** Returns the audio session identifier, or {@link C#AUDIO_SESSION_ID_UNSET} if not set. */ getAudioSessionId()143 int getAudioSessionId(); 144 145 /** Sets information on an auxiliary audio effect to attach to the underlying audio track. */ setAuxEffectInfo(AuxEffectInfo auxEffectInfo)146 void setAuxEffectInfo(AuxEffectInfo auxEffectInfo); 147 148 /** Detaches any previously attached auxiliary audio effect from the underlying audio track. */ clearAuxEffectInfo()149 void clearAuxEffectInfo(); 150 151 /** 152 * Sets the audio volume, with 0 being silence and 1 being unity gain. 153 * 154 * @param audioVolume The audio volume. 155 */ setVolume(float audioVolume)156 void setVolume(float audioVolume); 157 158 /** Returns the audio volume, with 0 being silence and 1 being unity gain. */ getVolume()159 float getVolume(); 160 161 /** 162 * Sets whether skipping silences in the audio stream is enabled. 163 * 164 * @param skipSilenceEnabled Whether skipping silences in the audio stream is enabled. 165 */ setSkipSilenceEnabled(boolean skipSilenceEnabled)166 void setSkipSilenceEnabled(boolean skipSilenceEnabled); 167 168 /** Returns whether skipping silences in the audio stream is enabled. */ getSkipSilenceEnabled()169 boolean getSkipSilenceEnabled(); 170 } 171 172 /** The video component of a {@link Player}. */ 173 interface VideoComponent { 174 175 /** 176 * Sets the {@link VideoScalingMode}. 177 * 178 * @param videoScalingMode The {@link VideoScalingMode}. 179 */ setVideoScalingMode(@ideoScalingMode int videoScalingMode)180 void setVideoScalingMode(@VideoScalingMode int videoScalingMode); 181 182 /** Returns the {@link VideoScalingMode}. */ 183 @VideoScalingMode getVideoScalingMode()184 int getVideoScalingMode(); 185 186 /** 187 * Adds a listener to receive video events. 188 * 189 * @param listener The listener to register. 190 */ addVideoListener(VideoListener listener)191 void addVideoListener(VideoListener listener); 192 193 /** 194 * Removes a listener of video events. 195 * 196 * @param listener The listener to unregister. 197 */ removeVideoListener(VideoListener listener)198 void removeVideoListener(VideoListener listener); 199 200 /** 201 * Sets a listener to receive video frame metadata events. 202 * 203 * <p>This method is intended to be called by the same component that sets the {@link Surface} 204 * onto which video will be rendered. If using ExoPlayer's standard UI components, this method 205 * should not be called directly from application code. 206 * 207 * @param listener The listener. 208 */ setVideoFrameMetadataListener(VideoFrameMetadataListener listener)209 void setVideoFrameMetadataListener(VideoFrameMetadataListener listener); 210 211 /** 212 * Clears the listener which receives video frame metadata events if it matches the one passed. 213 * Else does nothing. 214 * 215 * @param listener The listener to clear. 216 */ clearVideoFrameMetadataListener(VideoFrameMetadataListener listener)217 void clearVideoFrameMetadataListener(VideoFrameMetadataListener listener); 218 219 /** 220 * Sets a listener of camera motion events. 221 * 222 * @param listener The listener. 223 */ setCameraMotionListener(CameraMotionListener listener)224 void setCameraMotionListener(CameraMotionListener listener); 225 226 /** 227 * Clears the listener which receives camera motion events if it matches the one passed. Else 228 * does nothing. 229 * 230 * @param listener The listener to clear. 231 */ clearCameraMotionListener(CameraMotionListener listener)232 void clearCameraMotionListener(CameraMotionListener listener); 233 234 /** 235 * Clears any {@link Surface}, {@link SurfaceHolder}, {@link SurfaceView} or {@link TextureView} 236 * currently set on the player. 237 */ clearVideoSurface()238 void clearVideoSurface(); 239 240 /** 241 * Clears the {@link Surface} onto which video is being rendered if it matches the one passed. 242 * Else does nothing. 243 * 244 * @param surface The surface to clear. 245 */ clearVideoSurface(@ullable Surface surface)246 void clearVideoSurface(@Nullable Surface surface); 247 248 /** 249 * Sets the {@link Surface} onto which video will be rendered. The caller is responsible for 250 * tracking the lifecycle of the surface, and must clear the surface by calling {@code 251 * setVideoSurface(null)} if the surface is destroyed. 252 * 253 * <p>If the surface is held by a {@link SurfaceView}, {@link TextureView} or {@link 254 * SurfaceHolder} then it's recommended to use {@link #setVideoSurfaceView(SurfaceView)}, {@link 255 * #setVideoTextureView(TextureView)} or {@link #setVideoSurfaceHolder(SurfaceHolder)} rather 256 * than this method, since passing the holder allows the player to track the lifecycle of the 257 * surface automatically. 258 * 259 * @param surface The {@link Surface}. 260 */ setVideoSurface(@ullable Surface surface)261 void setVideoSurface(@Nullable Surface surface); 262 263 /** 264 * Sets the {@link SurfaceHolder} that holds the {@link Surface} onto which video will be 265 * rendered. The player will track the lifecycle of the surface automatically. 266 * 267 * @param surfaceHolder The surface holder. 268 */ setVideoSurfaceHolder(@ullable SurfaceHolder surfaceHolder)269 void setVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder); 270 271 /** 272 * Clears the {@link SurfaceHolder} that holds the {@link Surface} onto which video is being 273 * rendered if it matches the one passed. Else does nothing. 274 * 275 * @param surfaceHolder The surface holder to clear. 276 */ clearVideoSurfaceHolder(@ullable SurfaceHolder surfaceHolder)277 void clearVideoSurfaceHolder(@Nullable SurfaceHolder surfaceHolder); 278 279 /** 280 * Sets the {@link SurfaceView} onto which video will be rendered. The player will track the 281 * lifecycle of the surface automatically. 282 * 283 * @param surfaceView The surface view. 284 */ setVideoSurfaceView(@ullable SurfaceView surfaceView)285 void setVideoSurfaceView(@Nullable SurfaceView surfaceView); 286 287 /** 288 * Clears the {@link SurfaceView} onto which video is being rendered if it matches the one 289 * passed. Else does nothing. 290 * 291 * @param surfaceView The texture view to clear. 292 */ clearVideoSurfaceView(@ullable SurfaceView surfaceView)293 void clearVideoSurfaceView(@Nullable SurfaceView surfaceView); 294 295 /** 296 * Sets the {@link TextureView} onto which video will be rendered. The player will track the 297 * lifecycle of the surface automatically. 298 * 299 * @param textureView The texture view. 300 */ setVideoTextureView(@ullable TextureView textureView)301 void setVideoTextureView(@Nullable TextureView textureView); 302 303 /** 304 * Clears the {@link TextureView} onto which video is being rendered if it matches the one 305 * passed. Else does nothing. 306 * 307 * @param textureView The texture view to clear. 308 */ clearVideoTextureView(@ullable TextureView textureView)309 void clearVideoTextureView(@Nullable TextureView textureView); 310 311 /** 312 * Sets the video decoder output buffer renderer. This is intended for use only with extension 313 * renderers that accept {@link C#MSG_SET_VIDEO_DECODER_OUTPUT_BUFFER_RENDERER}. For most use 314 * cases, an output surface or view should be passed via {@link #setVideoSurface(Surface)} or 315 * {@link #setVideoSurfaceView(SurfaceView)} instead. 316 * 317 * @param videoDecoderOutputBufferRenderer The video decoder output buffer renderer, or {@code 318 * null} to clear the output buffer renderer. 319 */ setVideoDecoderOutputBufferRenderer( @ullable VideoDecoderOutputBufferRenderer videoDecoderOutputBufferRenderer)320 void setVideoDecoderOutputBufferRenderer( 321 @Nullable VideoDecoderOutputBufferRenderer videoDecoderOutputBufferRenderer); 322 323 /** Clears the video decoder output buffer renderer. */ clearVideoDecoderOutputBufferRenderer()324 void clearVideoDecoderOutputBufferRenderer(); 325 326 /** 327 * Clears the video decoder output buffer renderer if it matches the one passed. Else does 328 * nothing. 329 * 330 * @param videoDecoderOutputBufferRenderer The video decoder output buffer renderer to clear. 331 */ clearVideoDecoderOutputBufferRenderer( @ullable VideoDecoderOutputBufferRenderer videoDecoderOutputBufferRenderer)332 void clearVideoDecoderOutputBufferRenderer( 333 @Nullable VideoDecoderOutputBufferRenderer videoDecoderOutputBufferRenderer); 334 } 335 336 /** The text component of a {@link Player}. */ 337 interface TextComponent { 338 339 /** 340 * Registers an output to receive text events. 341 * 342 * @param listener The output to register. 343 */ addTextOutput(TextOutput listener)344 void addTextOutput(TextOutput listener); 345 346 /** 347 * Removes a text output. 348 * 349 * @param listener The output to remove. 350 */ removeTextOutput(TextOutput listener)351 void removeTextOutput(TextOutput listener); 352 } 353 354 /** The metadata component of a {@link Player}. */ 355 interface MetadataComponent { 356 357 /** 358 * Adds a {@link MetadataOutput} to receive metadata. 359 * 360 * @param output The output to register. 361 */ addMetadataOutput(MetadataOutput output)362 void addMetadataOutput(MetadataOutput output); 363 364 /** 365 * Removes a {@link MetadataOutput}. 366 * 367 * @param output The output to remove. 368 */ removeMetadataOutput(MetadataOutput output)369 void removeMetadataOutput(MetadataOutput output); 370 } 371 372 /** The device component of a {@link Player}. */ 373 // Note: It's mostly from the androidx.media.VolumeProviderCompat and 374 // androidx.media.MediaControllerCompat.PlaybackInfo. 375 interface DeviceComponent { 376 377 /** Adds a listener to receive device events. */ addDeviceListener(DeviceListener listener)378 void addDeviceListener(DeviceListener listener); 379 380 /** Removes a listener of device events. */ removeDeviceListener(DeviceListener listener)381 void removeDeviceListener(DeviceListener listener); 382 383 /** Gets the device information. */ getDeviceInfo()384 DeviceInfo getDeviceInfo(); 385 386 /** 387 * Gets the current volume of the device. 388 * 389 * <p>For devices with {@link DeviceInfo#PLAYBACK_TYPE_LOCAL local playback}, the volume 390 * returned by this method varies according to the current {@link C.StreamType stream type}. The 391 * stream type is determined by {@link AudioAttributes#usage} which can be converted to stream 392 * type with {@link Util#getStreamTypeForAudioUsage(int)}. The audio attributes can be set to 393 * the player by calling {@link AudioComponent#setAudioAttributes}. 394 * 395 * <p>For devices with {@link DeviceInfo#PLAYBACK_TYPE_REMOTE remote playback}, the volume of 396 * the remote device is returned. 397 */ getDeviceVolume()398 int getDeviceVolume(); 399 400 /** Gets whether the device is muted or not. */ isDeviceMuted()401 boolean isDeviceMuted(); 402 403 /** 404 * Sets the volume of the device. 405 * 406 * @param volume The volume to set. 407 */ setDeviceVolume(int volume)408 void setDeviceVolume(int volume); 409 410 /** Increases the volume of the device. */ increaseDeviceVolume()411 void increaseDeviceVolume(); 412 413 /** Decreases the volume of the device. */ decreaseDeviceVolume()414 void decreaseDeviceVolume(); 415 416 /** Sets the mute state of the device. */ setDeviceMuted(boolean muted)417 void setDeviceMuted(boolean muted); 418 } 419 420 /** 421 * Listener of changes in player state. All methods have no-op default implementations to allow 422 * selective overrides. 423 */ 424 interface EventListener { 425 426 /** 427 * Called when the timeline has been refreshed. 428 * 429 * <p>Note that if the timeline has changed then a position discontinuity may also have 430 * occurred. For example, the current period index may have changed as a result of periods being 431 * added or removed from the timeline. This will <em>not</em> be reported via a separate call to 432 * {@link #onPositionDiscontinuity(int)}. 433 * 434 * @param timeline The latest timeline. Never null, but may be empty. 435 * @param reason The {@link TimelineChangeReason} responsible for this timeline change. 436 */ 437 @SuppressWarnings("deprecation") onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason)438 default void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) { 439 Object manifest = null; 440 if (timeline.getWindowCount() == 1) { 441 // Legacy behavior was to report the manifest for single window timelines only. 442 Timeline.Window window = new Timeline.Window(); 443 manifest = timeline.getWindow(0, window).manifest; 444 } 445 // Call deprecated version. 446 onTimelineChanged(timeline, manifest, reason); 447 } 448 449 /** 450 * Called when the timeline and/or manifest has been refreshed. 451 * 452 * <p>Note that if the timeline has changed then a position discontinuity may also have 453 * occurred. For example, the current period index may have changed as a result of periods being 454 * added or removed from the timeline. This will <em>not</em> be reported via a separate call to 455 * {@link #onPositionDiscontinuity(int)}. 456 * 457 * @param timeline The latest timeline. Never null, but may be empty. 458 * @param manifest The latest manifest in case the timeline has a single window only. Always 459 * null if the timeline has more than a single window. 460 * @param reason The {@link TimelineChangeReason} responsible for this timeline change. 461 * @deprecated Use {@link #onTimelineChanged(Timeline, int)} instead. The manifest can be 462 * accessed by using {@link #getCurrentManifest()} or {@code timeline.getWindow(windowIndex, 463 * window).manifest} for a given window index. 464 */ 465 @Deprecated onTimelineChanged( Timeline timeline, @Nullable Object manifest, @TimelineChangeReason int reason)466 default void onTimelineChanged( 467 Timeline timeline, @Nullable Object manifest, @TimelineChangeReason int reason) {} 468 469 /** 470 * Called when the available or selected tracks change. 471 * 472 * @param trackGroups The available tracks. Never null, but may be of length zero. 473 * @param trackSelections The track selections for each renderer. Never null and always of 474 * length {@link #getRendererCount()}, but may contain null elements. 475 */ onTracksChanged( TrackGroupArray trackGroups, TrackSelectionArray trackSelections)476 default void onTracksChanged( 477 TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {} 478 479 /** 480 * Called when the player starts or stops loading the source. 481 * 482 * @param isLoading Whether the source is currently being loaded. 483 */ 484 @SuppressWarnings("deprecation") onIsLoadingChanged(boolean isLoading)485 default void onIsLoadingChanged(boolean isLoading) { 486 onLoadingChanged(isLoading); 487 } 488 489 /** @deprecated Use {@link #onIsLoadingChanged(boolean)} instead. */ 490 @Deprecated onLoadingChanged(boolean isLoading)491 default void onLoadingChanged(boolean isLoading) {} 492 493 /** 494 * @deprecated Use {@link #onPlaybackStateChanged(int)} and {@link 495 * #onPlayWhenReadyChanged(boolean, int)} instead. 496 */ 497 @Deprecated onPlayerStateChanged(boolean playWhenReady, @State int playbackState)498 default void onPlayerStateChanged(boolean playWhenReady, @State int playbackState) {} 499 500 /** 501 * Called when the value returned from {@link #getPlaybackState()} changes. 502 * 503 * @param state The new playback {@link State state}. 504 */ onPlaybackStateChanged(@tate int state)505 default void onPlaybackStateChanged(@State int state) {} 506 507 /** 508 * Called when the value returned from {@link #getPlayWhenReady()} changes. 509 * 510 * @param playWhenReady Whether playback will proceed when ready. 511 * @param reason The {@link PlayWhenReadyChangeReason reason} for the change. 512 */ onPlayWhenReadyChanged( boolean playWhenReady, @PlayWhenReadyChangeReason int reason)513 default void onPlayWhenReadyChanged( 514 boolean playWhenReady, @PlayWhenReadyChangeReason int reason) {} 515 516 /** 517 * Called when the value returned from {@link #getPlaybackSuppressionReason()} changes. 518 * 519 * @param playbackSuppressionReason The current {@link PlaybackSuppressionReason}. 520 */ onPlaybackSuppressionReasonChanged( @laybackSuppressionReason int playbackSuppressionReason)521 default void onPlaybackSuppressionReasonChanged( 522 @PlaybackSuppressionReason int playbackSuppressionReason) {} 523 524 /** 525 * Called when the value of {@link #isPlaying()} changes. 526 * 527 * @param isPlaying Whether the player is playing. 528 */ onIsPlayingChanged(boolean isPlaying)529 default void onIsPlayingChanged(boolean isPlaying) {} 530 531 /** 532 * Called when the value of {@link #getRepeatMode()} changes. 533 * 534 * @param repeatMode The {@link RepeatMode} used for playback. 535 */ onRepeatModeChanged(@epeatMode int repeatMode)536 default void onRepeatModeChanged(@RepeatMode int repeatMode) {} 537 538 /** 539 * Called when the value of {@link #getShuffleModeEnabled()} changes. 540 * 541 * @param shuffleModeEnabled Whether shuffling of windows is enabled. 542 */ onShuffleModeEnabledChanged(boolean shuffleModeEnabled)543 default void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {} 544 545 /** 546 * Called when an error occurs. The playback state will transition to {@link #STATE_IDLE} 547 * immediately after this method is called. The player instance can still be used, and {@link 548 * #release()} must still be called on the player should it no longer be required. 549 * 550 * @param error The error. 551 */ onPlayerError(ExoPlaybackException error)552 default void onPlayerError(ExoPlaybackException error) {} 553 554 /** 555 * Called when a position discontinuity occurs without a change to the timeline. A position 556 * discontinuity occurs when the current window or period index changes (as a result of playback 557 * transitioning from one period in the timeline to the next), or when the playback position 558 * jumps within the period currently being played (as a result of a seek being performed, or 559 * when the source introduces a discontinuity internally). 560 * 561 * <p>When a position discontinuity occurs as a result of a change to the timeline this method 562 * is <em>not</em> called. {@link #onTimelineChanged(Timeline, int)} is called in this case. 563 * 564 * @param reason The {@link DiscontinuityReason} responsible for the discontinuity. 565 */ onPositionDiscontinuity(@iscontinuityReason int reason)566 default void onPositionDiscontinuity(@DiscontinuityReason int reason) {} 567 568 /** 569 * @deprecated Use {@link #onPlaybackSpeedChanged(float)} and {@link 570 * AudioListener#onSkipSilenceEnabledChanged(boolean)} instead. 571 */ 572 @SuppressWarnings("deprecation") 573 @Deprecated onPlaybackParametersChanged(PlaybackParameters playbackParameters)574 default void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {} 575 576 /** 577 * Called when the current playback speed changes. The normal playback speed is 1. The speed may 578 * change due to a call to {@link #setPlaybackSpeed(float)}, or the player itself may change it 579 * (for example, if audio playback switches to passthrough mode, where speed adjustment is no 580 * longer possible). 581 */ onPlaybackSpeedChanged(float playbackSpeed)582 default void onPlaybackSpeedChanged(float playbackSpeed) {} 583 584 /** 585 * @deprecated Seeks are processed without delay. Listen to {@link 586 * #onPositionDiscontinuity(int)} with reason {@link #DISCONTINUITY_REASON_SEEK} instead. 587 */ 588 @Deprecated onSeekProcessed()589 default void onSeekProcessed() {} 590 } 591 592 /** 593 * @deprecated Use {@link EventListener} interface directly for selective overrides as all methods 594 * are implemented as no-op default methods. 595 */ 596 @Deprecated 597 abstract class DefaultEventListener implements EventListener { 598 599 @Override onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason)600 public void onTimelineChanged(Timeline timeline, @TimelineChangeReason int reason) { 601 Object manifest = null; 602 if (timeline.getWindowCount() == 1) { 603 // Legacy behavior was to report the manifest for single window timelines only. 604 Timeline.Window window = new Timeline.Window(); 605 manifest = timeline.getWindow(0, window).manifest; 606 } 607 // Call deprecated version. 608 onTimelineChanged(timeline, manifest, reason); 609 } 610 611 @Override 612 @SuppressWarnings("deprecation") onTimelineChanged( Timeline timeline, @Nullable Object manifest, @TimelineChangeReason int reason)613 public void onTimelineChanged( 614 Timeline timeline, @Nullable Object manifest, @TimelineChangeReason int reason) { 615 // Call deprecated version. Otherwise, do nothing. 616 onTimelineChanged(timeline, manifest); 617 } 618 619 /** @deprecated Use {@link EventListener#onTimelineChanged(Timeline, int)} instead. */ 620 @Deprecated onTimelineChanged(Timeline timeline, @Nullable Object manifest)621 public void onTimelineChanged(Timeline timeline, @Nullable Object manifest) { 622 // Do nothing. 623 } 624 } 625 626 /** 627 * Playback state. One of {@link #STATE_IDLE}, {@link #STATE_BUFFERING}, {@link #STATE_READY} or 628 * {@link #STATE_ENDED}. 629 */ 630 @Documented 631 @Retention(RetentionPolicy.SOURCE) 632 @IntDef({STATE_IDLE, STATE_BUFFERING, STATE_READY, STATE_ENDED}) 633 @interface State {} 634 /** 635 * The player does not have any media to play. 636 */ 637 int STATE_IDLE = 1; 638 /** 639 * The player is not able to immediately play from its current position. This state typically 640 * occurs when more data needs to be loaded. 641 */ 642 int STATE_BUFFERING = 2; 643 /** 644 * The player is able to immediately play from its current position. The player will be playing if 645 * {@link #getPlayWhenReady()} is true, and paused otherwise. 646 */ 647 int STATE_READY = 3; 648 /** 649 * The player has finished playing the media. 650 */ 651 int STATE_ENDED = 4; 652 653 /** 654 * Reasons for {@link #getPlayWhenReady() playWhenReady} changes. One of {@link 655 * #PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST}, {@link 656 * #PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS}, {@link 657 * #PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY}, {@link 658 * #PLAY_WHEN_READY_CHANGE_REASON_REMOTE} or {@link 659 * #PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM}. 660 */ 661 @Documented 662 @Retention(RetentionPolicy.SOURCE) 663 @IntDef({ 664 PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, 665 PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, 666 PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY, 667 PLAY_WHEN_READY_CHANGE_REASON_REMOTE, 668 PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM 669 }) 670 @interface PlayWhenReadyChangeReason {} 671 /** Playback has been started or paused by a call to {@link #setPlayWhenReady(boolean)}. */ 672 int PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST = 1; 673 /** Playback has been paused because of a loss of audio focus. */ 674 int PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS = 2; 675 /** Playback has been paused to avoid becoming noisy. */ 676 int PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY = 3; 677 /** Playback has been started or paused because of a remote change. */ 678 int PLAY_WHEN_READY_CHANGE_REASON_REMOTE = 4; 679 /** Playback has been paused at the end of a media item. */ 680 int PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM = 5; 681 682 /** 683 * Reason why playback is suppressed even though {@link #getPlayWhenReady()} is {@code true}. One 684 * of {@link #PLAYBACK_SUPPRESSION_REASON_NONE} or {@link 685 * #PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS}. 686 */ 687 @Documented 688 @Retention(RetentionPolicy.SOURCE) 689 @IntDef({ 690 PLAYBACK_SUPPRESSION_REASON_NONE, 691 PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS 692 }) 693 @interface PlaybackSuppressionReason {} 694 /** Playback is not suppressed. */ 695 int PLAYBACK_SUPPRESSION_REASON_NONE = 0; 696 /** Playback is suppressed due to transient audio focus loss. */ 697 int PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS = 1; 698 699 /** 700 * Repeat modes for playback. One of {@link #REPEAT_MODE_OFF}, {@link #REPEAT_MODE_ONE} or {@link 701 * #REPEAT_MODE_ALL}. 702 */ 703 @Documented 704 @Retention(RetentionPolicy.SOURCE) 705 @IntDef({REPEAT_MODE_OFF, REPEAT_MODE_ONE, REPEAT_MODE_ALL}) 706 @interface RepeatMode {} 707 /** 708 * Normal playback without repetition. 709 */ 710 int REPEAT_MODE_OFF = 0; 711 /** 712 * "Repeat One" mode to repeat the currently playing window infinitely. 713 */ 714 int REPEAT_MODE_ONE = 1; 715 /** 716 * "Repeat All" mode to repeat the entire timeline infinitely. 717 */ 718 int REPEAT_MODE_ALL = 2; 719 720 /** 721 * Reasons for position discontinuities. One of {@link #DISCONTINUITY_REASON_PERIOD_TRANSITION}, 722 * {@link #DISCONTINUITY_REASON_SEEK}, {@link #DISCONTINUITY_REASON_SEEK_ADJUSTMENT}, {@link 723 * #DISCONTINUITY_REASON_AD_INSERTION} or {@link #DISCONTINUITY_REASON_INTERNAL}. 724 */ 725 @Documented 726 @Retention(RetentionPolicy.SOURCE) 727 @IntDef({ 728 DISCONTINUITY_REASON_PERIOD_TRANSITION, 729 DISCONTINUITY_REASON_SEEK, 730 DISCONTINUITY_REASON_SEEK_ADJUSTMENT, 731 DISCONTINUITY_REASON_AD_INSERTION, 732 DISCONTINUITY_REASON_INTERNAL 733 }) 734 @interface DiscontinuityReason {} 735 /** 736 * Automatic playback transition from one period in the timeline to the next. The period index may 737 * be the same as it was before the discontinuity in case the current period is repeated. 738 */ 739 int DISCONTINUITY_REASON_PERIOD_TRANSITION = 0; 740 /** Seek within the current period or to another period. */ 741 int DISCONTINUITY_REASON_SEEK = 1; 742 /** 743 * Seek adjustment due to being unable to seek to the requested position or because the seek was 744 * permitted to be inexact. 745 */ 746 int DISCONTINUITY_REASON_SEEK_ADJUSTMENT = 2; 747 /** Discontinuity to or from an ad within one period in the timeline. */ 748 int DISCONTINUITY_REASON_AD_INSERTION = 3; 749 /** Discontinuity introduced internally by the source. */ 750 int DISCONTINUITY_REASON_INTERNAL = 4; 751 752 /** 753 * Reasons for timeline changes. One of {@link #TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED} or {@link 754 * #TIMELINE_CHANGE_REASON_SOURCE_UPDATE}. 755 */ 756 @Documented 757 @Retention(RetentionPolicy.SOURCE) 758 @IntDef({TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE}) 759 @interface TimelineChangeReason {} 760 /** Timeline changed as a result of a change of the playlist items or the order of the items. */ 761 int TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED = 0; 762 /** Timeline changed as a result of a dynamic update introduced by the played media. */ 763 int TIMELINE_CHANGE_REASON_SOURCE_UPDATE = 1; 764 765 /** The default playback speed. */ 766 float DEFAULT_PLAYBACK_SPEED = 1.0f; 767 768 /** Returns the component of this player for audio output, or null if audio is not supported. */ 769 @Nullable getAudioComponent()770 AudioComponent getAudioComponent(); 771 772 /** Returns the component of this player for video output, or null if video is not supported. */ 773 @Nullable getVideoComponent()774 VideoComponent getVideoComponent(); 775 776 /** Returns the component of this player for text output, or null if text is not supported. */ 777 @Nullable getTextComponent()778 TextComponent getTextComponent(); 779 780 /** 781 * Returns the component of this player for metadata output, or null if metadata is not supported. 782 */ 783 @Nullable getMetadataComponent()784 MetadataComponent getMetadataComponent(); 785 786 /** Returns the component of this player for playback device, or null if it's not supported. */ 787 @Nullable getDeviceComponent()788 DeviceComponent getDeviceComponent(); 789 790 /** 791 * Returns the {@link Looper} associated with the application thread that's used to access the 792 * player and on which player events are received. 793 */ getApplicationLooper()794 Looper getApplicationLooper(); 795 796 /** 797 * Register a listener to receive events from the player. The listener's methods will be called on 798 * the thread that was used to construct the player. However, if the thread used to construct the 799 * player does not have a {@link Looper}, then the listener will be called on the main thread. 800 * 801 * @param listener The listener to register. 802 */ addListener(EventListener listener)803 void addListener(EventListener listener); 804 805 /** 806 * Unregister a listener. The listener will no longer receive events from the player. 807 * 808 * @param listener The listener to unregister. 809 */ removeListener(EventListener listener)810 void removeListener(EventListener listener); 811 812 /** 813 * Clears the playlist, adds the specified {@link MediaItem MediaItems} and resets the position to 814 * the default position. 815 * 816 * @param mediaItems The new {@link MediaItem MediaItems}. 817 */ setMediaItems(List<MediaItem> mediaItems)818 void setMediaItems(List<MediaItem> mediaItems); 819 820 /** 821 * Clears the playlist and adds the specified {@link MediaItem MediaItems}. 822 * 823 * @param mediaItems The new {@link MediaItem MediaItems}. 824 * @param resetPosition Whether the playback position should be reset to the default position in 825 * the first {@link Timeline.Window}. If false, playback will start from the position defined 826 * by {@link #getCurrentWindowIndex()} and {@link #getCurrentPosition()}. 827 */ setMediaItems(List<MediaItem> mediaItems, boolean resetPosition)828 void setMediaItems(List<MediaItem> mediaItems, boolean resetPosition); 829 830 /** 831 * Clears the playlist and adds the specified {@link MediaItem MediaItems}. 832 * 833 * @param mediaItems The new {@link MediaItem MediaItems}. 834 * @param startWindowIndex The window index to start playback from. If {@link C#INDEX_UNSET} is 835 * passed, the current position is not reset. 836 * @param startPositionMs The position in milliseconds to start playback from. If {@link 837 * C#TIME_UNSET} is passed, the default position of the given window is used. In any case, if 838 * {@code startWindowIndex} is set to {@link C#INDEX_UNSET}, this parameter is ignored and the 839 * position is not reset at all. 840 */ setMediaItems(List<MediaItem> mediaItems, int startWindowIndex, long startPositionMs)841 void setMediaItems(List<MediaItem> mediaItems, int startWindowIndex, long startPositionMs); 842 843 /** 844 * Clears the playlist, adds the specified {@link MediaItem} and resets the position to the 845 * default position. 846 * 847 * @param mediaItem The new {@link MediaItem}. 848 */ setMediaItem(MediaItem mediaItem)849 void setMediaItem(MediaItem mediaItem); 850 851 /** 852 * Clears the playlist and adds the specified {@link MediaItem}. 853 * 854 * @param mediaItem The new {@link MediaItem}. 855 * @param startPositionMs The position in milliseconds to start playback from. 856 */ setMediaItem(MediaItem mediaItem, long startPositionMs)857 void setMediaItem(MediaItem mediaItem, long startPositionMs); 858 859 /** 860 * Clears the playlist and adds the specified {@link MediaItem}. 861 * 862 * @param mediaItem The new {@link MediaItem}. 863 * @param resetPosition Whether the playback position should be reset to the default position. If 864 * false, playback will start from the position defined by {@link #getCurrentWindowIndex()} 865 * and {@link #getCurrentPosition()}. 866 */ setMediaItem(MediaItem mediaItem, boolean resetPosition)867 void setMediaItem(MediaItem mediaItem, boolean resetPosition); 868 869 /** 870 * Adds a media item to the end of the playlist. 871 * 872 * @param mediaItem The {@link MediaItem} to add. 873 */ addMediaItem(MediaItem mediaItem)874 void addMediaItem(MediaItem mediaItem); 875 876 /** 877 * Adds a media item at the given index of the playlist. 878 * 879 * @param index The index at which to add the item. 880 * @param mediaItem The {@link MediaItem} to add. 881 */ addMediaItem(int index, MediaItem mediaItem)882 void addMediaItem(int index, MediaItem mediaItem); 883 884 /** 885 * Adds a list of media items to the end of the playlist. 886 * 887 * @param mediaItems The {@link MediaItem MediaItems} to add. 888 */ addMediaItems(List<MediaItem> mediaItems)889 void addMediaItems(List<MediaItem> mediaItems); 890 891 /** 892 * Adds a list of media items at the given index of the playlist. 893 * 894 * @param index The index at which to add the media items. 895 * @param mediaItems The {@link MediaItem MediaItems} to add. 896 */ addMediaItems(int index, List<MediaItem> mediaItems)897 void addMediaItems(int index, List<MediaItem> mediaItems); 898 899 /** 900 * Moves the media item at the current index to the new index. 901 * 902 * @param currentIndex The current index of the media item to move. 903 * @param newIndex The new index of the media item. If the new index is larger than the size of 904 * the playlist the item is moved to the end of the playlist. 905 */ moveMediaItem(int currentIndex, int newIndex)906 void moveMediaItem(int currentIndex, int newIndex); 907 908 /** 909 * Moves the media item range to the new index. 910 * 911 * @param fromIndex The start of the range to move. 912 * @param toIndex The first item not to be included in the range (exclusive). 913 * @param newIndex The new index of the first media item of the range. If the new index is larger 914 * than the size of the remaining playlist after removing the range, the range is moved to the 915 * end of the playlist. 916 */ moveMediaItems(int fromIndex, int toIndex, int newIndex)917 void moveMediaItems(int fromIndex, int toIndex, int newIndex); 918 919 /** 920 * Removes the media item at the given index of the playlist. 921 * 922 * @param index The index at which to remove the media item. 923 */ removeMediaItem(int index)924 void removeMediaItem(int index); 925 926 /** 927 * Removes a range of media items from the playlist. 928 * 929 * @param fromIndex The index at which to start removing media items. 930 * @param toIndex The index of the first item to be kept (exclusive). 931 */ removeMediaItems(int fromIndex, int toIndex)932 void removeMediaItems(int fromIndex, int toIndex); 933 934 /** Clears the playlist. */ clearMediaItems()935 void clearMediaItems(); 936 937 /** Prepares the player. */ prepare()938 void prepare(); 939 940 /** 941 * Returns the current {@link State playback state} of the player. 942 * 943 * @return The current {@link State playback state}. 944 */ 945 @State getPlaybackState()946 int getPlaybackState(); 947 948 /** 949 * Returns the reason why playback is suppressed even though {@link #getPlayWhenReady()} is {@code 950 * true}, or {@link #PLAYBACK_SUPPRESSION_REASON_NONE} if playback is not suppressed. 951 * 952 * @return The current {@link PlaybackSuppressionReason playback suppression reason}. 953 */ 954 @PlaybackSuppressionReason getPlaybackSuppressionReason()955 int getPlaybackSuppressionReason(); 956 957 /** 958 * Returns whether the player is playing, i.e. {@link #getContentPosition()} is advancing. 959 * 960 * <p>If {@code false}, then at least one of the following is true: 961 * 962 * <ul> 963 * <li>The {@link #getPlaybackState() playback state} is not {@link #STATE_READY ready}. 964 * <li>There is no {@link #getPlayWhenReady() intention to play}. 965 * <li>Playback is {@link #getPlaybackSuppressionReason() suppressed for other reasons}. 966 * </ul> 967 * 968 * @return Whether the player is playing. 969 */ isPlaying()970 boolean isPlaying(); 971 972 /** 973 * Returns the error that caused playback to fail. This is the same error that will have been 974 * reported via {@link Player.EventListener#onPlayerError(ExoPlaybackException)} at the time of 975 * failure. It can be queried using this method until {@code stop(true)} is called or the player 976 * is re-prepared. 977 * 978 * <p>Note that this method will always return {@code null} if {@link #getPlaybackState()} is not 979 * {@link #STATE_IDLE}. 980 * 981 * @return The error, or {@code null}. 982 */ 983 @Nullable getPlayerError()984 ExoPlaybackException getPlayerError(); 985 986 /** @deprecated Use {@link #getPlayerError()} instead. */ 987 @Deprecated 988 @Nullable getPlaybackError()989 ExoPlaybackException getPlaybackError(); 990 991 /** 992 * Resumes playback as soon as {@link #getPlaybackState()} == {@link #STATE_READY}. Equivalent to 993 * {@code setPlayWhenReady(true)}. 994 */ play()995 void play(); 996 997 /** Pauses playback. Equivalent to {@code setPlayWhenReady(false)}. */ pause()998 void pause(); 999 1000 /** 1001 * Sets whether playback should proceed when {@link #getPlaybackState()} == {@link #STATE_READY}. 1002 * 1003 * <p>If the player is already in the ready state then this method pauses and resumes playback. 1004 * 1005 * @param playWhenReady Whether playback should proceed when ready. 1006 */ setPlayWhenReady(boolean playWhenReady)1007 void setPlayWhenReady(boolean playWhenReady); 1008 1009 /** 1010 * Whether playback will proceed when {@link #getPlaybackState()} == {@link #STATE_READY}. 1011 * 1012 * @return Whether playback will proceed when ready. 1013 */ getPlayWhenReady()1014 boolean getPlayWhenReady(); 1015 1016 /** 1017 * Sets the {@link RepeatMode} to be used for playback. 1018 * 1019 * @param repeatMode The repeat mode. 1020 */ setRepeatMode(@epeatMode int repeatMode)1021 void setRepeatMode(@RepeatMode int repeatMode); 1022 1023 /** 1024 * Returns the current {@link RepeatMode} used for playback. 1025 * 1026 * @return The current repeat mode. 1027 */ getRepeatMode()1028 @RepeatMode int getRepeatMode(); 1029 1030 /** 1031 * Sets whether shuffling of windows is enabled. 1032 * 1033 * @param shuffleModeEnabled Whether shuffling is enabled. 1034 */ setShuffleModeEnabled(boolean shuffleModeEnabled)1035 void setShuffleModeEnabled(boolean shuffleModeEnabled); 1036 1037 /** 1038 * Returns whether shuffling of windows is enabled. 1039 */ getShuffleModeEnabled()1040 boolean getShuffleModeEnabled(); 1041 1042 /** 1043 * Whether the player is currently loading the source. 1044 * 1045 * @return Whether the player is currently loading the source. 1046 */ isLoading()1047 boolean isLoading(); 1048 1049 /** 1050 * Seeks to the default position associated with the current window. The position can depend on 1051 * the type of media being played. For live streams it will typically be the live edge of the 1052 * window. For other streams it will typically be the start of the window. 1053 */ seekToDefaultPosition()1054 void seekToDefaultPosition(); 1055 1056 /** 1057 * Seeks to the default position associated with the specified window. The position can depend on 1058 * the type of media being played. For live streams it will typically be the live edge of the 1059 * window. For other streams it will typically be the start of the window. 1060 * 1061 * @param windowIndex The index of the window whose associated default position should be seeked 1062 * to. 1063 */ seekToDefaultPosition(int windowIndex)1064 void seekToDefaultPosition(int windowIndex); 1065 1066 /** 1067 * Seeks to a position specified in milliseconds in the current window. 1068 * 1069 * @param positionMs The seek position in the current window, or {@link C#TIME_UNSET} to seek to 1070 * the window's default position. 1071 */ seekTo(long positionMs)1072 void seekTo(long positionMs); 1073 1074 /** 1075 * Seeks to a position specified in milliseconds in the specified window. 1076 * 1077 * @param windowIndex The index of the window. 1078 * @param positionMs The seek position in the specified window, or {@link C#TIME_UNSET} to seek to 1079 * the window's default position. 1080 * @throws IllegalSeekPositionException If the player has a non-empty timeline and the provided 1081 * {@code windowIndex} is not within the bounds of the current timeline. 1082 */ seekTo(int windowIndex, long positionMs)1083 void seekTo(int windowIndex, long positionMs); 1084 1085 /** 1086 * Returns whether a previous window exists, which may depend on the current repeat mode and 1087 * whether shuffle mode is enabled. 1088 */ hasPrevious()1089 boolean hasPrevious(); 1090 1091 /** 1092 * Seeks to the default position of the previous window in the timeline, which may depend on the 1093 * current repeat mode and whether shuffle mode is enabled. Does nothing if {@link #hasPrevious()} 1094 * is {@code false}. 1095 */ previous()1096 void previous(); 1097 1098 /** 1099 * Returns whether a next window exists, which may depend on the current repeat mode and whether 1100 * shuffle mode is enabled. 1101 */ hasNext()1102 boolean hasNext(); 1103 1104 /** 1105 * Seeks to the default position of the next window in the timeline, which may depend on the 1106 * current repeat mode and whether shuffle mode is enabled. Does nothing if {@link #hasNext()} is 1107 * {@code false}. 1108 */ next()1109 void next(); 1110 1111 /** 1112 * @deprecated Use {@link #setPlaybackSpeed(float)} or {@link 1113 * AudioComponent#setSkipSilenceEnabled(boolean)} instead. 1114 */ 1115 @SuppressWarnings("deprecation") 1116 @Deprecated setPlaybackParameters(@ullable PlaybackParameters playbackParameters)1117 void setPlaybackParameters(@Nullable PlaybackParameters playbackParameters); 1118 1119 /** 1120 * @deprecated Use {@link #getPlaybackSpeed()} or {@link AudioComponent#getSkipSilenceEnabled()} 1121 * instead. 1122 */ 1123 @SuppressWarnings("deprecation") 1124 @Deprecated getPlaybackParameters()1125 PlaybackParameters getPlaybackParameters(); 1126 1127 /** 1128 * Attempts to set the playback speed. 1129 * 1130 * <p>Playback speed changes may cause the player to buffer. {@link 1131 * EventListener#onPlaybackSpeedChanged(float)} will be called whenever the currently active 1132 * playback speed change. 1133 * 1134 * @param playbackSpeed The playback speed. 1135 */ setPlaybackSpeed(float playbackSpeed)1136 void setPlaybackSpeed(float playbackSpeed); 1137 1138 /** 1139 * Returns the currently active playback speed. 1140 * 1141 * @see EventListener#onPlaybackSpeedChanged(float) 1142 */ getPlaybackSpeed()1143 float getPlaybackSpeed(); 1144 1145 /** 1146 * Stops playback without resetting the player. Use {@link #pause()} rather than this method if 1147 * the intention is to pause playback. 1148 * 1149 * <p>Calling this method will cause the playback state to transition to {@link #STATE_IDLE}. The 1150 * player instance can still be used, and {@link #release()} must still be called on the player if 1151 * it's no longer required. 1152 * 1153 * <p>Calling this method does not reset the playback position. 1154 */ stop()1155 void stop(); 1156 1157 /** 1158 * Stops playback and optionally resets the player. Use {@link #pause()} rather than this method 1159 * if the intention is to pause playback. 1160 * 1161 * <p>Calling this method will cause the playback state to transition to {@link #STATE_IDLE}. The 1162 * player instance can still be used, and {@link #release()} must still be called on the player if 1163 * it's no longer required. 1164 * 1165 * @param reset Whether the player should be reset. 1166 */ stop(boolean reset)1167 void stop(boolean reset); 1168 1169 /** 1170 * Releases the player. This method must be called when the player is no longer required. The 1171 * player must not be used after calling this method. 1172 */ release()1173 void release(); 1174 1175 /** 1176 * Returns the number of renderers. 1177 */ getRendererCount()1178 int getRendererCount(); 1179 1180 /** 1181 * Returns the track type that the renderer at a given index handles. 1182 * 1183 * @see Renderer#getTrackType() 1184 * @param index The index of the renderer. 1185 * @return One of the {@code TRACK_TYPE_*} constants defined in {@link C}. 1186 */ getRendererType(int index)1187 int getRendererType(int index); 1188 1189 /** 1190 * Returns the available track groups. 1191 */ getCurrentTrackGroups()1192 TrackGroupArray getCurrentTrackGroups(); 1193 1194 /** 1195 * Returns the current track selections for each renderer. 1196 */ getCurrentTrackSelections()1197 TrackSelectionArray getCurrentTrackSelections(); 1198 1199 /** 1200 * Returns the current manifest. The type depends on the type of media being played. May be null. 1201 */ getCurrentManifest()1202 @Nullable Object getCurrentManifest(); 1203 1204 /** 1205 * Returns the current {@link Timeline}. Never null, but may be empty. 1206 */ getCurrentTimeline()1207 Timeline getCurrentTimeline(); 1208 1209 /** 1210 * Returns the index of the period currently being played. 1211 */ getCurrentPeriodIndex()1212 int getCurrentPeriodIndex(); 1213 1214 /** 1215 * Returns the index of the window currently being played. 1216 */ getCurrentWindowIndex()1217 int getCurrentWindowIndex(); 1218 1219 /** 1220 * Returns the index of the next timeline window to be played, which may depend on the current 1221 * repeat mode and whether shuffle mode is enabled. Returns {@link C#INDEX_UNSET} if the window 1222 * currently being played is the last window. 1223 */ getNextWindowIndex()1224 int getNextWindowIndex(); 1225 1226 /** 1227 * Returns the index of the previous timeline window to be played, which may depend on the current 1228 * repeat mode and whether shuffle mode is enabled. Returns {@link C#INDEX_UNSET} if the window 1229 * currently being played is the first window. 1230 */ getPreviousWindowIndex()1231 int getPreviousWindowIndex(); 1232 1233 /** 1234 * Returns the tag of the currently playing window in the timeline. May be null if no tag is set 1235 * or the timeline is not yet available. 1236 */ getCurrentTag()1237 @Nullable Object getCurrentTag(); 1238 1239 /** 1240 * Returns the duration of the current content window or ad in milliseconds, or {@link 1241 * C#TIME_UNSET} if the duration is not known. 1242 */ getDuration()1243 long getDuration(); 1244 1245 /** Returns the playback position in the current content window or ad, in milliseconds. */ getCurrentPosition()1246 long getCurrentPosition(); 1247 1248 /** 1249 * Returns an estimate of the position in the current content window or ad up to which data is 1250 * buffered, in milliseconds. 1251 */ getBufferedPosition()1252 long getBufferedPosition(); 1253 1254 /** 1255 * Returns an estimate of the percentage in the current content window or ad up to which data is 1256 * buffered, or 0 if no estimate is available. 1257 */ getBufferedPercentage()1258 int getBufferedPercentage(); 1259 1260 /** 1261 * Returns an estimate of the total buffered duration from the current position, in milliseconds. 1262 * This includes pre-buffered data for subsequent ads and windows. 1263 */ getTotalBufferedDuration()1264 long getTotalBufferedDuration(); 1265 1266 /** 1267 * Returns whether the current window is dynamic, or {@code false} if the {@link Timeline} is 1268 * empty. 1269 * 1270 * @see Timeline.Window#isDynamic 1271 */ isCurrentWindowDynamic()1272 boolean isCurrentWindowDynamic(); 1273 1274 /** 1275 * Returns whether the current window is live, or {@code false} if the {@link Timeline} is empty. 1276 * 1277 * @see Timeline.Window#isLive 1278 */ isCurrentWindowLive()1279 boolean isCurrentWindowLive(); 1280 1281 /** 1282 * Returns the offset of the current playback position from the live edge in milliseconds, or 1283 * {@link C#TIME_UNSET} if the current window {@link #isCurrentWindowLive() isn't live} or the 1284 * offset is unknown. 1285 * 1286 * <p>The offset is calculated as {@code currentTime - playbackPosition}, so should usually be 1287 * positive. 1288 * 1289 * <p>Note that this offset may rely on an accurate local time, so this method may return an 1290 * incorrect value if the difference between system clock and server clock is unknown. 1291 */ getCurrentLiveOffset()1292 long getCurrentLiveOffset(); 1293 1294 /** 1295 * Returns whether the current window is seekable, or {@code false} if the {@link Timeline} is 1296 * empty. 1297 * 1298 * @see Timeline.Window#isSeekable 1299 */ isCurrentWindowSeekable()1300 boolean isCurrentWindowSeekable(); 1301 1302 /** 1303 * Returns whether the player is currently playing an ad. 1304 */ isPlayingAd()1305 boolean isPlayingAd(); 1306 1307 /** 1308 * If {@link #isPlayingAd()} returns true, returns the index of the ad group in the period 1309 * currently being played. Returns {@link C#INDEX_UNSET} otherwise. 1310 */ getCurrentAdGroupIndex()1311 int getCurrentAdGroupIndex(); 1312 1313 /** 1314 * If {@link #isPlayingAd()} returns true, returns the index of the ad in its ad group. Returns 1315 * {@link C#INDEX_UNSET} otherwise. 1316 */ getCurrentAdIndexInAdGroup()1317 int getCurrentAdIndexInAdGroup(); 1318 1319 /** 1320 * If {@link #isPlayingAd()} returns {@code true}, returns the duration of the current content 1321 * window in milliseconds, or {@link C#TIME_UNSET} if the duration is not known. If there is no ad 1322 * playing, the returned duration is the same as that returned by {@link #getDuration()}. 1323 */ getContentDuration()1324 long getContentDuration(); 1325 1326 /** 1327 * If {@link #isPlayingAd()} returns {@code true}, returns the content position that will be 1328 * played once all ads in the ad group have finished playing, in milliseconds. If there is no ad 1329 * playing, the returned position is the same as that returned by {@link #getCurrentPosition()}. 1330 */ getContentPosition()1331 long getContentPosition(); 1332 1333 /** 1334 * If {@link #isPlayingAd()} returns {@code true}, returns an estimate of the content position in 1335 * the current content window up to which data is buffered, in milliseconds. If there is no ad 1336 * playing, the returned position is the same as that returned by {@link #getBufferedPosition()}. 1337 */ getContentBufferedPosition()1338 long getContentBufferedPosition(); 1339 } 1340