录音实现:播放,暂停,播放中切换到另一个录音,目前还未实现切换上一首,下一首,声音调节功能
authorluozheng <1732036298@qq.com>
Tue, 12 Mar 2024 12:42:29 +0000 (20:42 +0800)
committerluozheng <1732036298@qq.com>
Tue, 12 Mar 2024 12:42:29 +0000 (20:42 +0800)
code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingModel.h
code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingPlayerView.h
code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingPresenter.h
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPlayerView.cpp
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingView.cpp

index d77dfcb..3e0fa09 100644 (file)
@@ -46,16 +46,19 @@ namespace OHOS
         std::string GetRecordingPlayerUri(void);
         void SetRecordingPlayerUri(std::string src);
         void SetRecordingPlayButtonState(bool state);
+        void SetCircleProgress(int value);
         void AudioInit(void);
         void ConvertMillisecondToTime(int32_t milliseconds);
         int RecordingPlayerInit(void);
         int RecordingPlayerStat(void);
-        int BasePlayerStateOperate(int state);
         int GetRecordingPlayerState(void);
-        bool HasRecordingPlayerPlayed(void);
         int RecordingPlayerPlay(void);
         int RecordingPlayerPause(void);
-
+        int RecordingPlayerStop(void);
+        void NextSong(int index);
+        void PreviousPlayout(void);
+        int ResetSourceAndPrepare(void);
+        int ResetPlayerModuleStatus(void);
         /* -------------------------------------------------------------------------- */
         void InitRecordingListItem();
         std::vector<RecordingListItem> &GetRecordinglistItems();
@@ -63,12 +66,15 @@ namespace OHOS
         std::string GetCleanFileName(const std::string &filePath);
         void SearchFiles(const std::string &directory, std::vector<std::string> &fileNames, int &mp3FileCount);
         void KeepClickRecordingIndex(int index_);
-        int GetClickRecordingIndex(void);
+        int &GetClickRecordingIndex(void);
         std::vector<std::string> &GetFileNames(void);
         void KeepTotalRecordDuration(std::string time);
         std::string GetTotalRecordDuration(void) const;
         std::string Getyyyymmhhh_date(void) const;
-
+        std::shared_ptr<RecordingPlayerInterruptListener> GetRecordingPlayerIntrptListener(void);
+        void ClearActivateAudioInterrupt(void);
+        std::shared_ptr<Player> GetPlayerCtr(void);
+        void SetAudioInitStatus(bool value);
         /* ----------------------------------- 定时器 ---------------------------------- */
         void Recording_StartTimer(uint32_t interval);
         void Recording_StopTimer(void);
@@ -83,6 +89,7 @@ namespace OHOS
     private:
         int64_t DurationTime{0};                                                                       // 播放时长,单位ms
         bool PlayButtonState{false};                                                                   // 播放按钮状态
+        int CircleProgress{0};                                                                         // 播放进度
         bool IsActivateAudioInterrupt{false};                                                          // 是否激活音频中断
         AudioSession SessionId;                                                                        // 音频会话ID
         AudioInterrupt interrupt;                                                                      // 音频中断管理
index 9524bf2..dae2180 100644 (file)
@@ -54,6 +54,9 @@ namespace OHOS
         void ClearAll(void);\r
         UILabelExt * GetRecordingFileNameLabel(void);\r
         UILabelExt *GetRecordingTimeAndDurationLabel(void);\r
+        UICheckBox * GetPlayerButton(void);\r
+        void SetPlayerButtonState(UICheckBox::UICheckBoxState state);\r
+        UICircleProgress * GetPlayerProgressBar(void);\r
     private:\r
         UILabelExt *SetUpLabel(LabelConfig &labelconfig); // 设置标签\r
         UIButton *SetTheButton(ButtonConfig &buttonconfig, UIView::OnClickListener *clickListener);\r
index e273b42..25c8443 100644 (file)
@@ -6,6 +6,7 @@
 #include "KeyInputListener.h"\r
 #include "common/key_code.h"\r
 #include "record/include/RecordingModel.h"\r
