package com.example.ipcplayer.service;
import java.lang.ref.WeakReference;
import com.example.ipcplayer.R;
import com.example.ipcplayer.convert.ConvertToMusicFile;
import com.example.ipcplayer.object.MusicFile;
import com.example.ipcplayer.utils.LogUtil;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
public class PlaybackService extends Service{
private static final String TAG = PlaybackService.class.getSimpleName();
private LocalPlayer mLocalPlayer;
private int mPlayState = 0;
private static final int STATE_PLAY = 1;
private static final int STATE_PAUSE = 2;
private static final int STATE_STOP = 3;
private static final int STATE_IDLE = 0;
private static final int STATE_ERROR = -1;
private static final int REFRESH_LYRIC = 1;
private MusicFile mMusicFile = new MusicFile();
private static final int LYRIC_NO_DATA = 0;
private static final int LYRIC_LOADING = 1;
private static final int LYRIC_READY = 2;
private int mLyricState = LYRIC_NO_DATA;
public boolean isPlaying(){
return mPlayState == STATE_PLAY;
}
public boolean isStop(){
return mPlayState == STATE_STOP;
}
public boolean isPaused(){
return mPlayState == STATE_PAUSE;
}
public boolean isError(){
return mPlayState == STATE_ERROR;
}
public boolean isIdle(){
return mPlayState == STATE_IDLE;
}
public void setPlayState(int state){
mPlayState = state;
}
@Override
public IBinder onBind(Intent arg0) {
return binder;
}
@Override
public void onCreate() {
super.onCreate();
initPlayers();
}
private void initPlayers(){
mLocalPlayer = new LocalPlayer(this);
// try {
// mLocalPlayer.setDataSource(R.raw.believe);
// } catch (Exception e) {
// LogUtil.d(TAG + " setDataSource exception e: " );
// e.printStackTrace();
// }
mLocalPlayer.setOnCompletionListener(mOnCompleteListener);
mLocalPlayer.setOnErrorListener(mOnErrorListener);
mLocalPlayer.setOnSeekCompleteListener(mOnSeekCompleteListener);
mLocalPlayer.setOnPreparedListener(mOnPreparedListener);
}
private LocalPlayer.OnCompletionListener mOnCompleteListener = new LocalPlayer.OnCompletionListener() {
@Override
public void onCompletion() {
next();
}
};
private LocalPlayer.OnErrorListener mOnErrorListener = new LocalPlayer.OnErrorListener() {
@Override
public void onError() {
}
};
private LocalPlayer.OnPreparedListener mOnPreparedListener = new LocalPlayer.OnPreparedListener() {
@Override
public void onPrepared() {
start();
}
};
private LocalPlayer.OnSeekCompleteListener mOnSeekCompleteListener = new LocalPlayer.OnSeekCompleteListener() {
@Override
public void onSeekComplete() {
}
};
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
public void setDataSource(String path){
if(mLocalPlayer == null){
return ;
}
mLocalPlayer.setDataSource(path);
}
public void openCurrent(long id){
if(id <= 0){
return ;
}
mMusicFile = ConvertToMusicFile.getInstance(this).idToMusicFile(id);
if(mMusicFile == null){
LogUtil.d(TAG + " MusicFile is null");
return ;
}
String path = mMusicFile.getPath();
setDataSource(path);
loadMusicLyric(false);
}
public void start(){
if(mLocalPlayer == null){
return ;
}
if (mLocalPlayer.isInitialized()) {
mLocalPlayer.start();
setPlayState(STATE_PLAY);
}else {
setPlayState(STATE_ERROR);
}
}
public void pause(){
if(mLocalPlayer == null){
return ;
}
mLocalPlayer.pause();
setPlayState(STATE_PAUSE);
}
public void stop(){
if(mLocalPlayer == null){
return ;
}
mLocalPlayer.stop();
setPlayState(STATE_STOP);
}
public void release(){
if(mLocalPlayer == null){
return ;
}
mLocalPlayer.release();
}
public void previous(){
}
public void next(){
}
public int getId(){
return 0;
}
public String getTitle(){
return mMusicFile.getMusicName();
}
public String getArtist(){
return mMusicFile.getArtistName();
}
public String getAlbumn(){
return null;
}
public long getDuration(){
long duration = 0;
if(mLocalPlayer == null){
LogUtil.d(TAG + " getDuration: mLocalPlayer is null");
return 0;
}
if(!mLocalPlayer.isInitialized()){
LogUtil.d(TAG + " getDuration: mLocalPlayer is not initialized");
return 0;
}
try{
duration = mLocalPlayer.getDuration();
}catch(Exception e){
LogUtil.d(TAG + " getDuration exception: ");
e.printStackTrace();
}
return duration;
}
public long getCurrentTime(){
if(mLocalPlayer == null){
return 0;
}
if(!mLocalPlayer.isInitialized()){
return 0;
}
return mLocalPlayer.getCurrentPosition();
}
public void seekTo(long position){
if(mLocalPlayer == null){
return ;
}
if(!mLocalPlayer.isInitialized()){
return ;
}
mLocalPlayer.seek(position);
}
public void loadMusicLyric(boolean isOnline) {
if(mMusicFile == null){
LogUtil.d(TAG + " loadMusicLyric MusicFile is null");
return ;
}
mLyricState = LYRIC_LOADING;
notifyChange(REFRESH_LYRIC);
}
private void notifyChange(int what){
}
private Binder binder = new ServiceStub(this);
private final class ServiceStub extends IPlayback.Stub{
WeakReference<PlaybackService> mService;
public ServiceStub(PlaybackService service){
mService = new WeakReference<PlaybackService>(service);
}
@Override
public void start(){
mService.get().start();
}
@Override
public void pause(){
mService.get().pause();
}
@Override
public void stop(){
mService.get().stop();
}
@Override
public void release(){
mService.get().release();
}
@Override
public void previous(){
mService.get().previous();
}
@Override
public void next(){
mService.get().next();
}
@Override
public int getId(){
return mService.get().getId();
}
@Override
public String getTitle(){
return mService.get().getTitle();
}
@Override
public String getArtist(){
return mService.get().getArtist();
}
@Override
public String getAlbumn(){
return mService.get().getAlbumn();
}
@Override
public long getDuration(){
return mService.get().getDuration();
}
@Override
public long getCurrentTime(){
return mService.get().getCurrentTime();
}
@Override
public boolean isPlaying(){
return mService.get().isPlaying();
}
@Override
public boolean isPaused(){
return mService.get().isPaused();
}
@Override
public void seekTo(long position) throws RemoteException {
mService.get().seekTo(position);
}
@Override
public void setDataSource(String path) throws RemoteException {
mService.get().setDataSource(path);
}
@Override
public void loadMusicLyric(boolean isOnline) throws RemoteException {
mService.get().loadMusicLyric(isOnline);
}
@Override
public void openCurrent(long id) throws RemoteException {
mService.get().openCurrent(id);
}
}
}