Added INITIALIZED state

This commit is contained in:
daniel oeh 2012-10-11 11:12:44 +02:00
parent 6f4cf5fbdc
commit 59e5a9ddb8
2 changed files with 68 additions and 24 deletions

View File

@ -82,6 +82,8 @@ public class PlaybackService extends Service {
*/
public static final String EXTRA_START_WHEN_PREPARED = "extra.de.danoeh.antennapod.service.startWhenPrepared";
public static final String EXTRA_PREPARE_IMMEDIATELY = "extra.de.danoeh.antennapod.service.prepareImmediately";
public static final String ACTION_PLAYER_STATUS_CHANGED = "action.de.danoeh.antennapod.service.playerStatusChanged";
public static final String ACTION_PLAYER_NOTIFICATION = "action.de.danoeh.antennapod.service.playerNotification";
@ -129,6 +131,9 @@ public class PlaybackService extends Service {
private Feed feed;
/** True if media should be streamed (Extracted from Intent Extra) . */
private boolean shouldStream;
/** True if service should prepare playback after it has been initialized */
private boolean prepareImmediately;
private boolean startWhenPrepared;
private FeedManager manager;
private PlayerStatus status;
@ -265,13 +270,8 @@ public class PlaybackService extends Service {
Log.w(TAG, "SchedEx rejected submission of new task");
}
});
player = new MediaPlayer();
player.setOnPreparedListener(preparedListener);
player.setOnCompletionListener(completionListener);
player.setOnSeekCompleteListener(onSeekCompleteListener);
player.setOnErrorListener(onErrorListener);
player.setOnBufferingUpdateListener(onBufferingUpdateListener);
player.setOnInfoListener(onInfoListener);
player = createMediaPlayer();
mediaButtonReceiver = new ComponentName(getPackageName(),
MediaButtonReceiver.class.getName());
audioManager.registerMediaButtonEventReceiver(mediaButtonReceiver);
@ -286,6 +286,22 @@ public class PlaybackService extends Service {
}
private MediaPlayer createMediaPlayer() {
return createMediaPlayer(new MediaPlayer());
}
private MediaPlayer createMediaPlayer(MediaPlayer mp) {
if (mp != null) {
mp.setOnPreparedListener(preparedListener);
mp.setOnCompletionListener(completionListener);
mp.setOnSeekCompleteListener(onSeekCompleteListener);
mp.setOnErrorListener(onErrorListener);
mp.setOnBufferingUpdateListener(onBufferingUpdateListener);
mp.setOnInfoListener(onInfoListener);
}
return mp;
}
@SuppressLint("NewApi")
@Override
public void onDestroy() {
@ -390,7 +406,8 @@ public class PlaybackService extends Service {
shouldStream = playbackType;
startWhenPrepared = intent.getBooleanExtra(
EXTRA_START_WHEN_PREPARED, false);
setupMediaplayer();
prepareImmediately = intent.getBooleanExtra(EXTRA_PREPARE_IMMEDIATELY, false);
initMediaplayer();
} else {
Log.e(TAG, "Media is null");
@ -480,15 +497,9 @@ public class PlaybackService extends Service {
player.setDisplay(null);
player.reset();
player.release();
player = new MediaPlayer();
player.setOnPreparedListener(preparedListener);
player.setOnCompletionListener(completionListener);
player.setOnSeekCompleteListener(onSeekCompleteListener);
player.setOnErrorListener(onErrorListener);
player.setOnBufferingUpdateListener(onBufferingUpdateListener);
player.setOnInfoListener(onInfoListener);
player = createMediaPlayer();
status = PlayerStatus.STOPPED;
setupMediaplayer();
initMediaplayer();
}
public void notifyVideoSurfaceAbandoned() {
@ -496,7 +507,7 @@ public class PlaybackService extends Service {
}
/** Called after service has extracted the media it is supposed to play. */
private void setupMediaplayer() {
private void initMediaplayer() {
if (AppConfig.DEBUG)
Log.d(TAG, "Setting up media player");
try {
@ -507,12 +518,14 @@ public class PlaybackService extends Service {
playingVideo = false;
if (shouldStream) {
player.setDataSource(media.getDownload_url());
setStatus(PlayerStatus.PREPARING);
player.prepareAsync();
} else if (media.getFile_url() != null) {
player.setDataSource(media.getFile_url());
}
if (prepareImmediately) {
setStatus(PlayerStatus.PREPARING);
player.prepare();
player.prepareAsync();
} else {
setStatus(PlayerStatus.INITIALIZED);
}
} else if (mediaType == MediaType.VIDEO) {
if (AppConfig.DEBUG)
@ -656,12 +669,14 @@ public class PlaybackService extends Service {
media.setPosition(0);
media.setPlaybackCompletionDate(new Date());
manager.markItemRead(PlaybackService.this, media.getItem(), true);
FeedItem nextItem = manager.getQueueSuccessorOfItem(media.getItem());
FeedItem nextItem = manager
.getQueueSuccessorOfItem(media.getItem());
boolean isInQueue = manager.isInQueue(media.getItem());
if (isInQueue) {
manager.removeQueueItem(PlaybackService.this, media.getItem());
}
manager.addItemToPlaybackHistory(PlaybackService.this, media.getItem());
manager.addItemToPlaybackHistory(PlaybackService.this,
media.getItem());
manager.setFeedMedia(PlaybackService.this, media);
long autoDeleteMediaId = media.getId();
@ -769,6 +784,27 @@ public class PlaybackService extends Service {
stopSelf();
}
/**
* Prepared media player for playback if the service is in the INITALIZED
* state.
*/
public void prepare() {
if (status == PlayerStatus.INITIALIZED) {
if (AppConfig.DEBUG)
Log.d(TAG, "Preparing media player");
setStatus(PlayerStatus.PREPARING);
player.prepareAsync();
}
}
/** Resets the media player and moves into INITIALIZED state. */
public void reinit() {
player.reset();
player = createMediaPlayer(player);
prepareImmediately = false;
initMediaplayer();
}
@SuppressLint("NewApi")
public void play() {
if (status == PlayerStatus.PAUSED || status == PlayerStatus.PREPARED

View File

@ -1,5 +1,13 @@
package de.danoeh.antennapod.service;
public enum PlayerStatus {
ERROR, PREPARING, PAUSED, PLAYING, STOPPED, PREPARED, SEEKING, AWAITING_VIDEO_SURFACE
ERROR,
PREPARING,
PAUSED,
PLAYING,
STOPPED,
PREPARED,
SEEKING,
AWAITING_VIDEO_SURFACE, // player has been initialized and the media type to be played is a video.
INITIALIZED // playback service was started, data source of media player was set.
}