+#include <media_thread_adapt.h>\r
 namespace OHOS\r
 {\r
     typedef enum\r
@@ -36,7 +37,7 @@ namespace OHOS
     static const char *RECORD_DELETE_ON_BUTTON_VIEWID = "RECORD_DELETE_ON_BUTTON";   // 录音删除\r
     static const char *RECORD_DELETE_OFF_BUTTON_VIEWID = "RECORD_DELETE_OFF_BUTTON"; // 录音不删除\r
 \r
-// 播放器中断监听\r
+    // 播放器中断监听\r
     class RecordingPlayerInterruptListener : public InterruptListener\r
     {\r
     public:\r
@@ -46,7 +47,7 @@ namespace OHOS
         void SetOwner(std::shared_ptr<Player> player);\r
         void SetPaused(bool value);\r
         void SetResumed(bool value);\r
-        void RestFlag();\r
+        void ResetFlag();\r
         bool IsPaused();\r
         bool IsDelayed();\r
         bool IsResumed();\r
index 16c3bfd..6e9e39b 100644 (file)
@@ -24,7 +24,7 @@ namespace OHOS
     static MutexId g_mutex;
     RecordingModel::RecordingModel()
     {
-        g_mutex = MUTEX_InitValue();
+        // g_mutex = MUTEX_InitValue();
     }
 
     RecordingModel::~RecordingModel()
@@ -55,9 +55,6 @@ namespace OHOS
         Uri = src;
     }
 
-    /// @brief 设置录音播放按钮状态
-    /// @param state true
-
     /*
      * @brief 设置录音播放按钮状态
      * @param state true 开启
@@ -68,6 +65,42 @@ namespace OHOS
         PlayButtonState = state;
     }
 
+    /*
+     * @brief 设置播放进度
+     */
+    void RecordingModel::SetCircleProgress(int value)
+    {
+        CircleProgress = value;
+    }
+    /*
+     * @brief 获取录音播放器中断监听类
+     */
+    std::shared_ptr<RecordingPlayerInterruptListener> RecordingModel::GetRecordingPlayerIntrptListener(void)
+    {
+        return p_RecordingPlayerInterruptListener;
+    }
+
+    /*
+     * @brief 清除音频中断
+     */
+    void RecordingModel::ClearActivateAudioInterrupt(void)
+    {
+        IsActivateAudioInterrupt = false;
+    }
+
+    std::shared_ptr<Player> RecordingModel::GetPlayerCtr(void)
+    {
+        return PlayerCtr;
+    }
+
+    /*
+     * @brief  设置是否音频已经初始化过
+     */
+    void RecordingModel::SetAudioInitStatus(bool value)
+    {
+        audioInitStatus = value;
+    }
+
     /*
      * @brief 初始化音频系统并准备播放器控制器和回调
      */
@@ -134,17 +167,23 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No Recording files!!");
             return OHOS_FAILURE;
         };
-        Uri = directory + recordingFileName + ".mp3";
-        /* ------------------------------ 设置播放器的回调函数。 ----------------------------- */
-        PlayerCtr->SetPlayerCallback(PlayerCallback);
+        SetRecordingPlayerUri(directory + recordingFileName + ".mp3");
+
+        int state = GetRecordingPlayerState();
+        if (state != PlayerStates::PLAYER_STATE_ERROR) // 每次setSource前回到idle状态
+        {
+            ret = PlayerCtr->Reset();
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);
+        }
+
         /* ------------------------- 创建资源对象Resource并进行资源申请。 ------------------------- */
-        Resource = std::make_shared<Source>(Uri);
+        Resource = std::make_shared<Source>(GetRecordingPlayerUri());
         if (Resource.get() == nullptr)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "source request failed!");
             return OHOS_FAILURE;
         }
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Player Uri %s", Uri.c_str());
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Player Uri %s", GetRecordingPlayerUri().c_str());
         /* ----------------------- 设置播放器的数据源为Resource,并进行准备操作。 ---------------------- */
         PlayerCtr->SetSource(*Resource);
         PlayerCtr->Prepare();
@@ -160,7 +199,6 @@ namespace OHOS
             return OHOS_FAILURE;
         }
         ConvertMillisecondToTime(DurationTime);
