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

View File

@ -1,5 +1,13 @@
package de.danoeh.antennapod.service; package de.danoeh.antennapod.service;
public enum PlayerStatus { 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.
} }