package novoda.audio.service;
import java.io.IOException;
import java.sql.Time;
import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class AudioStreamService extends Service implements OnCompletionListener, OnPreparedListener, OnBufferingUpdateListener, OnErrorListener {
public AudioStreamService() {
mAudioSrvState = NOT_PLAYING;
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
public IBinder onBind(Intent intent) {
return mSrvBinding;
}
public void onPrepared(MediaPlayer mp) {
mAudioSrvState = PLAYING;
Time duration = new Time(mp.getDuration());
Log.v(TAG, "Prepared mediaplayer for track of duration =["+duration+"]");
mMediaPlayer.start();
}
public void onBufferingUpdate(MediaPlayer mp, int percent) {
Log.v(TAG, "Buffered additional=["+percent+"%]");
mAudioSrvState = BUFFERING;
}
public void onCompletion(MediaPlayer mp) {
Log.i(TAG, "Completed playback");
mMediaPlayer.stop();
mMediaPlayer.reset();
mAudioSrvState = NOT_PLAYING;
}
public boolean onError(MediaPlayer mp, int what, int extra) {
switch(what){
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
Log.e(TAG, "unknown media error what=["+what+"] extra=["+extra+"]");
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
Log.e(TAG, "Streaming source Server died what=["+what+"] extra=["+extra+"]");
break;
default:
Log.e(TAG, "Default Problems what=["+ what +"] extra=["+extra+"]");
}
return false;
}
public void play(String audioTrackURL) {
Log.i(TAG, "Playing track at URL=["+audioTrackURL+"]");
mAudioTrackURL = audioTrackURL;
if (mAudioSrvState == NOT_PLAYING) {
try {
mMediaPlayer.setDataSource(mAudioTrackURL);
mMediaPlayer.prepareAsync();
} catch (IllegalArgumentException e) {
Log.e(TAG, "AudioTrackUrl seems to be incorrectly formatted",e);
} catch (IllegalStateException e) {
Log.e(TAG, "MediaPlayer is in an illegal state",e);
} catch (IOException e) {
Log.e(TAG, "MediaPlayer failed due to exception",e);
}
}
}
public void stop() {
Log.i(TAG, "Call to stop streaming audio");
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) {
Log.i(TAG, "media player was playing and is now Stopping");
mMediaPlayer.stop();
mMediaPlayer.reset();
mAudioSrvState = NOT_PLAYING;
}
}
}
public String getFileName() {
return null;
}
public long getPosition() {
return 0;
}
public int getState() {
return mAudioSrvState;
}
private final IAudioStreamService.Stub mSrvBinding = new IAudioStreamService.Stub() {
public void play(String url) throws RemoteException {
AudioStreamService.this.play(url);
}
public String getFileName() {
return AudioStreamService.this.getFileName();
}
public long getCurrPlayingPosition() {
return AudioStreamService.this.getPosition();
}
public int getState() {
return AudioStreamService.this.getState();
}
public void stop() {
AudioStreamService.this.stop();
}
};
public static final int NOT_PLAYING = 0;
public static final int PLAYING = 1;
public static final int BUFFERING = 2;
public static final String TAG = "[AudioStreamService]";
private int mAudioSrvState;
private MediaPlayer mMediaPlayer;
private String mAudioTrackURL;
}