package com.itap.voiceemoticon.media; import java.util.HashMap; import android.content.Context; import android.content.Intent; 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.Bundle; import android.util.Log; import com.itap.voiceemoticon.VEApplication; import com.itap.voiceemoticon.activity.HttpGetProxy; public class MusicPlayer implements OnBufferingUpdateListener, OnPreparedListener, OnCompletionListener, OnErrorListener { public static final String BROCAST_NAME = "com.itap.voiceemotion.music.player"; // brocast type has two types public static final String KEY_BROCAST_TYPE = "msgType"; public static final int BROCAST_TYPE_PLAY_STATE = 0; public static final int BROCAST_TYPE_BUFFER_UPDATE = 1; public static final String KEY_STATE = "state"; public static final int STATE_INVALID = 5; public static final int STATE_PLAY_START = 1; public static final int STATE_PLAY_COMPLETE = 2; public static final int STATE_PLAY_STOP = 7; public static final int STATE_PLAY_PREPARING = 9; public static final String KEY_STATE_DATA = "data"; public static final String KEY_PERCENT = "percent"; private Context mContext; private MediaPlayer mPlayer = null; private int mState = STATE_INVALID; private String mCurUrl = "hack url"; private String mTitle = ""; private HttpGetProxy mHttpGetProxy = null; private static final int LOCAL_PORT = 9091; public MusicPlayer(Context context) { mContext = context; mPlayer = new MediaPlayer(); mPlayer.setOnPreparedListener(this); mPlayer.setOnBufferingUpdateListener(this); mPlayer.setOnCompletionListener(this); mPlayer.setOnErrorListener(this); mHttpGetProxy = new HttpGetProxy(LOCAL_PORT); mHttpGetProxy.start(); } private HashMap<String, MusicData> mMusicMap = new HashMap<String, MusicData>(); public void resume() { playMusic(mCurUrl, mTitle); } public void playMusic(final String urlParam, final String title) { final String url = urlParam; final MusicPlayer me = this; new Thread(new Runnable() { @Override public void run() { try { if (url == null) { Log.e(VEApplication.TAG, "playMusic can't be null"); return; } mHttpGetProxy.printStateInfo(); if (!mCurUrl.equals(url) || mState == STATE_INVALID || mState == STATE_PLAY_COMPLETE) { mHttpGetProxy.closeOpenedStreams(); mPlayer.stop(); mPlayer.reset(); // mHttpGetProxy.getProxyUrl(url) mPlayer.setDataSource(url); mPlayer.prepareAsync(); mState = STATE_PLAY_PREPARING; } else { if (mState == STATE_PLAY_STOP) { mPlayer.prepareAsync(); mState = STATE_PLAY_PREPARING; } } mCurUrl = url; mTitle = title; } catch (Exception e) { mState = STATE_INVALID; e.printStackTrace(); } me.sendPlayStateBrocast(); } }).start(); } public void stopMusic() { if (mPlayer == null) { return; } mPlayer.stop(); mState = STATE_PLAY_STOP; this.sendPlayStateBrocast(); } public void exit() { if (mPlayer != null) mPlayer.release(); } public void sendBufferUpdateBrocast(int percent) { if (mContext != null) { Intent intent = new Intent(BROCAST_NAME); intent.putExtra(KEY_BROCAST_TYPE, BROCAST_TYPE_BUFFER_UPDATE); intent.putExtra(KEY_PERCENT, percent); mContext.sendBroadcast(intent); } } public void sendPlayStateBrocast() { if (mContext != null) { if (mState == STATE_INVALID) { return; } Intent intent = new Intent(BROCAST_NAME); MusicData musicData = new MusicData(); musicData.musicPath = mCurUrl; musicData.musicName = mTitle; mMusicMap.put(mCurUrl, musicData); intent.putExtra(KEY_STATE, mState); intent.putExtra(KEY_STATE_DATA, musicData); intent.putExtra(KEY_BROCAST_TYPE, BROCAST_TYPE_PLAY_STATE); mContext.sendBroadcast(intent); } } @Override public void onPrepared(MediaPlayer mp) { if (mState == STATE_PLAY_COMPLETE) { return; } mp.start(); mState = STATE_PLAY_START; this.sendPlayStateBrocast(); } @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { if (mPlayer.isPlaying()) { Log.d(VEApplication.TAG, "onBufferingUpdate percent = " + percent); sendBufferUpdateBrocast(percent); } } @Override public void onCompletion(MediaPlayer mp) { mState = STATE_PLAY_COMPLETE; sendPlayStateBrocast(); } @Override public boolean onError(MediaPlayer mp, int what, int extra) { Log.e(VEApplication.TAG, "onError mState = " + mState); mState = STATE_INVALID; this.sendPlayStateBrocast(); return false; } public int getCurrentPostion() { if (mState != STATE_INVALID && mState != STATE_PLAY_COMPLETE) { return mPlayer.getCurrentPosition(); } return 0; } public int getDuration() { if (mState != STATE_INVALID && mState != STATE_PLAY_COMPLETE && mState != STATE_PLAY_PREPARING) { return mPlayer.getDuration(); } return 0; } public boolean isPlaying() { if (mPlayer != null) { return mPlayer.isPlaying() || mState == STATE_PLAY_PREPARING; } return false; } public void seek(int percent) { if (mPlayer != null && mPlayer.isPlaying()) { long duration = getDuration(); long seekMillSecond = (duration * percent) / 100; mPlayer.seekTo((int)seekMillSecond); } } public void destory() { mHttpGetProxy.stop(); } }