录音播放和暂停功能实现,还有bug
authorluozheng <1732036298@qq.com>
Mon, 11 Mar 2024 11:44:54 +0000 (19:44 +0800)
committerluozheng <1732036298@qq.com>
Mon, 11 Mar 2024 11:44:54 +0000 (19:44 +0800)
1.播放完录音后,再次播放,播放不了,猜测是录音播放完后没有resume

code/sdk/application/wearable/fd230app/nativeui/phone/include/PhoneCallupPresenter.h
code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingPresenter.h
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordListView.cpp
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingListAdapter.cpp
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingListitemView.cpp
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 97b51b2..b7b32cf 100644 (file)
@@ -31,7 +31,7 @@ namespace OHOS
         // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;\r
         bool OnClick(UIView &view, const ClickEvent &event) override;\r
         bool OnDrag(UIView &view, const DragEvent &event) override;\r
-        bool OnLongPress(UIView &view, const LongPressEvent &event);\r
+        bool OnLongPress(UIView &view, const LongPressEvent &event) override;\r
     };\r
 } // namespace OHOS\r
 \r
index 3a2c4ce..e273b42 100644 (file)
@@ -5,7 +5,7 @@
 #include "RecordingView.h"\r
 #include "KeyInputListener.h"\r
 #include "common/key_code.h"\r
-\r
+#include "record/include/RecordingModel.h"\r
 namespace OHOS\r
 {\r
     typedef enum\r
@@ -36,6 +36,51 @@ 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
+    class RecordingPlayerInterruptListener : public InterruptListener\r
+    {\r
+    public:\r
+        RecordingPlayerInterruptListener();\r
+        ~RecordingPlayerInterruptListener();\r
+\r
+        void SetOwner(std::shared_ptr<Player> player);\r
+        void SetPaused(bool value);\r
+        void SetResumed(bool value);\r
+        void RestFlag();\r
+        bool IsPaused();\r
+        bool IsDelayed();\r
+        bool IsResumed();\r
+        bool IsBeginStopped();\r
+        bool IsEndStopped();\r
+        void OnInterrupt(int32_t type, int32_t hint) override;\r
+        void PausePlayer(void);\r
+        void ResumePlayer(void);\r
+        void StopPlayer(void);\r
+        std::shared_ptr<Player> GetPlayer();\r
+\r
+    private:\r
+        std::shared_ptr<Player> player_{nullptr};\r
+        bool isPaused_{false};       // 是否处于暂停状态\r
+        bool isDelayed_{false};      // 是否处于延迟状态\r
+        bool isResumed_{false};      // 是否已恢复播放状态\r
+        bool isBeginStopped_{false}; // 是否处于已开始停止状态\r
+        bool isEndStopped_{false};   // 是否处于已结束停止状态\r
+    };\r
+\r
+    // 播放器回调\r
+    class RecordingPlayerCallbackImpl : public OHOS::Media::PlayerCallback\r
+    {\r
+    public:\r
+        RecordingPlayerCallbackImpl();\r
+        ~RecordingPlayerCallbackImpl();\r
+        void OnPlaybackComplete();\r
+        void OnError(int32_t errorType, int32_t errorCode);\r
+        void OnInfo(int type, int extra);\r
+        void OnRewindToComplete();\r
+\r
+    private:\r
+    };\r
+\r
     /*\r
      *录音播放器界面点击监听类\r
      */\r
@@ -52,7 +97,7 @@ namespace OHOS
     /*\r
      *录音列表视图监听类\r
      */\r
-    class RecordListViewListener : public UIView::OnClickListener,public UIView::OnDragListener\r
+    class RecordListViewListener : public UIView::OnClickListener, public UIView::OnDragListener\r
     {\r
     public:\r
         RecordListViewListener() {}\r
@@ -63,6 +108,7 @@ namespace OHOS
         bool OnDrag(UIView &view, const DragEvent &event) override;\r
     };\r
 \r
+    class RecordingModel;\r
     class RecordingView;\r
     class RecordingPresenter : public Presenter<RecordingView>,\r
                                public UIView::OnClickListener,\r
@@ -90,6 +136,7 @@ namespace OHOS
         bool OnDragEnd(UIView &view, const DragEvent &event) override;\r
         bool OnChange(UICheckBox::UICheckBoxState state) override;\r
         bool OnKeyAct(UIView &view, const KeyEvent &event) override;\r
+        RecordingModel *p_RecordingModel{nullptr};\r
     };\r
 }\r
 \r