-
         return OHOS_SUCCESS;
     }
 
@@ -170,6 +208,10 @@ namespace OHOS
     int RecordingModel::RecordingPlayerStat()
     {
         int ret;
+        /* ------------------------------ 设置播放器的回调函数。 ----------------------------- */
+        ResetPlayerModuleStatus();
+        ResetSourceAndPrepare();
+        PlayerCtr->SetPlayerCallback(PlayerCallback);
         /* ----------------------------- 如果未激活音频中断处理: ----------------------------- */
         if (!IsActivateAudioInterrupt)
         {
@@ -222,52 +264,6 @@ namespace OHOS
         return OHOS_SUCCESS;
     }
 
-    /*
-     * @brief 根据播放器不同状态执行相应的操作
-     */
-    int RecordingModel::BasePlayerStateOperate(int state)
-    {
-        int ret;
-        if (state == PlayerStates::PLAYER_PAUSED || state == PlayerStates::PLAYER_STOPPED)
-        {
-            /* --------------------------- 如果播放器状态为暂停或停止,则开始播放 -------------------------- */
-            ret = RecordingPlayerStat(); // 播放
-            if (ret != 0)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);
-                return RECORDER_EXECUTE_FUNC_FAILED;
-            }
-            RecordingModel::GetInstance()->SetRecordingPlayButtonState(true); // 播放控件图形同步
-            return RECORDER_NORMAL;
-        }
-        else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE)
-        {
-            /* ----------------------------- 如果是开始播放或者是播放完成 ----------------------------- */
-            ret = PlayerCtr->Stop(); // 停止
-            ret = PlayerCtr->Reset();
-            ret = RecordingPlayerStat(); // 播放
-            if (ret != 0)
-            {
-                /* stop and exit */
-                ret = PlayerCtr->Stop(); // 停止
-                ret = PlayerCtr->Reset();
-            }
-            return RECORDER_ALREADY_PLAYING;
-        }
-        else
-        {
-            /* ---------------------------- 其他情况,执行播放器状态相关操作 ---------------------------- */
-            ret = RecordingModel::GetInstance()->RecordingPlayerStat();
-            if (ret != 0)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);
-                return RECORDER_EXECUTE_FUNC_FAILED;
-            }
-            RecordingModel::GetInstance()->SetRecordingPlayButtonState(true); // 播放控件图形同步
-            return RECORDER_NORMAL;
-        }
-    }
-
     /*
      * @brief 获取录音播放器状态
      */
@@ -277,7 +273,7 @@ namespace OHOS
         /* ------------------------------ 检查播放器控制对象是否为空 ----------------------------- */
         if (PlayerCtr.get() == nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerCtr.get() is nullptr!!");
             return OHOS_FAILURE;
         }
         int32_t state;
@@ -286,26 +282,36 @@ namespace OHOS
     }
 
     /*
-     * @brief 判断播录音放器是否已经播放过
+     * @brief 重新设置SetSource和Prepare
      */
-    bool RecordingModel::HasRecordingPlayerPlayed(void)
+    int RecordingModel::ResetSourceAndPrepare(void)
     {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RecordingModel] HasRecordingPlayerPlayed");
-        int state = GetRecordingPlayerState();
-        if (state == OHOS_FAILURE)
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordingModel::ResetSourceAndPrepare");
+        if (PlayerCtr.get() == nullptr)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get Player State failed!!");
-            return false;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerCtr.get() is nullptr!!");
+            return OHOS_FAILURE;
         }
-        if (state != PlayerStates::PLAYER_STARTED && state != PlayerStates::PLAYER_PAUSED &&
-            state != PlayerStates::PLAYER_STOPPED && state != PlayerStates::PLAYER_PLAYBACK_COMPLETE)
+        PlayerCtr->SetSource(*Resource);
+        PlayerCtr->Prepare();
+
+        return OHOS_SUCCESS;
+    }
+
+    /*
+     * @brief 重置播放器到IDLE状态
+     */
+    int RecordingModel::ResetPlayerModuleStatus(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordingModel::ResetPlayerModuleStatus");
+        if (PlayerCtr.get() == nullptr)
         {
-            if (!isStopAndReset)
-            {
-                return false;
-            }
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerCtr.get() is nullptr!!");
+            return OHOS_FAILURE;
         }
-        return true;
+        PlayerCtr->Reset();
+
+        return OHOS_SUCCESS;
     }
 
     /*
@@ -315,15 +321,14 @@ namespace OHOS
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::RecordingPlayerPlay");
         /* -------------------------------- 获取播放器状态 ------------------------------- */
