ZKMediaPlayer.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #ifndef _MEDIA_ZKMEDIAPLAYER_H_
  2. #define _MEDIA_ZKMEDIAPLAYER_H_
  3. #include "system/Thread.h"
  4. #include "utils/MessageQueue.h"
  5. #include "control/Common.h"
  6. class InternalMediaPlayer;
  7. /**
  8. * @brief 媒体播放
  9. */
  10. class ZKMediaPlayer {
  11. friend class InternalMediaPlayer;
  12. public:
  13. /**
  14. * @brief 媒体类型
  15. */
  16. typedef enum {
  17. E_MEDIA_TYPE_AUDIO, /**< 音频类型 */
  18. E_MEDIA_TYPE_VIDEO /**< 视频类型 */
  19. } EMediaType;
  20. typedef enum {
  21. E_MSGTYPE_PLAY_FILE = 1,
  22. E_MSGTYPE_PAUSE_FILE,
  23. E_MSGTYPE_RESUME_FILE,
  24. E_MSGTYPE_SEEK_FILE,
  25. E_MSGTYPE_STOP_FILE,
  26. E_MSGTYPE_PLAY_STARTED,
  27. E_MSGTYPE_PLAY_COMPLETED,
  28. E_MSGTYPE_ERROR_MEDIA_ERROR, // MEDIA_ERROR_UNKNOWN, ...
  29. E_MSGTYPE_ERROR_UNKNOWN,
  30. E_MSGTYPE_ERROR_INVALID_FILEPATH,
  31. E_MSGTYPE_ERROR_PREPARE_FAIL,
  32. E_MSGTYPE_ERROR_PLAY_FAIL,
  33. E_MSGTYPE_QUIT_THREAD,
  34. } EMessageType;
  35. typedef struct { // for MSGTYPE_ERROR_MEDIA_ERROR
  36. int mediaErrorType; // enum media_error_type
  37. int extra;
  38. } SMediaErrorInfo;
  39. public:
  40. /**
  41. * @param mediaType 媒体类型
  42. */
  43. ZKMediaPlayer(EMediaType mediaType);
  44. virtual ~ZKMediaPlayer();
  45. /**
  46. * @brief 播放指定路径媒体文件
  47. * @param pFilePath 媒体文件路径
  48. * @param msec 指定从哪个位置开始播放,单位为毫秒,默认从头开始播放
  49. */
  50. void play(const char *pFilePath, int msec = 0);
  51. /**
  52. * @brief 暂停播放
  53. */
  54. void pause();
  55. /**
  56. * @brief 恢复播放
  57. */
  58. void resume();
  59. /**
  60. * @brief 定位到msec位置播放
  61. * @param msec 单位为毫秒
  62. */
  63. void seekTo(int msec);
  64. /**
  65. * @brief 停止播放
  66. */
  67. void stop();
  68. /**
  69. * @brief 是否播放中
  70. */
  71. bool isPlaying();
  72. /**
  73. * @brief 设置音量
  74. * @param volume 音量范围:0.0 ~ 1.0
  75. */
  76. void setVolume(float volume);
  77. void setPreviewPos(const LayoutPosition &pos);
  78. /* clockwise rotation: val=0 no rotation, val=1 90 degree; val=2 180 degree, val=3 270 degree */
  79. void setRotation(int val);
  80. /**
  81. * @brief 获取总时长,单位为毫秒
  82. */
  83. int getDuration();
  84. /**
  85. * @brief 获取当前播放位置,单位为毫秒
  86. */
  87. int getCurrentPosition();
  88. class IPlayerMessageListener {
  89. public:
  90. virtual ~IPlayerMessageListener() { }
  91. virtual void onPlayerMessage(ZKMediaPlayer *pMediaPlayer, int msg, void *pMsgData) = 0;
  92. };
  93. void setPlayerMessageListener(IPlayerMessageListener *pListener) {
  94. mPlayerMessageListenerPtr = pListener;
  95. }
  96. private:
  97. bool playerThreadLoop();
  98. enum EPlayState {
  99. E_PLAY_STATE_ERROR = -1,
  100. E_PLAY_STATE_IDLE = 0,
  101. E_PLAY_STATE_INITIALIZED = 1,
  102. E_PLAY_STATE_STARTED = 4,
  103. E_PLAY_STATE_PAUSED = 5,
  104. };
  105. class PlayerThread : public Thread {
  106. public:
  107. PlayerThread(ZKMediaPlayer &mp) : mPlayer(mp) { }
  108. void start();
  109. void stop();
  110. virtual bool threadLoop();
  111. private:
  112. ZKMediaPlayer &mPlayer;
  113. };
  114. private:
  115. PlayerThread mPlayerThread;
  116. EMediaType mMediaType;
  117. InternalMediaPlayer *mMediaPlayerPtr;
  118. MessageQueue mMsgQueue;
  119. mutable Mutex mLock;
  120. Condition mExecuteDoneCondition;
  121. EPlayState mCurrentPlayState;
  122. IPlayerMessageListener *mPlayerMessageListenerPtr;
  123. };
  124. #endif /* _MEDIA_ZKMEDIAPLAYER_H_ */