package com.youplayer.player; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Timer; import java.util.TimerTask; import android.media.AudioManager; import android.media.MediaPlayer; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.RelativeLayout; import com.youplayer.util.LOG; public class YouPlayerAndroidPlayer implements MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener, MediaPlayer.OnInfoListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnSeekCompleteListener, MediaPlayer.OnVideoSizeChangedListener { private static final String TAG = "AndroidPlayer"; private MediaPlayer mMediaPlayer = null; private static SurfaceView mSurfaceView; private static boolean mbMediainfo_ok; private static boolean mbMediaAvailable = false; private static boolean mbAtomicSeek = true; private static boolean mUIReady = false; private final static int mEventPrepared = tagyouplayer_player_ui_message.FN_PLAYER_MESSAGE_READY_TO_PLAY.ordinal();//1; private final static int mEventPlayBackComplete =tagyouplayer_player_ui_message.FN_PLAYER_MESSAGE_END_OF_FILE.ordinal();// 2; private final static int mEventBufferingUpdate = tagyouplayer_player_ui_message.FN_PLAYER_MESSAGE_BUFFERING_PERCENT.ordinal();//3; private final static int mEventSeekComplete = tagyouplayer_player_ui_message.FN_PLAYER_MESSAGE_SEEK_THUMBNAIL.ordinal();//7; private final static int mEventBufferingStart = tagyouplayer_player_ui_message.FN_PLAYER_MESSAGE_BUFFERING_START.ordinal();//6; private final static int mEventProgressInd = tagyouplayer_player_ui_message.FN_PLAYER_MESSAGE_MEDIA_CURRENT_POS.ordinal();//9; private final static int mInfoVideoSizeChanged = 1; private final static int mEventError = tagyouplayer_player_ui_message.FN_PLAYER_MESSAGE_OPEN_FAILED.ordinal();//100; private final static int mOpenSuccess = tagyouplayer_player_ui_message.FN_PLAYER_MESSAGE_OPEN_SUCCESS.ordinal();//100; private final static int mCloseSuccess = tagyouplayer_player_ui_message.FN_PLAYER_MESSAGE_CLOSE_SUCCESS.ordinal();//100; private final static int mEventInfo = 200; private Timer mTimer = null; private MyTimerTask mTimerTask = null; static enum tagyouplayer_player_ui_message { FN_PLAYER_MESSAGE_NONE, FN_PLAYER_MESSAGE_OPEN_SUCCESS, FN_PLAYER_MESSAGE_OPEN_FAILED, FN_PLAYER_MESSAGE_PAUSE_RESULT, FN_PLAYER_MESSAGE_BUFFERING_START, FN_PLAYER_MESSAGE_BUFFERING_PERCENT, FN_PLAYER_MESSAGE_READY_TO_PLAY, FN_PLAYER_MESSAGE_SEEK_THUMBNAIL, FN_PLAYER_MESSAGE_END_OF_FILE, FN_PLAYER_MESSAGE_MEDIA_CURRENT_POS, FN_PLAYER_MESSAGE_MEDIA_CACHED_POS, FN_PLAYER_MESSAGE_NOTIFICATION, FN_PLAYER_MESSAGE_DISPLAY_FRAME, FN_PLAYER_CONVERTER_PERCENT, FN_PLAYER_CONVERTER_RETRUE, FN_PLAYER_MESSAGE_HW_START_ERR, FN_PLAYER_MESSAGE_CLOSE_SUCCESS, FN_PLAYER_MESSAGE_AUTHORIZED, FN_PLAYER_MESSAGE_END }; static YouPlayerAndroidPlayer instance; protected YouPlayerAndroidPlayer() { mbMediainfo_ok = false; instance = null; instance = this; } /** * set Surface */ public static void Uim_Set_Player_Surface(SurfaceView surfaceview) { LOG.i(TAG, "set Surface"," Uim_Set_Player_Surface set surface"); mUIReady = false; mSurfaceView = null; mSurfaceView = surfaceview; } public boolean media_close() { LOG.i(TAG, "media_close",""); if( perper_task != null ){ perper_task.cancel(); perper_task = null; } try { if(mTimerTask != null) { mTimerTask.cancel(); mTimerTask = null; } if (mTimer != null) { mTimer.purge(); } if( mMediaPlayer != null ){ mbMediaAvailable = false; mMediaPlayer.reset(); mMediaPlayer.setDisplay(null); mMediaPlayer.release(); mMediaPlayer = null; } return true; } catch (Exception e) { //err(LOGTAG, e.getMessage()); return false; } } public int media_get_audio_volume_value() { // TODO media_get_audio_volume_value return 0; } public int media_get_current_playpos() { int ret = -1; try { ret = mMediaPlayer.getCurrentPosition(); } catch (Exception e) { //err(LOGTAG, "getCurrentPosition()"); } return ret; } public int getVideoHeight() { int ret = -1; try { ret = mMediaPlayer.getVideoHeight(); } catch (Exception e) { LOG.e(TAG, "Exception"," getVideoHeight()"); } LOG.i(TAG,"getVideoHeight"," media_height:"+ret); return ret; } public int getVideoWidth() { int ret = -1; try { ret = mMediaPlayer.getVideoWidth(); } catch (Exception e) { LOG.e(TAG,"Exception"," getVideoWidth()"); } LOG.i(TAG,"getVideoWidth"," media_width:"+ret); return ret; } public int media_get_total_playpos() { int ret = -1; try { ret = mMediaPlayer.getDuration(); } catch (Exception e) { LOG.e(TAG,"Exception",e.toString()); you_sys_player_notify_func_java(mEventError,0,0); } LOG.i(TAG,"total playpos"," media_get_total_playpos duration: "+ret); return ret; } public boolean media_init() { LOG.i(TAG,"media_init",""); errored = false; //initSurface(); media_uninit(); mMediaPlayer = new MediaPlayer(); if (null != mMediaPlayer) { mMediaPlayer.setOnBufferingUpdateListener(this); mMediaPlayer.setOnCompletionListener(this); mMediaPlayer.setOnErrorListener(this); mMediaPlayer.setOnInfoListener(this); mMediaPlayer.setOnPreparedListener(this); mMediaPlayer.setOnSeekCompleteListener(this); mMediaPlayer.setOnVideoSizeChangedListener(this); mMediaPlayer.reset(); } if (mTimerTask == null) { mTimerTask = new MyTimerTask(); } return true; } public boolean media_isPlaying() { try { return mMediaPlayer.isPlaying(); } catch (Exception e) { //err(LOGTAG, e.getMessage()); return false; } } String mPath; public boolean media_open(final String path) { new Thread(){ public void run(){ LOG.i(TAG, "media_open ",""); if (null == mMediaPlayer) { mMediaPlayer = new MediaPlayer(); mMediaPlayer.setOnBufferingUpdateListener(YouPlayerAndroidPlayer.this); mMediaPlayer.setOnCompletionListener(YouPlayerAndroidPlayer.this); mMediaPlayer.setOnErrorListener(YouPlayerAndroidPlayer.this); mMediaPlayer.setOnInfoListener(YouPlayerAndroidPlayer.this); mMediaPlayer.setOnPreparedListener(YouPlayerAndroidPlayer.this); mMediaPlayer.setOnSeekCompleteListener(YouPlayerAndroidPlayer.this); mMediaPlayer.setOnVideoSizeChangedListener(YouPlayerAndroidPlayer.this); mMediaPlayer.reset(); } mbMediainfo_ok = false; try { TimerTask timeout = new TimerTask(){ @Override public void run() { LOG.i(TAG, "media_prepare","onError"); onError(null,0,0); } }; Timer timer = new Timer(); timer.schedule(timeout, 3000); mPath = path; if (path.startsWith("/")) mMediaPlayer.setDataSource((new FileInputStream(new File(path))).getFD()); else mMediaPlayer.setDataSource(path); timer.cancel(); timer = null; mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mbMediaAvailable = false; if( mSurfaceView != null ) mMediaPlayer.setDisplay(mSurfaceView.getHolder()); fone_sys_player_notify_func(mOpenSuccess,0,0); media_prepare(); } catch (Exception e) { media_uninit(); e.printStackTrace(); LOG.e(TAG,"Exception"," open fiail "+e.getMessage()); you_sys_player_notify_func_java(mEventError,0,0); } } }.start(); return true; } public boolean media_pause() { LOG.i(TAG, "media_pause",""); try { mMediaPlayer.pause(); return true; } catch (Exception e) { you_sys_player_notify_func_java(mEventError,0,0); return false; } } public boolean media_play() { LOG.i(TAG, "media_play",""); try { mMediaPlayer.start(); if (mTimer != null) { mTimer.purge(); if (null != mTimerTask) { mTimerTask.cancel(); mTimerTask = new MyTimerTask(); } } else { mTimer = new Timer(); } mTimer.schedule(mTimerTask, 0, 250); return true; } catch (Exception e) { e.printStackTrace(); media_uninit(); you_sys_player_notify_func_java(mEventError,0,0); return false; } } int mSeek; public int media_seek_to(int ms) { mSeek = ms; LOG.i(TAG, "media_seek_to",""); mbAtomicSeek = false; if(mbMediaAvailable) { try { mMediaPlayer.seekTo(ms); fone_sys_player_notify_func(mEventPrepared,0,0); } catch (Exception e) { LOG.e(TAG,"Exception "," seek fiail "+ e.getMessage()); mbMediaAvailable = false; } } else { try{ if(ms > 0) mMediaPlayer.seekTo(ms); }catch(Exception e) { you_sys_player_notify_func_java(mEventError,0,0); LOG.e(TAG,"Exception "," androidplayer seek error "+ e.getMessage()); } } return 0; } public int media_set_audio_volume_value(int value) { /* not used */ return 0; } public void media_set_video_display(int left, int top, int right, int bottom, boolean full) { LOG.i(TAG,"video display"," media_set_video_display left right:"+left+" "+right); if (null != mSurfaceView) { RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)mSurfaceView.getLayoutParams(); lp.leftMargin = left; lp.topMargin = top; lp.width = right-left; lp.height = bottom-top; mSurfaceView.setLayoutParams(lp); } //mHolder.setFixedSize(right-left, bottom-top); } static Timer prepare_timer = new Timer(); static TimerTask perper_task; public boolean media_prepare() { try { LOG.i(TAG, "media_prepare",""); perper_task = new TimerTask(){ @Override public void run() { LOG.i(TAG, "media_prepare","onError"); onError(null,0,0); } }; prepare_timer.schedule(perper_task, 3000); mMediaPlayer.prepare(); } catch (Exception e) { LOG.e(TAG,"Exception"," media_prepare error "+e.toString()); you_sys_player_notify_func_java(mEventError,0,0); } return true; } public boolean media_stop() { LOG.i(TAG, "media_stop",""); try { if(mTimerTask != null) { mTimerTask.cancel(); mTimerTask = null; } if (mTimer != null) { mTimer.purge(); mTimer = null; } if( mMediaPlayer != null ) mMediaPlayer.stop(); LOG.e(TAG,"Exception","sunhuazhu: media_close success send"); fone_sys_player_notify_func(mCloseSuccess,0,0); return true; } catch (Exception e) { //err(LOGTAG, e.getMessage()); return false; } } public boolean media_uninit() { LOG.i(TAG, "media_uninit",""); mSeek = 0; if( perper_task != null ){ perper_task.cancel(); perper_task = null; } try { if (null != mMediaPlayer) { media_close(); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { fone_sys_player_notify_func(mEventBufferingUpdate, 0, 0); } @Override public void onCompletion(MediaPlayer mp) { LOG.i(TAG, "onError"," jni_java onCompletion"); fone_sys_player_notify_func(mEventPlayBackComplete, 0, 0); } @Override public boolean onError(MediaPlayer mp, int what, int extra) { LOG.i(TAG, "onError"," jni_java onError what:"+what); if( mMediaPlayer != null){ media_uninit(); you_sys_player_notify_func_java(mEventError, 0,1); } return false; } @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { //you_sys_player_notify_func_java(mEventInfo, what, extra); LOG.i(TAG, "onInfo"," jni_java onInfo what:"+what+" extra:"+extra); return false; } @Override public void onPrepared(MediaPlayer mp) { mbMediainfo_ok = true; mbMediaAvailable = true; if( perper_task != null ){ perper_task.cancel(); perper_task = null ; } fone_sys_player_notify_func(mEventPrepared, 0, 0); LOG.i(TAG,"onPrepared"," send to jni ready to play"); } @Override public void onSeekComplete(MediaPlayer mp) { /* not used */ if (!mbAtomicSeek) { fone_sys_player_notify_func(mEventSeekComplete, 0, 0); mbAtomicSeek = true; } mSeek = 0; } @Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { } int last; class MyTimerTask extends TimerTask{ int count; @Override public void run() { if (mMediaPlayer == null /*|| mListener == null*/) return; try{ if (mMediaPlayer.isPlaying()) { int pos = mMediaPlayer.getCurrentPosition(); if( pos == last && last != 0 ){ count++; if( count > 5 ){ count = 0; media_uninit(); you_sys_player_notify_func_java(mEventError, 0,1); } } else{ if( mSeek!= 0 ) { return; } count = 0; last = pos; fone_sys_player_notify_func(mEventProgressInd, 0, pos); } } }catch(Exception e) { LOG.e(TAG,"Exception"," timer error:"+e.getMessage()); //e.printStackTrace(); } } } static boolean errored = false; public static void you_sys_player_notify_func_java(int msg, int arg1, int arg2){ if( !errored ){ errored = true; fone_sys_player_notify_func(msg,arg1,arg2); } } public native static void fone_sys_player_notify_func(int msg, int arg1, int arg2); }