+        int32_t ret;
         int32_t state = GetRecordingPlayerState();
         if (state == OHOS_FAILURE)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");
             return OHOS_FAILURE;
         }
-
-        int ret;
-        if (state == PlayerStates::PLAYER_PAUSED || state == PlayerStates::PLAYER_STOPPED) // 暂停状态则直接开始
+        if (state == PlayerStates::PLAYER_PAUSED) // 暂停状态则直接开始
         {
             ret = PlayerCtr->Play();
             if (ret != 0)
@@ -334,7 +339,7 @@ namespace OHOS
             SetRecordingPlayButtonState(true); // 播放控件图形同步
             return OHOS_SUCCESS;
         }
-        else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) // 已经在播放状态则不做操作
+        else if (state == PlayerStates::PLAYER_STARTED) // 已经在播放状态则不做操作
         {
             return RECORDER_ALREADY_PLAYING;
         }
@@ -373,7 +378,11 @@ namespace OHOS
         {
             return RECORDER_ALREADY_STOPPED;
         }
-        else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE)
+        else if (state == PlayerStates::PLAYER_PLAYBACK_COMPLETE)
+        {
+            return RECORDER_PLAYBACK_COMPLETED;
+        }
+        else if (state == PlayerStates::PLAYER_STARTED)
         {
             int ret = PlayerCtr->Pause();
             if (ret != 0)
@@ -391,6 +400,136 @@ namespace OHOS
         return OHOS_SUCCESS;
     }
 
+    /*
+     * @brief 录音播放器停止
+     */
+    int RecordingModel::RecordingPlayerStop(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordingModel::RecordingPlayerStop");
+        int32_t state = GetRecordingPlayerState();
+        if (state == OHOS_FAILURE)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get state of player failed!!");
+            return OHOS_FAILURE;
+        }
+
+        if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE)
+        {
+            int ret = PlayerCtr->Stop();
+            if (ret != 0)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Stop err, ret:%d", ret);
+                return OHOS_FAILURE;
+            }
+            ret = PlayerCtr->Reset();
+            if (ret != 0)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Reset err, ret:%d", ret);
+                return OHOS_FAILURE;
+            }
+            else
+            {
+                isStopAndReset = true;
+                SetRecordingPlayButtonState(false);
+                SetCircleProgress(0);
+            }
+            AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);
+            return OHOS_SUCCESS;
+        }
+        else if (state == PlayerStates::PLAYER_PAUSED)
+        {
+            int ret = PlayerCtr->Reset();
+            if (ret != 0)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Reset err, ret:%d", ret);
+                return OHOS_FAILURE;
+            }
+            else
+            {
+                SetRecordingPlayButtonState(false);
+                SetCircleProgress(0);
+            }
+            AudioManager::GetInstance().DeactivateAudioInterrupt(interrupt);
+            return OHOS_SUCCESS;
+        }
+        else if (state == PlayerStates::PLAYER_STOPPED)
+        {
+            return RECORDER_ALREADY_STOPPED;
+        }
+        return OHOS_SUCCESS;
+    }
+
+    void RecordingModel::NextSong(int index)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " RecordingModel::NextSong");
+
+        std::string recordingFileName = fileNames[index];
+        if (recordingFileName.c_str() == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No Recording files!!");
+            return;
+        };
+        SetRecordingPlayerUri(directory + recordingFileName + ".mp3");
+        /* -------------------------------------------------------------------------- */
+        int32_t playerState = GetRecordingPlayerState();
+        if (playerState == OHOS_FAILURE)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get playerState of player failed!!");
+            return;
+        }
+        int ret;
+        if ((playerState == PlayerStates::PLAYER_STARTED) || (playerState == PlayerStates::PLAYER_PLAYBACK_COMPLETE))
+        {
+            /* start play */
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "start play, 160.");
+            ret = PlayerCtr->Stop(); // 停止
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Stop, ret:%d", ret);
+            ret = PlayerCtr->Reset();
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);
+            ret = RecordingPlayerStat(); // 播放
+            if (ret != 0)
+            {
+                /* stop and exit */
+                ret = PlayerCtr->Stop(); // 停止
+                ret = PlayerCtr->Reset();
+            }
+        }
+        else if (playerState == PlayerStates::PLAYER_PAUSED || (playerState == PlayerStates::PLAYER_IDLE) || PlayerStates::PLAYER_PAUSED)
+        {
+            ret = PlayerCtr->Reset();
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);
+        }
+        ret = RecordingPlayerStat();
+        if (ret != OHOS_SUCCESS)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);
+            return;
+        }
+        SetRecordingPlayButtonState(true); // 播放控件图形同步
+    }
+
+    /*
+     * @brief 上一首录音播放
+     */
+    void RecordingModel::PreviousPlayout(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PreviousPlayout, index %d.", GetClickRecordingIndex());
+        if ((GetClickRecordingIndex() > GetRecordingListNum() - 1) || (GetClickRecordingIndex() < 0))
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "currentIndex err");
+            KeepClickRecordingIndex(0);
+            return;
+        }
+        GetClickRecordingIndex()--; // 上一曲
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PreviousPlayout, index %d.", GetClickRecordingIndex());
+        if (GetClickRecordingIndex() < 0)
+        {
+            KeepClickRecordingIndex(GetRecordingListNum() - 1);
+        }
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PreviousPlayout, index %d.", GetClickRecordingIndex());
+        NextSong(GetClickRecordingIndex());
+    }
+
     /*
      * @brief 获取纯净.mp3后缀文件名
      * @param 文件路径
@@ -511,7 +650,7 @@ namespace OHOS
     /*
      * @brief 获取被点击录音下标
      */
