16cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim/* 26cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * Copyright 2018 The Android Open Source Project 36cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * 46cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * Licensed under the Apache License, Version 2.0 (the "License"); 56cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * you may not use this file except in compliance with the License. 66cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * You may obtain a copy of the License at 76cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * 86cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * http://www.apache.org/licenses/LICENSE-2.0 96cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * 106cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * Unless required by applicable law or agreed to in writing, software 116cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * distributed under the License is distributed on an "AS IS" BASIS, 126cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * See the License for the specific language governing permissions and 146cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * limitations under the License. 156cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 166cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 176cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimpackage android.media; 186cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 196cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimimport android.annotation.IntDef; 206cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimimport android.annotation.NonNull; 216cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimimport android.annotation.Nullable; 226cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 236cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimimport java.lang.annotation.Retention; 246cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimimport java.lang.annotation.RetentionPolicy; 256cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimimport java.util.List; 266cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimimport java.util.concurrent.Executor; 276cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 286cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim/** 293a582e73c115e693bab8cb6f213d275704b9c5d7Jean-Michel Trivi * @hide 306cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * Base class for all media players that want media session. 316cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 326cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kimpublic abstract class MediaPlayerBase implements AutoCloseable { 336cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 346cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * @hide 356cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 36c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi @IntDef({ 37c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi PLAYER_STATE_IDLE, 38c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi PLAYER_STATE_PAUSED, 39c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi PLAYER_STATE_PLAYING, 40c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi PLAYER_STATE_ERROR }) 416cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim @Retention(RetentionPolicy.SOURCE) 42c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public @interface PlayerState {} 43c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi 44c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi /** 45c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @hide 46c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi */ 47c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi @IntDef({ 48c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi BUFFERING_STATE_UNKNOWN, 49c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi BUFFERING_STATE_BUFFERING_AND_PLAYABLE, 50c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi BUFFERING_STATE_BUFFERING_AND_STARVED, 51c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi BUFFERING_STATE_BUFFERING_COMPLETE }) 52c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi @Retention(RetentionPolicy.SOURCE) 53c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public @interface BuffState {} 546cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 556cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 566cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * State when the player is idle, and needs configuration to start playback. 576cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 58c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public static final int PLAYER_STATE_IDLE = 0; 596cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 606cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 616cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * State when the player's playback is paused 626cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 63c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public static final int PLAYER_STATE_PAUSED = 1; 646cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 656cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 666cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * State when the player's playback is ongoing 676cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 68c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public static final int PLAYER_STATE_PLAYING = 2; 696cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 706cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 716cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * State when the player is in error state and cannot be recovered self. 726cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 73c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public static final int PLAYER_STATE_ERROR = 3; 746cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 756cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 76c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Buffering state is unknown. 776cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 78c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public static final int BUFFERING_STATE_UNKNOWN = 0; 796cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 806cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 81c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Buffering state indicating the player is buffering but enough has been buffered 82c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * for this player to be able to play the content. 83c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * See {@link #getBufferedPosition()} for how far is buffered already. 846cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 85c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public static final int BUFFERING_STATE_BUFFERING_AND_PLAYABLE = 1; 866cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 876cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 88c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Buffering state indicating the player is buffering, but the player is currently starved 89c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * for data, and cannot play. 906cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 91c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public static final int BUFFERING_STATE_BUFFERING_AND_STARVED = 2; 926cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 936cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 94c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Buffering state indicating the player is done buffering, and the remainder of the content is 95c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * available for playback. 966cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 97c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public static final int BUFFERING_STATE_BUFFERING_COMPLETE = 3; 986cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 996cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 100c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Starts or resumes playback. 1016cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 102c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void play(); 1036cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1046cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 105c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Prepares the player for playback. 106c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * See {@link PlayerEventCallback#onMediaPrepared(MediaPlayerBase, DataSourceDesc)} for being 107c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * notified when the preparation phase completed. During this time, the player may allocate 108c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * resources required to play, such as audio and video decoders. 1096cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 110c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void prepare(); 1116cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1126cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 113c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Pauses playback. 1146cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 115c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void pause(); 1166cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 117c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi /** 118de2bbb322bbeec45dfed89c3cc17ae0cc07c73b1Jaewan Kim * Resets the MediaPlayerBase to its uninitialized state. 119de2bbb322bbeec45dfed89c3cc17ae0cc07c73b1Jaewan Kim */ 120de2bbb322bbeec45dfed89c3cc17ae0cc07c73b1Jaewan Kim public abstract void reset(); 121de2bbb322bbeec45dfed89c3cc17ae0cc07c73b1Jaewan Kim 122de2bbb322bbeec45dfed89c3cc17ae0cc07c73b1Jaewan Kim /** 123c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * 124c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi */ 125c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void skipToNext(); 1266cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1276cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 128c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Moves the playback head to the specified position 129c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param pos the new playback position expressed in ms. 1306cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 131c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void seekTo(long pos); 132c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi 133c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public static final long UNKNOWN_TIME = -1; 1346cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1356cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 13678e4f84f045d2452f59c6ebea81493bd9894aa1bHyundo Moon * Gets the current playback head position. 13778e4f84f045d2452f59c6ebea81493bd9894aa1bHyundo Moon * @return the current playback position in ms, or {@link #UNKNOWN_TIME} if unknown. 1386cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 139c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public long getCurrentPosition() { return UNKNOWN_TIME; } 1406cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1416cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 142c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Returns the duration of the current data source, or {@link #UNKNOWN_TIME} if unknown. 143c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @return the duration in ms, or {@link #UNKNOWN_TIME}. 1446cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 145c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public long getDuration() { return UNKNOWN_TIME; } 1466cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1476cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 14878e4f84f045d2452f59c6ebea81493bd9894aa1bHyundo Moon * Gets the buffered position of current playback, or {@link #UNKNOWN_TIME} if unknown. 14978e4f84f045d2452f59c6ebea81493bd9894aa1bHyundo Moon * @return the buffered position in ms, or {@link #UNKNOWN_TIME}. 1506cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 151c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public long getBufferedPosition() { return UNKNOWN_TIME; } 1526cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1536cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 154c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Returns the current player state. 155c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * See also {@link PlayerEventCallback#onPlayerStateChanged(MediaPlayerBase, int)} for 156c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * notification of changes. 157c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @return the current player state 1586cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 159c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract @PlayerState int getPlayerState(); 1606cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1616cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 162c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Returns the current buffering state of the player. 163c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * During buffering, see {@link #getBufferedPosition()} for the quantifying the amount already 164c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * buffered. 165c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @return the buffering state. 1666cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 167c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract @BuffState int getBufferingState(); 1686cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1696cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 170c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Sets the {@link AudioAttributes} to be used during the playback of the media. 171c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * 172c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param attributes non-null <code>AudioAttributes</code>. 1736cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 174c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void setAudioAttributes(@NonNull AudioAttributes attributes); 1756cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1766cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 177c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Returns AudioAttributes that media player has. 1786cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 179c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract @Nullable AudioAttributes getAudioAttributes(); 1806cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1816cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 182c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Sets the data source to be played. 183c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param dsd 1846cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 185c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void setDataSource(@NonNull DataSourceDesc dsd); 1866cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1876cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 188c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Sets the data source that will be played immediately after the current one is done playing. 189c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param dsd 1906cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 191c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void setNextDataSource(@NonNull DataSourceDesc dsd); 1926cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 1936cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 194c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Sets the list of data sources that will be sequentially played after the current one. Each 195c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * data source is played immediately after the previous one is done playing. 196c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param dsds 1976cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 198c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void setNextDataSources(@NonNull List<DataSourceDesc> dsds); 1996cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2006cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 201c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Returns the current data source. 202c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @return the current data source, or null if none is set, or none available to play. 2036cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 204c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract @Nullable DataSourceDesc getCurrentDataSource(); 2056cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2066cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 207c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Configures the player to loop on the current data source. 208c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param loop true if the current data source is meant to loop. 2096cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 210c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void loopCurrent(boolean loop); 2116cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2126cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 213c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Sets the playback speed. 214c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * A value of 1.0f is the default playback value. 215c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * A negative value indicates reverse playback, check {@link #isReversePlaybackSupported()} 216c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * before using negative values.<br> 217c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * After changing the playback speed, it is recommended to query the actual speed supported 218c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * by the player, see {@link #getPlaybackSpeed()}. 219c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param speed 2206cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 221c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void setPlaybackSpeed(float speed); 2226cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2236cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 224c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Returns the actual playback speed to be used by the player when playing. 225c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Note that it may differ from the speed set in {@link #setPlaybackSpeed(float)}. 226c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @return the actual playback speed 2276cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 228c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public float getPlaybackSpeed() { return 1.0f; } 2296cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2306cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 231c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Indicates whether reverse playback is supported. 232c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Reverse playback is indicated by negative playback speeds, see 233c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * {@link #setPlaybackSpeed(float)}. 234c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @return true if reverse playback is supported. 2356cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 236c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public boolean isReversePlaybackSupported() { return false; } 2376cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2386cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 239c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Sets the volume of the audio of the media to play, expressed as a linear multiplier 240c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * on the audio samples. 241c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Note that this volume is specific to the player, and is separate from stream volume 242c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * used across the platform.<br> 243c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * A value of 0.0f indicates muting, a value of 1.0f is the nominal unattenuated and unamplified 244c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * gain. See {@link #getMaxPlayerVolume()} for the volume range supported by this player. 245c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param volume a value between 0.0f and {@link #getMaxPlayerVolume()}. 2466cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 2471789cc7f8221fd1f682fa08a1aeb1e37c2315887Wei Jia public abstract void setPlayerVolume(float volume); 2486cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2496cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 250c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Returns the current volume of this player to this player. 251c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Note that it does not take into account the associated stream volume. 252c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @return the player volume. 2536cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 254c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract float getPlayerVolume(); 2556cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2566cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 2571789cc7f8221fd1f682fa08a1aeb1e37c2315887Wei Jia * @return the maximum volume that can be used in {@link #setPlayerVolume(float)}. 2586cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 259c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public float getMaxPlayerVolume() { return 1.0f; } 2606cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2616cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 262c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Adds a callback to be notified of events for this player. 263c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param e the {@link Executor} to be used for the events. 264c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param cb the callback to receive the events. 2656cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 266c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void registerPlayerEventCallback(@NonNull Executor e, 267c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi @NonNull PlayerEventCallback cb); 2686cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2696cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 270c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Removes a previously registered callback for player events 271c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param cb the callback to remove 2726cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 273c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public abstract void unregisterPlayerEventCallback(@NonNull PlayerEventCallback cb); 2746cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim 2756cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 276c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * A callback class to receive notifications for events on the media player. 277c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * See {@link MediaPlayerBase#registerPlayerEventCallback(Executor, PlayerEventCallback)} to 278c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * register this callback. 2796cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 280c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public static abstract class PlayerEventCallback { 281c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi /** 282273130dc9af6e3c3fc00513a1ba454dd1d8a5cf0Jaewan Kim * Called when the player's current data source has changed. 2835d7e96b1d15bea5dbbe5890bc6fb1c28a90b5eb4Sungsoo Lim * 284c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param mpb the player whose data source changed. 2855d7e96b1d15bea5dbbe5890bc6fb1c28a90b5eb4Sungsoo Lim * @param dsd the new current data source. null, if no more data sources available. 286c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi */ 287c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public void onCurrentDataSourceChanged(@NonNull MediaPlayerBase mpb, 288c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi @Nullable DataSourceDesc dsd) { } 289c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi /** 290c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Called when the player is <i>prepared</i>, i.e. it is ready to play the content 291c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * referenced by the given data source. 292c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param mpb the player that is prepared. 293c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param dsd the data source that the player is prepared to play. 294c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi */ 295c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public void onMediaPrepared(@NonNull MediaPlayerBase mpb, @NonNull DataSourceDesc dsd) { } 296c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi 297c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi /** 298c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Called to indicate that the state of the player has changed. 299c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * See {@link MediaPlayerBase#getPlayerState()} for polling the player state. 300c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param mpb the player whose state has changed. 301c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param state the new state of the player. 302c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi */ 303c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public void onPlayerStateChanged(@NonNull MediaPlayerBase mpb, @PlayerState int state) { } 304c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi 305c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi /** 306c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * Called to report buffering events for a data source. 307c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param mpb the player that is buffering 308c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param dsd the data source for which buffering is happening. 309c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi * @param state the new buffering state. 310c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi */ 311c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi public void onBufferingStateChanged(@NonNull MediaPlayerBase mpb, 312c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi @NonNull DataSourceDesc dsd, @BuffState int state) { } 3136fac589d48339fa4ba46dfc3233470cd8645a5a6Jaewan Kim 3146fac589d48339fa4ba46dfc3233470cd8645a5a6Jaewan Kim /** 3156fac589d48339fa4ba46dfc3233470cd8645a5a6Jaewan Kim * Called to indicate that the playback speed has changed. 316598265bd862b61ede23e50ce00749eb66ade7c87Jaewan Kim * @param mpb the player that has changed the playback speed. 3176fac589d48339fa4ba46dfc3233470cd8645a5a6Jaewan Kim * @param speed the new playback speed. 3186fac589d48339fa4ba46dfc3233470cd8645a5a6Jaewan Kim */ 3196fac589d48339fa4ba46dfc3233470cd8645a5a6Jaewan Kim public void onPlaybackSpeedChanged(@NonNull MediaPlayerBase mpb, float speed) { } 320598265bd862b61ede23e50ce00749eb66ade7c87Jaewan Kim 321598265bd862b61ede23e50ce00749eb66ade7c87Jaewan Kim /** 322598265bd862b61ede23e50ce00749eb66ade7c87Jaewan Kim * Called to indicate that {@link #seekTo(long)} is completed. 323598265bd862b61ede23e50ce00749eb66ade7c87Jaewan Kim * 324598265bd862b61ede23e50ce00749eb66ade7c87Jaewan Kim * @param mpb the player that has completed seeking. 325598265bd862b61ede23e50ce00749eb66ade7c87Jaewan Kim * @param position the previous seeking request. 326598265bd862b61ede23e50ce00749eb66ade7c87Jaewan Kim * @see #seekTo(long) 327598265bd862b61ede23e50ce00749eb66ade7c87Jaewan Kim */ 328598265bd862b61ede23e50ce00749eb66ade7c87Jaewan Kim public void onSeekCompleted(@NonNull MediaPlayerBase mpb, long position) { } 329c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi } 330c3a438f65b24d88059fdc2d5e2432a4cb70e2cfbJean-Michel Trivi 3316cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim} 332