package com.tadpolemusic.media;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import com.tadpolemusic.TMLog;
import com.tadpolemusic.media.http.HttpGetProxy;
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.os.Bundle;
import android.util.Log;
public class MusicPlayer implements OnCompletionListener, OnErrorListener, OnBufferingUpdateListener {
public static final String BROCAST_NAME = "com.tadpolemusic.media.brocast";
private final static String TAG = "MusicPlayer";
private MediaPlayer mMediaPlayer; // ���������
private List<MusicData> mMusicFileList; // �����ļ��б�
private int mCurPlayIndex; // ��ǰ��������
private int mPlayState; // ������״̬
private int mPLayMode; // �����ģʽ
private Random mRandom;
private Context mContext;
private HttpGetProxy mHttpGetProxy;
private int mCurBufferPercent = 100;
private int mLastBufferPercent = 100;
private void defaultParam() {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setOnBufferingUpdateListener(this);
mMusicFileList = new ArrayList<MusicData>();
mCurPlayIndex = -1;
mPlayState = MusicPlayState.MPS_NOFILE;
mPLayMode = MusicPlayMode.MPM_LIST_LOOP_PLAY;
mHttpGetProxy = new HttpGetProxy(9090);
mHttpGetProxy.start();
}
public MusicPlayer(Context context) {
mContext = context;
defaultParam();
mRandom = new Random();
mRandom.setSeed(System.currentTimeMillis());
}
public void exit() {
Log.d(TAG, "exit");
mMediaPlayer.reset();
mMusicFileList.clear();
mCurPlayIndex = -1;
mPlayState = MusicPlayState.MPS_NOFILE;
}
/**
* @param playListID
* unique id .
* @param FileList
*/
public void refreshMusicList(String playListID, List<MusicData> FileList) {
if (FileList == null) {
mMusicFileList.clear();
mPlayState = MusicPlayState.MPS_NOFILE;
mCurPlayIndex = -1;
mMediaPlayer.reset();
sendPlayStateBrocast();
return;
}
mMusicFileList = FileList;
if (mMusicFileList.size() == 0) {
mPlayState = MusicPlayState.MPS_NOFILE;
mCurPlayIndex = -1;
return;
}
curPlayListID = playListID;
mPlayState = MusicPlayState.MPS_HAS_FILE;
switch (mPlayState) {
case MusicPlayState.MPS_NOFILE:
// prepare(0);
break;
case MusicPlayState.MPS_INVALID:
// prepare(0);
break;
case MusicPlayState.MPS_PREPARE:
// prepare(0);
break;
case MusicPlayState.MPS_PLAYING:
break;
case MusicPlayState.MPS_PAUSE:
break;
default:
break;
}
}
public List<MusicData> getFileList() {
Log.i(TAG, "getFileList mMusicFileList.size = " + mMusicFileList.size());
return mMusicFileList;
}
public int getPlayState() {
return mPlayState;
}
public boolean replay() {
if (mPlayState == MusicPlayState.MPS_NOFILE || mPlayState == MusicPlayState.MPS_INVALID) {
return false;
}
mMediaPlayer.start();
mPlayState = MusicPlayState.MPS_PLAYING;
sendPlayStateBrocast();
return true;
}
public boolean play(int position) {
if (mPlayState == MusicPlayState.MPS_NOFILE) {
return false;
}
if (mCurPlayIndex == position) {
if (mMediaPlayer.isPlaying() == false) {
mMediaPlayer.start();
mPlayState = MusicPlayState.MPS_PLAYING;
sendPlayStateBrocast();
}
return true;
}
mCurPlayIndex = position;
if (prepare(mCurPlayIndex) == false) {
return false;
}
return replay();
}
public boolean pause() {
if (mPlayState != MusicPlayState.MPS_PLAYING) {
return false;
}
mMediaPlayer.pause();
mPlayState = MusicPlayState.MPS_PAUSE;
sendPlayStateBrocast();
return true;
}
public boolean stop() {
if (mPlayState != MusicPlayState.MPS_PLAYING && mPlayState != MusicPlayState.MPS_PAUSE) {
return false;
}
return prepare(mCurPlayIndex);
}
public boolean playNext() {
if (mPlayState == MusicPlayState.MPS_NOFILE) {
return false;
}
mCurPlayIndex++;
mCurPlayIndex = reviceIndex(mCurPlayIndex);
if (prepare(mCurPlayIndex) == false) {
return false;
}
return replay();
}
public boolean playPre() {
if (mPlayState == MusicPlayState.MPS_NOFILE) {
return false;
}
mCurPlayIndex--;
mCurPlayIndex = reviceIndex(mCurPlayIndex);
if (prepare(mCurPlayIndex) == false) {
return false;
}
return replay();
}
public boolean seekTo(int rate) {
if (mPlayState == MusicPlayState.MPS_NOFILE || mPlayState == MusicPlayState.MPS_INVALID) {
return false;
}
int r = reviceSeekValue(rate);
int time = mMediaPlayer.getDuration();
int curTime = (int) ((float) r / 100 * time);
mMediaPlayer.seekTo(curTime);
return true;
}
public int getCurPosition() {
if (mPlayState == MusicPlayState.MPS_PLAYING || mPlayState == MusicPlayState.MPS_PAUSE) {
return mMediaPlayer.getCurrentPosition();
}
return 0;
}
public int getDuration() {
if (mPlayState == MusicPlayState.MPS_NOFILE || mPlayState == MusicPlayState.MPS_INVALID) {
return 0;
}
return mMediaPlayer.getDuration();
}
public void setPlayMode(int mode) {
switch (mode) {
case MusicPlayMode.MPM_SINGLE_LOOP_PLAY:
case MusicPlayMode.MPM_ORDER_PLAY:
case MusicPlayMode.MPM_LIST_LOOP_PLAY:
case MusicPlayMode.MPM_RANDOM_PLAY:
mPLayMode = mode;
break;
}
}
public int getPlayMode() {
return mPLayMode;
}
private int reviceIndex(int index) {
if (index < 0) {
index = mMusicFileList.size() - 1;
}
if (index >= mMusicFileList.size()) {
index = 0;
}
return index;
}
private int reviceSeekValue(int value) {
if (value < 0) {
value = 0;
}
if (value > 100) {
value = 100;
}
return value;
}
private int getRandomIndex() {
int size = mMusicFileList.size();
if (size == 0) {
return -1;
}
return Math.abs(mRandom.nextInt() % size);
}
private boolean prepare(int index) {
Log.i(TAG, "prepare index = " + index);
mCurPlayIndex = index;
mMediaPlayer.reset();
String path = mMusicFileList.get(index).musicPath;
try {
mMediaPlayer.setDataSource(mHttpGetProxy.getProxyUrl(path));
mMediaPlayer.prepare();
mPlayState = MusicPlayState.MPS_PREPARE;
Log.i(TAG, "mMediaPlayer.prepare path = " + path);
sendPlayStateBrocast();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
mPlayState = MusicPlayState.MPS_INVALID;
sendPlayStateBrocast();
return false;
}
return true;
}
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
Log.i(TAG, "mPLayMode = " + mPLayMode);
switch (mPLayMode) {
case MusicPlayMode.MPM_SINGLE_LOOP_PLAY:
play(mCurPlayIndex);
break;
case MusicPlayMode.MPM_ORDER_PLAY: {
if (mCurPlayIndex != mMusicFileList.size() - 1) {
playNext();
} else {
prepare(mCurPlayIndex);
}
}
break;
case MusicPlayMode.MPM_LIST_LOOP_PLAY:
playNext();
break;
case MusicPlayMode.MPM_RANDOM_PLAY: {
int index = getRandomIndex();
if (index != -1) {
mCurPlayIndex = index;
} else {
mCurPlayIndex++;
}
mCurPlayIndex = reviceIndex(mCurPlayIndex);
if (prepare(mCurPlayIndex)) {
replay();
}
}
break;
default:
prepare(mCurPlayIndex);
break;
}
}
public void sendPlayStateBrocast() {
if (mContext != null) {
Intent intent = new Intent(BROCAST_NAME);
intent.putExtra(MusicPlayState.PLAY_STATE_NAME, mPlayState);
intent.putExtra(MusicPlayState.PLAY_MUSIC_INDEX, mCurPlayIndex);
intent.putExtra(MusicPlayState.PLAY_BUFFER_PERCENT, mCurBufferPercent);
if (mPlayState != MusicPlayState.MPS_NOFILE) {
Bundle bundle = new Bundle();
MusicData data = mMusicFileList.get(mCurPlayIndex);
data.musicDuration = getDuration();
intent.putExtra(MusicData.KEY_MUSIC_DATA, data);
}
mContext.sendBroadcast(intent);
}
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.e(TAG, "MusicPlayer onError!!!\n");
return false;
}
//------------------------------------------------------
//
//--------------------------------------------------
private String curPlayListID = "";
public PlayListInfo getCurPlayListInfo() {
PlayListInfo info = new PlayListInfo();
info.playListID = curPlayListID;
if (mMusicFileList != null) {
info.listSize = mMusicFileList.size();
info.playingIndex = mCurPlayIndex;
}
return info;
}
public void getCurrentPlayListInfo(PlayListInfo info) {
info.playListID = curPlayListID;
if (mMusicFileList != null) {
info.listSize = mMusicFileList.size();
}
}
@Override
public void onBufferingUpdate(MediaPlayer arg0, int percent) {
TMLog.step(TAG, "onBufferingUpdate percent" + percent);
mLastBufferPercent = mCurBufferPercent;
mCurBufferPercent = percent;
if (mCurBufferPercent != mLastBufferPercent) {
sendPlayStateBrocast();
}
return;
}
}