-    int RecordingModel::GetClickRecordingIndex(void)
+    int &RecordingModel::GetClickRecordingIndex(void)
     {
         return index;
     }
index cb91343..33bcde0 100644 (file)
@@ -198,7 +198,7 @@ namespace OHOS
         PlayerProgressBar->SetCenterPosition(65, 65);\r
         PlayerProgressBar->SetRadius(65);\r
         PlayerProgressBar->SetEndAngle(360);\r
-        PlayerProgressBar->SetValue(20);\r
+        PlayerProgressBar->SetValue(0);\r
 \r
         return true;\r
     }\r
@@ -211,7 +211,7 @@ namespace OHOS
         RecordingPlayPauseButton = new UICheckBox();\r
         if (RecordingPlayPauseButton == nullptr)\r
         {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerView::PlayerProgressBar is new fail!");\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerView::RecordingPlayPauseButton is new fail!");\r
             return false;\r
         }\r
         RecordingPlayPauseButton->SetPosition(188, 188, 90, 90);\r
@@ -252,7 +252,7 @@ namespace OHOS
      */\r
     bool RecordingPlayerView::SetUpNextButton(void)\r
     {\r
-       \r
+\r
         ButtonConfig buttonconfig =\r
             {\r
                 .x = 346,\r
@@ -275,7 +275,7 @@ namespace OHOS
      */\r
     bool RecordingPlayerView::SetUpDeleteButton(void)\r
     {\r
-       \r
+\r
         ButtonConfig buttonconfig =\r
             {\r
                 .x = 117,\r
@@ -299,7 +299,7 @@ namespace OHOS
      */\r
     bool RecordingPlayerView::SetUpVolumeButton(void)\r
     {\r
-       \r
+\r
         ButtonConfig buttonconfig =\r
             {\r
                 .x = 270,\r
@@ -334,6 +334,30 @@ namespace OHOS
         return RecordingTimeAndDuration;\r
     }\r
 \r
+    /*\r
+     * @brief 获取播放器按钮\r
+     */\r
+    UICheckBox *RecordingPlayerView::GetPlayerButton(void)\r
+    {\r
+        return RecordingPlayPauseButton;\r
+    }\r
+\r
+    /*\r
+     * @brief 设置播放器按钮状态\r
+     */\r
+    void RecordingPlayerView::SetPlayerButtonState(UICheckBox::UICheckBoxState state)\r
+    {\r
+        RecordingPlayPauseButton->SetState(state);\r
+    }\r
+\r
+    /*\r
+     * @brief 获取录音播放进度条\r
+     */\r
+    UICircleProgress *RecordingPlayerView::GetPlayerProgressBar(void)\r
+    {\r
+        return PlayerProgressBar;\r
+    }\r
+\r
     UIScrollView *RecordingPlayerView::RecordingPlayerViewInit()\r
     {\r
         if (!SetUpScrollView())\r
@@ -382,7 +406,6 @@ namespace OHOS
         {\r
             return nullptr;\r
         }\r
-        RecordingModel::GetInstance()->RecordingPlayerInit();\r
         /* ----------------------------------- Add ---------------------------------- */\r
         RecordingPlayerViewScrollView->Add(RecordingPlayBackground);\r
         RecordingPlayerViewScrollView->Add(RecordingFileName);\r
index 22f3ba4..7204cb7 100644 (file)
@@ -7,6 +7,7 @@
 #include "../../../../../../drivers/peripheral/utils/custom_utils.h"\r
 #include "record/include/RecordingListitemView.h"\r
 #include <service/graphic_service.h>\r
+#include <unistd.h>\r
 \r
 namespace OHOS\r
 {\r
@@ -22,7 +23,10 @@ namespace OHOS
 \r
     RecordingPresenter::~RecordingPresenter()\r
     {\r
-\r
+        p_RecordingModel->GetPlayerCtr()->Stop();\r
+        p_RecordingModel->GetPlayerCtr()->Release();\r
+        p_RecordingModel->SetAudioInitStatus(false);\r
+        p_RecordingModel->GetPlayerCtr().reset();\r
         g_pRecordPresenter = nullptr;\r
     }\r
 \r
@@ -321,13 +325,42 @@ namespace OHOS
             return false;\r
         }\r
 \r
+        RecordingPlayerView *p_RecordingPlayerView = RecordingPlayerView::GetInstance();\r
+        if (p_RecordingPlayerView == nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerView GetInstance fail");\r
+            return false;\r
+        }\r
+\r
+        RecordingModel *p_RecordingModel = RecordingModel::GetInstance();\r
+        if (p_RecordingModel == nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "p_RecordingModel GetInstance fail");\r
+            return false;\r
+        }\r
+\r
         if (strcmp(view.GetViewId(), RECORD_PLAY_PROVE_BUTTON_VIEWID) == 0)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recording player prove button being clicked!");\r
+\r
+            // if (p_RecordingPlayerView->GetPlayerProgressBar() != nullptr)\r
+            // {\r
+            //     p_RecordingPlayerView->GetPlayerProgressBar()->SetValue(0); // 0:进度0%\r
+            //     p_RecordingPlayerView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);\r
+            //     p_RecordingPlayerView->GetPlayerProgressBar()->Invalidate();\r
+            // }\r
+            // p_RecordingModel->PreviousPlayout();\r
         }\r
         else if (strcmp(view.GetViewId(), RECORD_PLAY_NEXT_BUTTON_VIEWID) == 0)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recording player next button being clicked!");\r
+            // if (p_RecordingPlayerView->GetPlayerProgressBar() != nullptr)\r
+            // {\r
+            //     p_RecordingPlayerView->GetPlayerProgressBar()->SetValue(0); // 0:进度0%\r
+            //     p_RecordingPlayerView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);\r
+            //     p_RecordingPlayerView->GetPlayerProgressBar()->Invalidate();\r
+            // }\r
+            // p_RecordingModel->NextSong(p_RecordingModel->GetClickRecordingIndex() + 1);\r
         }\r
         else if (strcmp(view.GetViewId(), RECORD_PLAY_DELETE_BUTTON_VIEWID) == 0)\r
         {\r
@@ -356,12 +389,38 @@ namespace OHOS
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::~RecordingPlayerInterruptListener");\r
     }\r
     /*\r
+     * 函数的调用通常发生在音频播放器或者任何使用音频资源的应用程序遇到外部中断事件时。\r
+     * 这些中断事件可能包括电话来电、音乐播放器之间的音频焦点切换、系统声音(如闹钟)的播放,或者其他任何需要暂停当前活动以响应的情况。\r
      * @brief 处理录音播放器中断的方法,可能会根据传入的参数进行不同的操作。\r
+     * @param type 中断的类型\r
+     * @param hint 处理中断的额外提示\r
      */\r
     void RecordingPlayerInterruptListener::OnInterrupt(int32_t type, int32_t hint)\r
     {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::OnInterrupt");\r
-        \r
+        if (type == INTERRUPT_TYPE_BEGIN && hint == INTERRUPT_HINT_PAUSE) // 这表明当某个中断事件开始时,如果接收到暂停的提示,应当暂停播放器的播放。\r
+        {\r
+            PausePlayer();\r
+        }\r
+\r
+        if (type == INTERRUPT_TYPE_END && hint == INTERRUPT_HINT_RESUME) // 这意味着一旦中断事件结束,并且有指示可以恢复播放的提示,就尝试恢复播放器的播放。\r
+        {\r
+            ResumePlayer();\r
+        }\r
+\r
+        if (hint == INTERRUPT_HINT_STOP) // 只要提示为INTERRUPT_HINT_STOP,首先调用ResetFlag方法重置相关标志。\r
+        {\r
+            ResetFlag();\r
+            if (type == INTERRUPT_TYPE_BEGIN) // 这表示如果在中断开始时接收到停止的提示,应当停止播放器的播放并标记该事件。\r
+            {\r
+                isBeginStopped_ = true;\r
+                StopPlayer();\r
+            }\r
+            else if (type == INTERRUPT_TYPE_END) // 记录中断结束时播放器已被停止\r
+            {\r
+                isEndStopped_ = true;\r
+            }\r
+        }\r
     }\r
 \r
     /*\r
@@ -406,7 +465,7 @@ namespace OHOS
     /*\r
      * @brief 重置标志位\r
      */\r
-    void RecordingPlayerInterruptListener::RestFlag(void)\r
+    void RecordingPlayerInterruptListener::ResetFlag(void)\r
     {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::RestFlag");\r
 \r
@@ -474,14 +533,100 @@ namespace OHOS
 \r
     static void Pause(void)\r
     {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RecordingPlayerInterruptListener::PausePlayer] start");\r
+        int32_t state;\r
+        int32_t ret;\r
+        std::shared_ptr<RecordingPlayerInterruptListener> PlayerIntrptListener =\r
+            OHOS::RecordingModel::GetInstance()->GetRecordingPlayerIntrptListener();\r
+        if (PlayerIntrptListener == nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RecordingPlayerInterruptListener] PlayerIntrptListener is null");\r
+            return;\r
+        }\r
+\r
+        std::shared_ptr<Player> player = PlayerIntrptListener->GetPlayer();\r
+        if (player.get() == nullptr)\r
+        {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RecordingPlayerInterruptListener::PausePlayer] player is nullptr");\r
+            return;\r
+        }\r
+\r
+        RecordingPlayerView *p_RecordingPlayerView = RecordingPlayerView::GetInstance();\r
+\r
+        player->GetPlayerState(state);\r
+        if (state == PLAYER_STARTED)\r
+        {\r
+            ret = player->Pause();\r
+            if (ret == 0)\r
+            {\r
+                if (p_RecordingPlayerView == nullptr)\r
+                {\r
+                    RecordingModel::GetInstance()->SetRecordingPlayButtonState(false);\r
+                }\r
+                else\r
+                {\r
+                    p_RecordingPlayerView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);\r
+                    p_RecordingPlayerView->GetPlayerButton()->Invalidate();\r
+                }\r
+                PlayerIntrptListener->ResetFlag();\r
+                PlayerIntrptListener->SetPaused(true);\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RecordingPlayerInterruptListener::PausePlayer]");\r
+            }\r
+        }\r
     }\r
 \r
     static void Resume(void)\r
     {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RecordingPlayerInterruptListener::ResumePlayer] start");\r