index c4d6353..3fd5f30 100644 (file)
@@ -172,11 +172,11 @@ namespace OHOS
         recordList->SetDraggable(true);\r
         recordList->SetMaxScrollDistance(1000); // 设置手指抬起屏幕后的最大滚动距离。\r
         recordList->SetReboundSize(50);\r
-        recordList->SetYScrollBarVisible(true); // 设置 Y 轴滚动条是否可见。\r
+        //recordList->SetYScrollBarVisible(true); // 设置 Y 轴滚动条是否可见。\r
         recordList->SetIntercept(true);         // 设置是否拦截输入事件。如果被截获,视图在本地处理后不会将输入事件传递给父视图。\r
-        \r
         InitRecordingInfo();\r
         recordList->SetAdapter(p_RecordingListAdapter);\r
+        recordList->RefreshList();\r
         RecordListScrollView->Add(recordList);\r
         return true;\r
     }\r
index a558f12..29f7df8 100644 (file)
@@ -80,6 +80,6 @@ namespace OHOS
 
     void RecordingListAdapter::AddListItem(const RecordingListItem &item)
     {
-        listData.push_front(item);
+        listData.push_back(item);
     }
 }
\ No newline at end of file
index cfb483c..2f2888c 100644 (file)
@@ -6,7 +6,7 @@ namespace OHOS
 
     RecordingListitemView::RecordingListitemView()
     {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingListitemView::RecordingListitemView");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordingListitemView::RecordingListitemView");
         SetPosition(43, 100, 380, 120);
         SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
         SetStyle(STYLE_BACKGROUND_OPA, 255);
@@ -20,7 +20,7 @@ namespace OHOS
 
     RecordingListitemView::~RecordingListitemView()
     {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingListitemView::~RecordingListitemView");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordingListitemView::~RecordingListitemView");
         Remove(&m_button);
         Remove(&m_recordId);
         Remove(&m_recordTotalTime);
