summaryrefslogtreecommitdiff
path: root/android/media/MediaPlayerBase.java
diff options
context:
space:
mode:
Diffstat (limited to 'android/media/MediaPlayerBase.java')
-rw-r--r--android/media/MediaPlayerBase.java317
1 files changed, 288 insertions, 29 deletions
diff --git a/android/media/MediaPlayerBase.java b/android/media/MediaPlayerBase.java
index d638a9f9..a4265525 100644
--- a/android/media/MediaPlayerBase.java
+++ b/android/media/MediaPlayerBase.java
@@ -16,57 +16,316 @@
package android.media;
-import android.media.MediaSession2.PlaylistParam;
-import android.media.session.PlaybackState;
-import android.os.Handler;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.List;
import java.util.concurrent.Executor;
/**
- * Base interfaces for all media players that want media session.
- *
* @hide
+ * Base class for all media players that want media session.
*/
-public abstract class MediaPlayerBase {
+public abstract class MediaPlayerBase implements AutoCloseable {
/**
- * Listens change in {@link PlaybackState2}.
+ * @hide
*/
- public interface PlaybackListener {
- /**
- * Called when {@link PlaybackState2} for this player is changed.
- */
- void onPlaybackChanged(PlaybackState2 state);
- }
+ @IntDef({
+ PLAYER_STATE_IDLE,
+ PLAYER_STATE_PAUSED,
+ PLAYER_STATE_PLAYING,
+ PLAYER_STATE_ERROR })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface PlayerState {}
+
+ /**
+ * @hide
+ */
+ @IntDef({
+ BUFFERING_STATE_UNKNOWN,
+ BUFFERING_STATE_BUFFERING_AND_PLAYABLE,
+ BUFFERING_STATE_BUFFERING_AND_STARVED,
+ BUFFERING_STATE_BUFFERING_COMPLETE })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface BuffState {}
+
+ /**
+ * State when the player is idle, and needs configuration to start playback.
+ */
+ public static final int PLAYER_STATE_IDLE = 0;
+
+ /**
+ * State when the player's playback is paused
+ */
+ public static final int PLAYER_STATE_PAUSED = 1;
+
+ /**
+ * State when the player's playback is ongoing
+ */
+ public static final int PLAYER_STATE_PLAYING = 2;
+
+ /**
+ * State when the player is in error state and cannot be recovered self.
+ */
+ public static final int PLAYER_STATE_ERROR = 3;
+
+ /**
+ * Buffering state is unknown.
+ */
+ public static final int BUFFERING_STATE_UNKNOWN = 0;
+
+ /**
+ * Buffering state indicating the player is buffering but enough has been buffered
+ * for this player to be able to play the content.
+ * See {@link #getBufferedPosition()} for how far is buffered already.
+ */
+ public static final int BUFFERING_STATE_BUFFERING_AND_PLAYABLE = 1;
+
+ /**
+ * Buffering state indicating the player is buffering, but the player is currently starved
+ * for data, and cannot play.
+ */
+ public static final int BUFFERING_STATE_BUFFERING_AND_STARVED = 2;
+
+ /**
+ * Buffering state indicating the player is done buffering, and the remainder of the content is
+ * available for playback.
+ */
+ public static final int BUFFERING_STATE_BUFFERING_COMPLETE = 3;
+ /**
+ * Starts or resumes playback.
+ */
public abstract void play();
+
+ /**
+ * Prepares the player for playback.
+ * See {@link PlayerEventCallback#onMediaPrepared(MediaPlayerBase, DataSourceDesc)} for being
+ * notified when the preparation phase completed. During this time, the player may allocate
+ * resources required to play, such as audio and video decoders.
+ */
public abstract void prepare();
+
+ /**
+ * Pauses playback.
+ */
public abstract void pause();
- public abstract void stop();
- public abstract void skipToPrevious();
+
+ /**
+ * Resets the MediaPlayerBase to its uninitialized state.
+ */
+ public abstract void reset();
+
+ /**
+ *
+ */
public abstract void skipToNext();
+
+ /**
+ * Moves the playback head to the specified position
+ * @param pos the new playback position expressed in ms.
+ */
public abstract void seekTo(long pos);
- public abstract void fastFoward();
- public abstract void rewind();
- public abstract PlaybackState2 getPlaybackState();
- public abstract AudioAttributes getAudioAttributes();
+ public static final long UNKNOWN_TIME = -1;
+
+ /**
+ * Gets the current playback head position.
+ * @return the current playback position in ms, or {@link #UNKNOWN_TIME} if unknown.
+ */
+ public long getCurrentPosition() { return UNKNOWN_TIME; }
- public abstract void setPlaylist(List<MediaItem2> item, PlaylistParam param);
- public abstract void setCurrentPlaylistItem(int index);
+ /**
+ * Returns the duration of the current data source, or {@link #UNKNOWN_TIME} if unknown.
+ * @return the duration in ms, or {@link #UNKNOWN_TIME}.
+ */
+ public long getDuration() { return UNKNOWN_TIME; }
/**
- * Add a {@link PlaybackListener} to be invoked when the playback state is changed.
- *
- * @param executor the Handler that will receive the listener
- * @param listener the listener that will be run
+ * Gets the buffered position of current playback, or {@link #UNKNOWN_TIME} if unknown.
+ * @return the buffered position in ms, or {@link #UNKNOWN_TIME}.
*/
- public abstract void addPlaybackListener(Executor executor, PlaybackListener listener);
+ public long getBufferedPosition() { return UNKNOWN_TIME; }
/**
- * Remove previously added {@link PlaybackListener}.
+ * Returns the current player state.
+ * See also {@link PlayerEventCallback#onPlayerStateChanged(MediaPlayerBase, int)} for
+ * notification of changes.
+ * @return the current player state
+ */
+ public abstract @PlayerState int getPlayerState();
+
+ /**
+ * Returns the current buffering state of the player.
+ * During buffering, see {@link #getBufferedPosition()} for the quantifying the amount already
+ * buffered.
+ * @return the buffering state.
+ */
+ public abstract @BuffState int getBufferingState();
+
+ /**
+ * Sets the {@link AudioAttributes} to be used during the playback of the media.
*
- * @param listener the listener to be removed
+ * @param attributes non-null <code>AudioAttributes</code>.
+ */
+ public abstract void setAudioAttributes(@NonNull AudioAttributes attributes);
+
+ /**
+ * Returns AudioAttributes that media player has.
+ */
+ public abstract @Nullable AudioAttributes getAudioAttributes();
+
+ /**
+ * Sets the data source to be played.
+ * @param dsd
+ */
+ public abstract void setDataSource(@NonNull DataSourceDesc dsd);
+
+ /**
+ * Sets the data source that will be played immediately after the current one is done playing.
+ * @param dsd
+ */
+ public abstract void setNextDataSource(@NonNull DataSourceDesc dsd);
+
+ /**
+ * Sets the list of data sources that will be sequentially played after the current one. Each
+ * data source is played immediately after the previous one is done playing.
+ * @param dsds
+ */
+ public abstract void setNextDataSources(@NonNull List<DataSourceDesc> dsds);
+
+ /**
+ * Returns the current data source.
+ * @return the current data source, or null if none is set, or none available to play.
+ */
+ public abstract @Nullable DataSourceDesc getCurrentDataSource();
+
+ /**
+ * Configures the player to loop on the current data source.
+ * @param loop true if the current data source is meant to loop.
+ */
+ public abstract void loopCurrent(boolean loop);
+
+ /**
+ * Sets the playback speed.
+ * A value of 1.0f is the default playback value.
+ * A negative value indicates reverse playback, check {@link #isReversePlaybackSupported()}
+ * before using negative values.<br>
+ * After changing the playback speed, it is recommended to query the actual speed supported
+ * by the player, see {@link #getPlaybackSpeed()}.
+ * @param speed
+ */
+ public abstract void setPlaybackSpeed(float speed);
+
+ /**
+ * Returns the actual playback speed to be used by the player when playing.
+ * Note that it may differ from the speed set in {@link #setPlaybackSpeed(float)}.
+ * @return the actual playback speed
+ */
+ public float getPlaybackSpeed() { return 1.0f; }
+
+ /**
+ * Indicates whether reverse playback is supported.
+ * Reverse playback is indicated by negative playback speeds, see
+ * {@link #setPlaybackSpeed(float)}.
+ * @return true if reverse playback is supported.
+ */
+ public boolean isReversePlaybackSupported() { return false; }
+
+ /**
+ * Sets the volume of the audio of the media to play, expressed as a linear multiplier
+ * on the audio samples.
+ * Note that this volume is specific to the player, and is separate from stream volume
+ * used across the platform.<br>
+ * A value of 0.0f indicates muting, a value of 1.0f is the nominal unattenuated and unamplified
+ * gain. See {@link #getMaxPlayerVolume()} for the volume range supported by this player.
+ * @param volume a value between 0.0f and {@link #getMaxPlayerVolume()}.
+ */
+ public abstract void setPlayerVolume(float volume);
+
+ /**
+ * Returns the current volume of this player to this player.
+ * Note that it does not take into account the associated stream volume.
+ * @return the player volume.
+ */
+ public abstract float getPlayerVolume();
+
+ /**
+ * @return the maximum volume that can be used in {@link #setPlayerVolume(float)}.
+ */
+ public float getMaxPlayerVolume() { return 1.0f; }
+
+ /**
+ * Adds a callback to be notified of events for this player.
+ * @param e the {@link Executor} to be used for the events.
+ * @param cb the callback to receive the events.
+ */
+ public abstract void registerPlayerEventCallback(@NonNull Executor e,
+ @NonNull PlayerEventCallback cb);
+
+ /**
+ * Removes a previously registered callback for player events
+ * @param cb the callback to remove
+ */
+ public abstract void unregisterPlayerEventCallback(@NonNull PlayerEventCallback cb);
+
+ /**
+ * A callback class to receive notifications for events on the media player.
+ * See {@link MediaPlayerBase#registerPlayerEventCallback(Executor, PlayerEventCallback)} to
+ * register this callback.
*/
- public abstract void removePlaybackListener(PlaybackListener listener);
+ public static abstract class PlayerEventCallback {
+ /**
+ * Called when the player's current data source has changed.
+ *
+ * @param mpb the player whose data source changed.
+ * @param dsd the new current data source. null, if no more data sources available.
+ */
+ public void onCurrentDataSourceChanged(@NonNull MediaPlayerBase mpb,
+ @Nullable DataSourceDesc dsd) { }
+ /**
+ * Called when the player is <i>prepared</i>, i.e. it is ready to play the content
+ * referenced by the given data source.
+ * @param mpb the player that is prepared.
+ * @param dsd the data source that the player is prepared to play.
+ */
+ public void onMediaPrepared(@NonNull MediaPlayerBase mpb, @NonNull DataSourceDesc dsd) { }
+
+ /**
+ * Called to indicate that the state of the player has changed.
+ * See {@link MediaPlayerBase#getPlayerState()} for polling the player state.
+ * @param mpb the player whose state has changed.
+ * @param state the new state of the player.
+ */
+ public void onPlayerStateChanged(@NonNull MediaPlayerBase mpb, @PlayerState int state) { }
+
+ /**
+ * Called to report buffering events for a data source.
+ * @param mpb the player that is buffering
+ * @param dsd the data source for which buffering is happening.
+ * @param state the new buffering state.
+ */
+ public void onBufferingStateChanged(@NonNull MediaPlayerBase mpb,
+ @NonNull DataSourceDesc dsd, @BuffState int state) { }
+
+ /**
+ * Called to indicate that the playback speed has changed.
+ * @param mpb the player that has changed the playback speed.
+ * @param speed the new playback speed.
+ */
+ public void onPlaybackSpeedChanged(@NonNull MediaPlayerBase mpb, float speed) { }
+
+ /**
+ * Called to indicate that {@link #seekTo(long)} is completed.
+ *
+ * @param mpb the player that has completed seeking.
+ * @param position the previous seeking request.
+ * @see #seekTo(long)
+ */
+ public void onSeekCompleted(@NonNull MediaPlayerBase mpb, long position) { }
+ }
+
}