+        int32_t state;\r
+        int32_t ret;\r
+        /* ----------------------------- 1.获取播放器中断监听器实例 ----------------------------- */\r
+        std::shared_ptr<RecordingPlayerInterruptListener> PlayerIntrptListener =\r
+            OHOS::RecordingModel::GetInstance()->GetRecordingPlayerIntrptListener();\r
+        if (PlayerIntrptListener == nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RecordingPlayerInterruptListener] PlayerIntrptListener is null");\r
+            return;\r
+        }\r
+        /* ------------------------------- 2.获取播放器实例 ------------------------------- */\r
+        std::shared_ptr<Player> player = PlayerIntrptListener->GetPlayer();\r
+        if (player.get() == nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RecordingPlayerInterruptListener::ResumePlayer] player is nullptr");\r
+            return;\r
+        }\r
+\r
+        /* ------------------------------- 3.获取播放器视图实例 ------------------------------ */\r
+        RecordingPlayerView *p_RecordingPlayerView = RecordingPlayerView::GetInstance();\r
+        /* --------------------------------- 4.检查播放器状态 -------------------------------- */\r
+        player->GetPlayerState(state);\r
+        if (state == PLAYER_PAUSED && PlayerIntrptListener->IsPaused() == true)\r
+        {\r
+            /* -------------------------------- 5.尝试恢复播放 -------------------------------- */\r
+            ret = player->Play();\r
+            if (ret == 0)\r
+            {\r
+                if (p_RecordingPlayerView == nullptr)\r
+                {\r
+                    RecordingModel::GetInstance()->SetRecordingPlayButtonState(true);\r
+                }\r
+                else\r
+                {\r
+                    p_RecordingPlayerView->SetPlayerButtonState(UICheckBox::UICheckBoxState::SELECTED);\r
+                    p_RecordingPlayerView->GetPlayerButton()->Invalidate();\r
+                }\r
+                /* ------------------------------- 6.重置中断监听器状态 ------------------------------ */\r
+                PlayerIntrptListener->ResetFlag();\r
+                PlayerIntrptListener->SetResumed(true);\r
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RecordingPlayerInterruptListener::ResumePlayer]");\r
+            }\r
+        }\r
     }\r
 \r
     static void Stop(void)\r
     {\r
+        RecordingModel::GetInstance()->RecordingPlayerStop();\r
+        RecordingModel::GetInstance()->ClearActivateAudioInterrupt();\r
     }\r
 \r
     /*\r
@@ -528,6 +673,19 @@ namespace OHOS
     {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::OnPlaybackComplete");\r
         /* --------------------------- 处实现代码用于处理文件播放完成的事件 --------------------------- */\r