@@ -29,7 +29,7 @@ namespace OHOS
 
     void RecordingListitemView::SetItemInfo(const RecordingListItem itemInfo)
     {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingListitemView::SetItemInfo");
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordingListitemView::SetItemInfo");
         m_ItemInfo = itemInfo;
         m_recordId.SetText(itemInfo.recordId);
         m_recordTotalTime.SetText(itemInfo.recordTotalTime);
index 209c9ed..16c3bfd 100644 (file)
@@ -1,5 +1,6 @@
 #include "record/include/RecordingModel.h"
-
+#include "record/include/RecordGoingView.h"
+#include "record/include/RecordingPresenter.h"
 #include "thread_adapter.h"
 #include "UiConfig.h"
 #include "bts_a2dp_source.h"
@@ -8,9 +9,17 @@
 #include "custom_utils.h"
 #include <cmsis_os2.h>
 #include <service/graphic_service.h>
-#include "record/include/RecordGoingView.h"
 namespace OHOS
 {
+    // 声明定时器变量
+    osTimerId_t g_timer = NULL;
+    static int g_RecordingTimes = {0};
+    static constexpr int32 NUM_TEN = 10;
+    static constexpr int16 ERROR = 0;
+    static constexpr int16 SUCCESS = 1;
+    static constexpr int16 NUM_TIME_MIN = 60;
+    static constexpr int16 NUM_TIME_HOUR = 3600;
+    static constexpr int32 NUM_TIME_DAY = 86400;
 
     static MutexId g_mutex;
     RecordingModel::RecordingModel()
@@ -28,16 +37,19 @@ namespace OHOS
         return &instance;
     }
 
-    /// @brief 获取录音播放器Uri
-    /// @param  void
-    /// @return 文件路径
+    /*
+     * @brief 获取录音播放器Uri
+     * @return 文件路径
+     */
     std::string RecordingModel::GetRecordingPlayerUri(void)
     {
         return Uri;
     }
 
-    /// @brief 设置录音播放器Uri
-    /// @param src 文件路径
+    /*
+     * @brief 设置录音播放器Uri
+     * @param src 文件路径
+     */
     void RecordingModel::SetRecordingPlayerUri(std::string src)
     {
         Uri = src;
@@ -45,29 +57,99 @@ namespace OHOS
 
     /// @brief 设置录音播放按钮状态
     /// @param state true
+
+    /*
+     * @brief 设置录音播放按钮状态
+     * @param state true 开启
+     * @param state false 关闭
+     */
     void RecordingModel::SetRecordingPlayButtonState(bool state)
     {
         PlayButtonState = state;
     }
-    // 播放器状态的控制
-    int RecordingModel::RecordingPlayerStat()
+
+    /*
+     * @brief 初始化音频系统并准备播放器控制器和回调
+     */
+    void RecordingModel::AudioInit(void)
     {
-        /* ------------------------------ 1.设置播放器的回调函数。 ----------------------------- */
-        // 设置回调函数
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::AudioInit");
+        /* ---------- 检查一个成员变量 audioInitStatus 是否已经是 true。如果是,这表示音频已经初始化过了。 --------- */
+        if (audioInitStatus == true)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "The audio has already been initialized!!");
+            return;
+        }
+        AudioManager &amInstance = AudioManager::GetInstance();
+        audioInitStatus = amInstance.Initialize();
+        /* --------------------------- 步骤 1 播放器模块进行初始化并创建一个播放实例 -------------------------- */
+        PlayerCtr = std::make_shared<Player>();
+        if (PlayerCtr == nullptr || PlayerCtr.get() == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerCtr is nullptr!!");
+            return;
+        }
+        /* -------------------------------- 播放器回调初始化 -------------------------------- */
+        PlayerCallback = std::make_shared<RecordingPlayerCallbackImpl>();
+        if (PlayerCallback.get() == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerCallback new fail!!");
+            return;
+        }
+    }
+
+    /*
+     * @brief 将录音时长转换成时分秒
+     */
+    void RecordingModel::ConvertMillisecondToTime(int32_t milliseconds)
+    {
+        int seconds = (milliseconds / 1000) % 60;
+        int minutes = (milliseconds / (1000 * 60)) % 60;
+        int hours = milliseconds / (1000 * 60 * 60);
+
+        if (hours == 0)
+        {
+            char buffer[10]; // 足够存放 "00:00\0" 的字符数组
+            sprintf(buffer, "%02d:%02d", minutes, seconds);
+            KeepTotalRecordDuration(buffer);
+        }
+        else
+        {
+            char buffer[12]; // 足够存放 "00:00:00\0" 的字符数组
+            sprintf(buffer, "%02d:%02d:%02d", hours, minutes, seconds);
+            KeepTotalRecordDuration(buffer);
+        }
+    }
+
+    /*
+     *  @brief 录音播放初始化,包括录音文件名,创建资源对象,录音时间和总时长
+     */
+    int RecordingModel::RecordingPlayerInit(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::RecordingPlayerInit");
+        int32_t ret;
+        std::string recordingFileName = fileNames[GetClickRecordingIndex()];
+        if (recordingFileName.c_str() == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No Recording files!!");
+            return OHOS_FAILURE;
+        };
+        Uri = directory + recordingFileName + ".mp3";
+        /* ------------------------------ 设置播放器的回调函数。 ----------------------------- */
         PlayerCtr->SetPlayerCallback(PlayerCallback);
-        /* ------------------------- 2.创建资源对象Resource并进行资源申请。 ------------------------- */
-        Resource = std::make_shared<Source>(Uri, Header);
+        /* ------------------------- 创建资源对象Resource并进行资源申请。 ------------------------- */
+        Resource = std::make_shared<Source>(Uri);
         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());
-        /* ----------------------- 3.设置播放器的数据源为Resource,并进行准备操作。 ---------------------- */
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Player Uri %s", Uri.c_str());
+        /* ----------------------- 设置播放器的数据源为Resource,并进行准备操作。 ---------------------- */
         PlayerCtr->SetSource(*Resource);
         PlayerCtr->Prepare();
