123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- #ifndef _MEDIA_ZKMEDIAPLAYER_H_
- #define _MEDIA_ZKMEDIAPLAYER_H_
- #include "system/Thread.h"
- #include "utils/MessageQueue.h"
- #include "control/Common.h"
- class InternalMediaPlayer;
- /**
- * @brief 媒体播放
- */
- class ZKMediaPlayer {
- friend class InternalMediaPlayer;
- public:
- /**
- * @brief 媒体类型
- */
- typedef enum {
- E_MEDIA_TYPE_AUDIO, /**< 音频类型 */
- E_MEDIA_TYPE_VIDEO /**< 视频类型 */
- } EMediaType;
- typedef enum {
- E_MSGTYPE_PLAY_FILE = 1,
- E_MSGTYPE_PAUSE_FILE,
- E_MSGTYPE_RESUME_FILE,
- E_MSGTYPE_SEEK_FILE,
- E_MSGTYPE_STOP_FILE,
- E_MSGTYPE_PLAY_STARTED,
- E_MSGTYPE_PLAY_COMPLETED,
- E_MSGTYPE_ERROR_MEDIA_ERROR, // MEDIA_ERROR_UNKNOWN, ...
- E_MSGTYPE_ERROR_UNKNOWN,
- E_MSGTYPE_ERROR_INVALID_FILEPATH,
- E_MSGTYPE_ERROR_PREPARE_FAIL,
- E_MSGTYPE_ERROR_PLAY_FAIL,
- E_MSGTYPE_QUIT_THREAD,
- } EMessageType;
- typedef struct { // for MSGTYPE_ERROR_MEDIA_ERROR
- int mediaErrorType; // enum media_error_type
- int extra;
- } SMediaErrorInfo;
- public:
- /**
- * @param mediaType 媒体类型
- */
- ZKMediaPlayer(EMediaType mediaType);
- virtual ~ZKMediaPlayer();
- /**
- * @brief 播放指定路径媒体文件
- * @param pFilePath 媒体文件路径
- * @param msec 指定从哪个位置开始播放,单位为毫秒,默认从头开始播放
- */
- void play(const char *pFilePath, int msec = 0);
- /**
- * @brief 暂停播放
- */
- void pause();
- /**
- * @brief 恢复播放
- */
- void resume();
- /**
- * @brief 定位到msec位置播放
- * @param msec 单位为毫秒
- */
- void seekTo(int msec);
- /**
- * @brief 停止播放
- */
- void stop();
- /**
- * @brief 是否播放中
- */
- bool isPlaying();
- /**
- * @brief 设置音量
- * @param volume 音量范围:0.0 ~ 1.0
- */
- void setVolume(float volume);
- void setPreviewPos(const LayoutPosition &pos);
- /* clockwise rotation: val=0 no rotation, val=1 90 degree; val=2 180 degree, val=3 270 degree */
- void setRotation(int val);
- /**
- * @brief 获取总时长,单位为毫秒
- */
- int getDuration();
- /**
- * @brief 获取当前播放位置,单位为毫秒
- */
- int getCurrentPosition();
- class IPlayerMessageListener {
- public:
- virtual ~IPlayerMessageListener() { }
- virtual void onPlayerMessage(ZKMediaPlayer *pMediaPlayer, int msg, void *pMsgData) = 0;
- };
- void setPlayerMessageListener(IPlayerMessageListener *pListener) {
- mPlayerMessageListenerPtr = pListener;
- }
- private:
- bool playerThreadLoop();
- enum EPlayState {
- E_PLAY_STATE_ERROR = -1,
- E_PLAY_STATE_IDLE = 0,
- E_PLAY_STATE_INITIALIZED = 1,
- E_PLAY_STATE_STARTED = 4,
- E_PLAY_STATE_PAUSED = 5,
- };
- class PlayerThread : public Thread {
- public:
- PlayerThread(ZKMediaPlayer &mp) : mPlayer(mp) { }
- void start();
- void stop();
- virtual bool threadLoop();
- private:
- ZKMediaPlayer &mPlayer;
- };
- private:
- PlayerThread mPlayerThread;
- EMediaType mMediaType;
- InternalMediaPlayer *mMediaPlayerPtr;
- MessageQueue mMsgQueue;
- mutable Mutex mLock;
- Condition mExecuteDoneCondition;
- EPlayState mCurrentPlayState;
- IPlayerMessageListener *mPlayerMessageListenerPtr;
- };
- #endif /* _MEDIA_ZKMEDIAPLAYER_H_ */
|