+        // 此处实现代码用于处理文件播放完成的事件\r
+        RecordingPlayerView *p_RecordingPlayerView = RecordingPlayerView::GetInstance();\r
+        if (p_RecordingPlayerView != nullptr)\r
+        {\r
+            if (p_RecordingPlayerView->GetPlayerProgressBar() != nullptr)\r
+            {\r
+                p_RecordingPlayerView->GetPlayerProgressBar()->SetValue(100); // 100:进度100%\r
+                p_RecordingPlayerView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);\r
+                p_RecordingPlayerView->GetPlayerProgressBar()->Invalidate();\r
+            }\r
+        }\r
+        // RecordingModel::GetInstance()->ClearActivateAudioInterrupt();\r
+        // usleep(20000);\r
     }\r
 \r
     void RecordingPlayerCallbackImpl::OnError(int32_t errorType, int32_t errorCode)\r
index 9927e1a..535eba9 100644 (file)
@@ -287,6 +287,7 @@ namespace OHOS
         std::string RecordingTimeAndDuration = yyyymmhhh_date + "-" + TotalRecordDuration;\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingTimeAndDuration %s\n", RecordingTimeAndDuration.c_str());\r
         p_RecordingPlayerView->GetRecordingTimeAndDurationLabel()->SetText(RecordingTimeAndDuration.c_str());\r
+        p_RecordingPlayerView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);\r
         return true;\r
     }\r
 \r