-        /* ------------------------------ 4.获取播放内容的时长。 ------------------------------ */
-        int32_t ret = PlayerCtr->GetDuration(DurationTime);
+        /* ------------------------------ 获取播放内容的时长。 ------------------------------ */
+        ret = PlayerCtr->GetDuration(DurationTime);
         if (ret != -1)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[%s,%d] GetDuration:%lld, ret:%d", __func__, __LINE__, DurationTime, ret);
@@ -77,7 +159,18 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get Duration time fail!");
             return OHOS_FAILURE;
         }
-        /* ----------------------------- 5.如果未激活音频中断处理: ----------------------------- */
+        ConvertMillisecondToTime(DurationTime);
+
+        return OHOS_SUCCESS;
+    }
+
+    /*
+     * @brief 播放器状态的控制
+     */
+    int RecordingModel::RecordingPlayerStat()
+    {
+        int ret;
+        /* ----------------------------- 如果未激活音频中断处理: ----------------------------- */
         if (!IsActivateAudioInterrupt)
         {
             /* -------------------------------- 申请音频会话ID。 -------------------------------- */
@@ -85,10 +178,10 @@ namespace OHOS
             SessionId = amIntance.MakeSessionId();
             if (SessionId == AUDIO_SESSION_ID_NONE)
             {
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SessionId invalid");
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SessionId invalid");
                 return OHOS_FAILURE;
             }
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MakeSessionId  %d", SessionId);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MakeSessionId  %d", SessionId);
             /* ----------------------------- 创建并设置播放器中断监听器。 ----------------------------- */
             p_RecordingPlayerInterruptListener = std::make_shared<RecordingPlayerInterruptListener>();
             if (p_RecordingPlayerInterruptListener.get() == nullptr)
@@ -105,7 +198,7 @@ namespace OHOS
                     std::shared_ptr<InterruptListener> interruptListener;理音频中断事件的监听器
                 };
             */
-            interrupt = {AUDIO_STREAM_VOICE_RECORD, SessionId, p_RecordingPlayerInterruptListener};
+            interrupt = {AUDIO_STREAM_MUSIC, SessionId, p_RecordingPlayerInterruptListener};
             /* --------------------------- 激活音频中断处理,设置超时时间为5秒 --------------------------- */
             // 激活音频中断 5s超时
             if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED)
@@ -115,9 +208,9 @@ namespace OHOS
             }
             IsActivateAudioInterrupt = true;
         }
-        /* ----------------------------- 6.设置播放器的音频会话ID。 ---------------------------- */
+        /* ----------------------------- 设置播放器的音频会话ID。 ---------------------------- */
         PlayerCtr->SetAudioSessionId(SessionId);
-        /* ---------------------------- 7.开始播放内容,如果播放失败: ---------------------------- */
+        /* ---------------------------- 开始播放内容,如果播放失败: ---------------------------- */
         ret = PlayerCtr->Play();
         if (ret != 0)
         {
@@ -129,9 +222,173 @@ namespace OHOS
         return OHOS_SUCCESS;
     }
 
