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