-    void RecordingPlayerInterruptListener::SetOwner(std::shared_ptr<Player> player)
+    /*
+     * @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 获取录音播放器状态
+     */
+    int RecordingModel::GetRecordingPlayerState(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RecordingModel] GetRecordingPlayerState");
+        /* ------------------------------ 检查播放器控制对象是否为空 ----------------------------- */
+        if (PlayerCtr.get() == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "playerCtr.get() is nullptr!!");
+            return OHOS_FAILURE;
+        }
+        int32_t state;
+        PlayerCtr->GetPlayerState(state);
+        return state;
+    }
+
+    /*
+     * @brief 判断播录音放器是否已经播放过
+     */
+    bool RecordingModel::HasRecordingPlayerPlayed(void)
     {
-        player_ = player;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[RecordingModel] HasRecordingPlayerPlayed");
+        int state = GetRecordingPlayerState();
+        if (state == OHOS_FAILURE)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Get Player State failed!!");
+            return false;
+        }
+        if (state != PlayerStates::PLAYER_STARTED && state != PlayerStates::PLAYER_PAUSED &&
+            state != PlayerStates::PLAYER_STOPPED && state != PlayerStates::PLAYER_PLAYBACK_COMPLETE)
+        {
+            if (!isStopAndReset)
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /*
+     * @brief 录音播放器播放
+     */
+    int RecordingModel::RecordingPlayerPlay(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::RecordingPlayerPlay");
+        /* -------------------------------- 获取播放器状态 ------------------------------- */
+        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) // 暂停状态则直接开始
+        {
+            ret = PlayerCtr->Play();
+            if (ret != 0)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Play err, ret:%d", ret);
+                return OHOS_FAILURE;
+            }
+            SetRecordingPlayButtonState(true); // 播放控件图形同步
+            return OHOS_SUCCESS;
+        }
+        else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE) // 已经在播放状态则不做操作
+        {
+            return RECORDER_ALREADY_PLAYING;
+        }
+        else // 其它情况的处理
+        {
+            ret = RecordingPlayerStat();
+            if (ret != OHOS_SUCCESS)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerStat err, ret:%d", ret);
+                return OHOS_FAILURE;
+            }
+            SetRecordingPlayButtonState(true); // 播放控件图形同步
+            return OHOS_SUCCESS;
+        }
+    }
+
+    /*
+     * @brief 录音播放器暂停
+     */
+    int RecordingModel::RecordingPlayerPause(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::RecordingPlayerPause");
+        /* -------------------------------- 获取播放器状态 ------------------------------- */
+        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_PAUSED) // 暂停状态则不操作
+        {
+            return RECORDER_ALREADY_PAUSED;
+        }
+        else if (state == PlayerStates::PLAYER_STOPPED) // 停止状态则不操作
+        {
+            return RECORDER_ALREADY_STOPPED;
+        }
+        else if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PLAYBACK_COMPLETE)
+        {
+            int ret = PlayerCtr->Pause();
+            if (ret != 0)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Pause err, ret:%d!!", ret);
+                return OHOS_FAILURE;
+            }
+            else
+            {
+                SetRecordingPlayButtonState(false);
+                return OHOS_SUCCESS;
+            }
+        }
+
+        return OHOS_SUCCESS;
     }
 
     /*
@@ -267,25 +524,31 @@ namespace OHOS
         return fileNames;
     }
 
+    /*
+     * @brief 保存录音时长
+     */
     void RecordingModel::KeepTotalRecordDuration(std::string time)
     {
         TotalRecordDuration = time;
     }
 
-    const char *RecordingModel::GetTotalRecordDuration(void)
+    /*
+     * @brief 获取录音时长
+     */
+    std::string RecordingModel::GetTotalRecordDuration(void) const
+    {
+        return TotalRecordDuration;
+    }
+
+    /*
+     * @brief 获取录音年月日时间
+     */
+    std::string RecordingModel::Getyyyymmhhh_date(void) const
     {
-        return TotalRecordDuration.c_str();
+        return yyyymmhhh_date;
     }
+
     /* ----------------------------------- 定时器 ---------------------------------- */
-    // 声明定时器变量
-    osTimerId_t g_timer = NULL;
-    static int g_RecordingTimes = {0};
-    static constexpr int32 NUM_TEN = 10;
-    static constexpr int16 ERROR = 0;
-    static constexpr int16 SUCCESS = 1;
-    static constexpr int16 NUM_TIME_MIN = 60;
-    static constexpr int16 NUM_TIME_HOUR = 3600;
-    static constexpr int32 NUM_TIME_DAY = 86400;
 
     /*
      * @brief 显示录音时长
index 0ab7dd7..cb91343 100644 (file)
@@ -1,5 +1,6 @@
 #include "record/include/RecordingPlayerView.h"\r
 #include "record/include/RecordingPresenter.h"\r
+#include "record/include/RecordingModel.h"\r
 #include "wearable_log.h"\r
 #include "UiConfig.h"\r
 \r
@@ -381,6 +382,7 @@ namespace OHOS
         {\r
             return nullptr;\r
         }\r
+        RecordingModel::GetInstance()->RecordingPlayerInit();\r
         /* ----------------------------------- Add ---------------------------------- */\r
         RecordingPlayerViewScrollView->Add(RecordingPlayBackground);\r
         RecordingPlayerViewScrollView->Add(RecordingFileName);\r
index eca43d3..22f3ba4 100644 (file)
@@ -3,10 +3,10 @@
 #include "graphic_math.h"\r
 #include "string.h"\r
 #include "record/include/RecordingPresenter.h"\r
-#include "record/include/RecordingModel.h"\r
 #include <wearable_log.h>\r
 #include "../../../../../../drivers/peripheral/utils/custom_utils.h"\r
 #include "record/include/RecordingListitemView.h"\r
+#include <service/graphic_service.h>\r
 \r
 namespace OHOS\r
 {\r
@@ -16,6 +16,7 @@ namespace OHOS
 \r
     RecordingPresenter::RecordingPresenter()\r
     {\r
+        p_RecordingModel = RecordingModel::GetInstance();\r
         g_pRecordPresenter = this;\r
     }\r
 \r
@@ -34,7 +35,8 @@ namespace OHOS
     void RecordingPresenter::OnStart()\r
     {\r
         // 初始化录音信息\r
-        RecordingModel::GetInstance()->InitRecordingListItem();\r
+        p_RecordingModel->InitRecordingListItem();\r
+        p_RecordingModel->AudioInit();\r
         Presenter<RecordingView>::OnStart();\r
         ScreenAlwaysOnCtr(1);\r
     }\r
@@ -80,7 +82,7 @@ namespace OHOS
                     {\r
                         NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);\r
                     }\r
-                    else if(i == RECORDINGPLAYERVIEW)\r
+                    else if (i == RECORDINGPLAYERVIEW)\r
                     {\r
                         p_RecordingView->ChangeView(i, RECORDINGLISTVIEW);\r
                     }\r
@@ -186,7 +188,7 @@ namespace OHOS
             AudioCaptureSample(6, (const char **)args);\r
             /* --------------------------------- 跳转到录音界面 -------------------------------- */\r
             p_RecordingView->ChangeView(RECORDINGVIEW, RECORDGOINGVIEW);\r
-            RecordingModel::GetInstance()->Recording_StartTimer(1000);\r
+            p_RecordingModel->Recording_StartTimer(1000);\r
             RecordGoingView::GetInstance()->GetRecordingDurationLabel()->SetText("00:00:00");\r
             /* ---------------------------------- 释放内存 ---------------------------------- */\r
             for (int i = 0; i < 6; ++i)\r
@@ -203,12 +205,11 @@ namespace OHOS
             uint8_t *argv = (uint8_t *)"stop";\r
             AudioCaptureSample(argc, (const char **)&argv);\r
             p_RecordingView->ChangeView(RECORDGOINGVIEW, RECORDINGVIEW);\r
-            RecordingModel::GetInstance()->Recording_StopTimer();\r
+            p_RecordingModel->Recording_StopTimer();\r
             return true;\r
         }\r
         else if (strcmp(view.GetViewId(), RECORD_DELETE_ON_BUTTON_VIEWID) == 0)\r
         {\r
-            RecordingModel *p_RecordingModel = RecordingModel::GetInstance();\r
             std::string fileName = "/user/res/record/recording/" + p_RecordingModel->GetFileNames()[p_RecordingModel->GetClickRecordingIndex()] + ".mp3";\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "fileName:%s\n", fileName.c_str());\r
             deleteFile(fileName.c_str());\r
@@ -233,11 +234,11 @@ namespace OHOS
         {\r
         case UICheckBox::SELECTED:\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recording play start");\r
-\r
+            p_RecordingModel->RecordingPlayerPlay();\r
             break;\r
         case UICheckBox::UNSELECTED:\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recording play stop");\r
-\r
+            p_RecordingModel->RecordingPlayerPause();\r
             break;\r
         default:\r
             break;\r
@@ -269,14 +270,21 @@ namespace OHOS
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordListViewListener::OnClick is no index");\r
             return false;\r
         }\r
-        // 保存被点击录音下标\r
+        /* -------------------------------- 保存被点击录音下标 ------------------------------- */\r
         RecordingModel *p_RecordingModel = RecordingModel::GetInstance();\r
-        p_RecordingModel->KeepClickRecordingIndex(index);\r
         if (p_RecordingModel == nullptr)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel GetInstance fail");\r
             return false;\r
         }\r
+        p_RecordingModel->KeepClickRecordingIndex(index);\r
+        /* ------------------------ 录音播放初始化,包括录音文件名,录音时间和总时长 ------------------------ */\r
+        if (p_RecordingModel->RecordingPlayerInit() != OHOS_SUCCESS)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "p_RecordingModel->RecordingPlayerInit fail!!");\r
+            return false;\r
+        }\r
+        /* ---------------------------------- 切换到录音播放界面 ---------------------------------- */\r
         RecordingView *p_RecordingView = RecordingView::GetInstance();\r
         if (p_RecordingView == nullptr)\r
         {\r
@@ -333,4 +341,210 @@ namespace OHOS
         }\r
         return true;\r
     }\r
+\r
+    /* -------------------- RecordingPlayerInterruptListener -------------------- */\r
+    /*\r
+     * @brief 音频中断类的构造函数\r
+     */\r
+    RecordingPlayerInterruptListener::RecordingPlayerInterruptListener()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::RecordingPlayerInterruptListener");\r
+    }\r
+\r
+    RecordingPlayerInterruptListener::~RecordingPlayerInterruptListener()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::~RecordingPlayerInterruptListener");\r
+    }\r
+    /*\r
+     * @brief 处理录音播放器中断的方法,可能会根据传入的参数进行不同的操作。\r
+     */\r
+    void RecordingPlayerInterruptListener::OnInterrupt(int32_t type, int32_t hint)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::OnInterrupt");\r
+        \r
+    }\r
+\r
+    /*\r
+     * @brief 获取与该监听器相关联的播放器。\r
+     */\r
+    std::shared_ptr<Player> RecordingPlayerInterruptListener::GetPlayer()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::GetPlayer");\r
+\r
+        return player_;\r
+    }\r
+\r
+    /*\r
+     * @brief 设置录音播放器的所有者。\r
+     */\r
+    void RecordingPlayerInterruptListener::SetOwner(std::shared_ptr<Player> player)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::SetOwner");\r
+\r
+        player_ = player;\r
+    }\r
+\r
+    /*\r
+     * @brief 设置播放器是否处于暂停状态\r
+     */\r
+    void RecordingPlayerInterruptListener::SetPaused(bool value)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::SetPaused");\r
+\r
+        isPaused_ = value;\r
+    }\r
+\r
+    /*\r
+     * @brief 设置播放器是否已恢复播放状态。\r
+     */\r
+    void RecordingPlayerInterruptListener::SetResumed(bool value)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::SetResumed");\r
+        isResumed_ = value;\r
+    }\r
+\r
+    /*\r
+     * @brief 重置标志位\r
+     */\r
+    void RecordingPlayerInterruptListener::RestFlag(void)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::RestFlag");\r
+\r
+        isPaused_ = false;\r
+        isDelayed_ = false;\r
+        isResumed_ = false;\r
+        isBeginStopped_ = false;\r
+        isEndStopped_ = false;\r
+    }\r
+\r
+    /*\r
+     * @brief 返回播放器是否处于暂停状态的布尔值\r
+     */\r
+    bool RecordingPlayerInterruptListener::IsPaused()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::IsPaused");\r
+\r
+        return isPaused_;\r
+    }\r
+\r
+    /*\r
+     * @brief 返回播放器是否处于延迟状态的布尔值。\r
+     */\r
+    bool RecordingPlayerInterruptListener::IsDelayed()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::IsDelayed");\r
+\r
+        return isDelayed_;\r
+    }\r
+\r
+    /*\r
+     * @brief 返回播放器是否已恢复播放状态的布尔值\r
+     */\r
+    bool RecordingPlayerInterruptListener::IsResumed()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::IsDelayed");\r
+\r
+        return isResumed_;\r
+    }\r
+\r
+    /*\r
+     * @brief 返回播放器是否已开始停止的布尔值。\r
+     */\r
+    bool RecordingPlayerInterruptListener::IsBeginStopped()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::IsBeginStopped");\r
+\r
+        return isBeginStopped_;\r
+    }\r
+\r
+    /*\r
+     * @brief 返回播放器是否已结束停止的布尔值。\r
+     */\r
+    bool RecordingPlayerInterruptListener::IsEndStopped()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::IsEndStopped");\r
+\r
+        return isEndStopped_;\r
+    }\r
+\r
+    static void PlayerPostGraphicEvent(void (*fun)(void))\r
+    {\r
+        GraphicService::GetInstance()->PostGraphicEvent(*fun);\r
+    }\r
+\r
+    static void Pause(void)\r
+    {\r
+    }\r
+\r
+    static void Resume(void)\r
+    {\r
+    }\r
+\r
+    static void Stop(void)\r
+    {\r
+    }\r
+\r
+    /*\r
+     * @brief 暂停播放器\r
+     */\r
+    void RecordingPlayerInterruptListener::PausePlayer(void)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::PausePlayer");\r
+\r
+        PlayerPostGraphicEvent(Pause);\r
+    }\r
+\r
+    /*\r
+     * @brief 恢复播放器。\r
+     */\r
+    void RecordingPlayerInterruptListener::ResumePlayer(void)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::ResumePlayer");\r
+\r
+        PlayerPostGraphicEvent(Resume);\r
+    }\r
+\r
+    /*\r
+     * @brief 停止播放器\r
+     */\r
+    void RecordingPlayerInterruptListener::StopPlayer(void)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::StopPlayer");\r
+\r
+        PlayerPostGraphicEvent(Stop);\r
+    }\r
+    /* ---------------------------------- 播放器回调 --------------------------------- */\r
+    RecordingPlayerCallbackImpl::RecordingPlayerCallbackImpl()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::RecordingPlayerCallbackImpl");\r
+    }\r
+\r
+    RecordingPlayerCallbackImpl::~RecordingPlayerCallbackImpl()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::~RecordingPlayerCallbackImpl");\r
+    }\r
+\r
+    void RecordingPlayerCallbackImpl::OnPlaybackComplete()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::OnPlaybackComplete");\r
+        /* --------------------------- 处实现代码用于处理文件播放完成的事件 --------------------------- */\r
+    }\r
+\r
+    void RecordingPlayerCallbackImpl::OnError(int32_t errorType, int32_t errorCode)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::OnError");\r
+        /* ------------------------------ 此处实现代码用于处理错误事件 ------------------------------ */\r
+    }\r
+\r
+    void RecordingPlayerCallbackImpl::OnInfo(int type, int extra)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::OnInfo");\r
+        /* ------------------------------- 此处实现代码用于处理普通事件 ------------------------------ */\r
+    }\r
+\r
+    void RecordingPlayerCallbackImpl::OnRewindToComplete()\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::OnRewindToComplete");\r
+        /* ---------------------------- 此处实现代码用于处理进度控制完成的事件 ---------------------------- */\r
+    }\r
 }
\ No newline at end of file
index e70eb18..9927e1a 100644 (file)
@@ -277,6 +277,16 @@ namespace OHOS
         }\r
         // 设置“录音播放器”【录音文件名标签】的"文本内容"为被点击的"录音"的录音名\r
         p_RecordingPlayerView->GetRecordingFileNameLabel()->SetText(RecordingModel::GetInstance()->GetFileNames()[RecordingModel::GetInstance()->GetClickRecordingIndex()].c_str());\r
+        std::string yyyymmhhh_date = RecordingModel::GetInstance()->Getyyyymmhhh_date();\r
+        std::string TotalRecordDuration = RecordingModel::GetInstance()->GetTotalRecordDuration();\r
+        // 去掉日期字符串末尾的换行符\r
+        if (!yyyymmhhh_date.empty() && yyyymmhhh_date.back() == '\n')\r
+        {\r
+            yyyymmhhh_date.erase(yyyymmhhh_date.length() - 1);\r
+        }\r
+        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
         return true;\r
     }\r
 \r