From: luozheng <1732036298@qq.com> Date: Mon, 11 Mar 2024 11:44:54 +0000 (+0800) Subject: 录音播放和暂停功能实现,还有bug X-Git-Tag: release_V1.2.70_20241020_135402~1274^2~19^2~4 X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=810d752e9ec93311f844263bdb70769814e1898c;p=mirrors%2FFD230.git 录音播放和暂停功能实现,还有bug 1.播放完录音后,再次播放,播放不了,猜测是录音播放完后没有resume --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/phone/include/PhoneCallupPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/phone/include/PhoneCallupPresenter.h index 97b51b2dc..b7b32cfe5 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/phone/include/PhoneCallupPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/phone/include/PhoneCallupPresenter.h @@ -31,7 +31,7 @@ namespace OHOS // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承; bool OnClick(UIView &view, const ClickEvent &event) override; bool OnDrag(UIView &view, const DragEvent &event) override; - bool OnLongPress(UIView &view, const LongPressEvent &event); + bool OnLongPress(UIView &view, const LongPressEvent &event) override; }; } // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingPresenter.h b/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingPresenter.h index 3a2c4ce46..e273b4280 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingPresenter.h +++ b/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingPresenter.h @@ -5,7 +5,7 @@ #include "RecordingView.h" #include "KeyInputListener.h" #include "common/key_code.h" - +#include "record/include/RecordingModel.h" namespace OHOS { typedef enum @@ -36,6 +36,51 @@ namespace OHOS static const char *RECORD_DELETE_ON_BUTTON_VIEWID = "RECORD_DELETE_ON_BUTTON"; // 录音删除 static const char *RECORD_DELETE_OFF_BUTTON_VIEWID = "RECORD_DELETE_OFF_BUTTON"; // 录音不删除 +// 播放器中断监听 + class RecordingPlayerInterruptListener : public InterruptListener + { + public: + RecordingPlayerInterruptListener(); + ~RecordingPlayerInterruptListener(); + + void SetOwner(std::shared_ptr player); + void SetPaused(bool value); + void SetResumed(bool value); + void RestFlag(); + bool IsPaused(); + bool IsDelayed(); + bool IsResumed(); + bool IsBeginStopped(); + bool IsEndStopped(); + void OnInterrupt(int32_t type, int32_t hint) override; + void PausePlayer(void); + void ResumePlayer(void); + void StopPlayer(void); + std::shared_ptr GetPlayer(); + + private: + std::shared_ptr player_{nullptr}; + bool isPaused_{false}; // 是否处于暂停状态 + bool isDelayed_{false}; // 是否处于延迟状态 + bool isResumed_{false}; // 是否已恢复播放状态 + bool isBeginStopped_{false}; // 是否处于已开始停止状态 + bool isEndStopped_{false}; // 是否处于已结束停止状态 + }; + + // 播放器回调 + class RecordingPlayerCallbackImpl : public OHOS::Media::PlayerCallback + { + public: + RecordingPlayerCallbackImpl(); + ~RecordingPlayerCallbackImpl(); + void OnPlaybackComplete(); + void OnError(int32_t errorType, int32_t errorCode); + void OnInfo(int type, int extra); + void OnRewindToComplete(); + + private: + }; + /* *录音播放器界面点击监听类 */ @@ -52,7 +97,7 @@ namespace OHOS /* *录音列表视图监听类 */ - class RecordListViewListener : public UIView::OnClickListener,public UIView::OnDragListener + class RecordListViewListener : public UIView::OnClickListener, public UIView::OnDragListener { public: RecordListViewListener() {} @@ -63,6 +108,7 @@ namespace OHOS bool OnDrag(UIView &view, const DragEvent &event) override; }; + class RecordingModel; class RecordingView; class RecordingPresenter : public Presenter, public UIView::OnClickListener, @@ -90,6 +136,7 @@ namespace OHOS bool OnDragEnd(UIView &view, const DragEvent &event) override; bool OnChange(UICheckBox::UICheckBoxState state) override; bool OnKeyAct(UIView &view, const KeyEvent &event) override; + RecordingModel *p_RecordingModel{nullptr}; }; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordListView.cpp b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordListView.cpp index c4d635329..3fd5f308f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordListView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordListView.cpp @@ -172,11 +172,11 @@ namespace OHOS recordList->SetDraggable(true); recordList->SetMaxScrollDistance(1000); // 设置手指抬起屏幕后的最大滚动距离。 recordList->SetReboundSize(50); - recordList->SetYScrollBarVisible(true); // 设置 Y 轴滚动条是否可见。 + //recordList->SetYScrollBarVisible(true); // 设置 Y 轴滚动条是否可见。 recordList->SetIntercept(true); // 设置是否拦截输入事件。如果被截获,视图在本地处理后不会将输入事件传递给父视图。 - InitRecordingInfo(); recordList->SetAdapter(p_RecordingListAdapter); + recordList->RefreshList(); RecordListScrollView->Add(recordList); return true; } diff --git a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingListAdapter.cpp b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingListAdapter.cpp index a558f1217..29f7df8ef 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingListAdapter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingListAdapter.cpp @@ -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 diff --git a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingListitemView.cpp b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingListitemView.cpp index cfb483c96..2f2888caf 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingListitemView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingListitemView.cpp @@ -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); diff --git a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingModel.cpp index 209c9ed7f..16c3bfd8d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingModel.cpp @@ -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 #include -#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(); + if (PlayerCtr == nullptr || PlayerCtr.get() == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PlayerCtr is nullptr!!"); + return; + } + /* -------------------------------- 播放器回调初始化 -------------------------------- */ + PlayerCallback = std::make_shared(); + 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(Uri, Header); + /* ------------------------- 创建资源对象Resource并进行资源申请。 ------------------------- */ + Resource = std::make_shared(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(); if (p_RecordingPlayerInterruptListener.get() == nullptr) @@ -105,7 +198,7 @@ namespace OHOS std::shared_ptr 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) + /* + * @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 显示录音时长 diff --git a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPlayerView.cpp b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPlayerView.cpp index 0ab7dd729..cb91343e1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPlayerView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPlayerView.cpp @@ -1,5 +1,6 @@ #include "record/include/RecordingPlayerView.h" #include "record/include/RecordingPresenter.h" +#include "record/include/RecordingModel.h" #include "wearable_log.h" #include "UiConfig.h" @@ -381,6 +382,7 @@ namespace OHOS { return nullptr; } + RecordingModel::GetInstance()->RecordingPlayerInit(); /* ----------------------------------- Add ---------------------------------- */ RecordingPlayerViewScrollView->Add(RecordingPlayBackground); RecordingPlayerViewScrollView->Add(RecordingFileName); diff --git a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPresenter.cpp index eca43d385..22f3ba4f4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPresenter.cpp @@ -3,10 +3,10 @@ #include "graphic_math.h" #include "string.h" #include "record/include/RecordingPresenter.h" -#include "record/include/RecordingModel.h" #include #include "../../../../../../drivers/peripheral/utils/custom_utils.h" #include "record/include/RecordingListitemView.h" +#include namespace OHOS { @@ -16,6 +16,7 @@ namespace OHOS RecordingPresenter::RecordingPresenter() { + p_RecordingModel = RecordingModel::GetInstance(); g_pRecordPresenter = this; } @@ -34,7 +35,8 @@ namespace OHOS void RecordingPresenter::OnStart() { // 初始化录音信息 - RecordingModel::GetInstance()->InitRecordingListItem(); + p_RecordingModel->InitRecordingListItem(); + p_RecordingModel->AudioInit(); Presenter::OnStart(); ScreenAlwaysOnCtr(1); } @@ -80,7 +82,7 @@ namespace OHOS { NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST); } - else if(i == RECORDINGPLAYERVIEW) + else if (i == RECORDINGPLAYERVIEW) { p_RecordingView->ChangeView(i, RECORDINGLISTVIEW); } @@ -186,7 +188,7 @@ namespace OHOS AudioCaptureSample(6, (const char **)args); /* --------------------------------- 跳转到录音界面 -------------------------------- */ p_RecordingView->ChangeView(RECORDINGVIEW, RECORDGOINGVIEW); - RecordingModel::GetInstance()->Recording_StartTimer(1000); + p_RecordingModel->Recording_StartTimer(1000); RecordGoingView::GetInstance()->GetRecordingDurationLabel()->SetText("00:00:00"); /* ---------------------------------- 释放内存 ---------------------------------- */ for (int i = 0; i < 6; ++i) @@ -203,12 +205,11 @@ namespace OHOS uint8_t *argv = (uint8_t *)"stop"; AudioCaptureSample(argc, (const char **)&argv); p_RecordingView->ChangeView(RECORDGOINGVIEW, RECORDINGVIEW); - RecordingModel::GetInstance()->Recording_StopTimer(); + p_RecordingModel->Recording_StopTimer(); return true; } else if (strcmp(view.GetViewId(), RECORD_DELETE_ON_BUTTON_VIEWID) == 0) { - RecordingModel *p_RecordingModel = RecordingModel::GetInstance(); std::string fileName = "/user/res/record/recording/" + p_RecordingModel->GetFileNames()[p_RecordingModel->GetClickRecordingIndex()] + ".mp3"; WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "fileName:%s\n", fileName.c_str()); deleteFile(fileName.c_str()); @@ -233,11 +234,11 @@ namespace OHOS { case UICheckBox::SELECTED: WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recording play start"); - + p_RecordingModel->RecordingPlayerPlay(); break; case UICheckBox::UNSELECTED: WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recording play stop"); - + p_RecordingModel->RecordingPlayerPause(); break; default: break; @@ -269,14 +270,21 @@ namespace OHOS WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RecordListViewListener::OnClick is no index"); return false; } - // 保存被点击录音下标 + /* -------------------------------- 保存被点击录音下标 ------------------------------- */ RecordingModel *p_RecordingModel = RecordingModel::GetInstance(); - p_RecordingModel->KeepClickRecordingIndex(index); if (p_RecordingModel == nullptr) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel GetInstance fail"); return false; } + p_RecordingModel->KeepClickRecordingIndex(index); + /* ------------------------ 录音播放初始化,包括录音文件名,录音时间和总时长 ------------------------ */ + if (p_RecordingModel->RecordingPlayerInit() != OHOS_SUCCESS) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "p_RecordingModel->RecordingPlayerInit fail!!"); + return false; + } + /* ---------------------------------- 切换到录音播放界面 ---------------------------------- */ RecordingView *p_RecordingView = RecordingView::GetInstance(); if (p_RecordingView == nullptr) { @@ -333,4 +341,210 @@ namespace OHOS } return true; } + + /* -------------------- RecordingPlayerInterruptListener -------------------- */ + /* + * @brief 音频中断类的构造函数 + */ + RecordingPlayerInterruptListener::RecordingPlayerInterruptListener() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::RecordingPlayerInterruptListener"); + } + + RecordingPlayerInterruptListener::~RecordingPlayerInterruptListener() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::~RecordingPlayerInterruptListener"); + } + /* + * @brief 处理录音播放器中断的方法,可能会根据传入的参数进行不同的操作。 + */ + void RecordingPlayerInterruptListener::OnInterrupt(int32_t type, int32_t hint) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::OnInterrupt"); + + } + + /* + * @brief 获取与该监听器相关联的播放器。 + */ + std::shared_ptr RecordingPlayerInterruptListener::GetPlayer() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::GetPlayer"); + + return player_; + } + + /* + * @brief 设置录音播放器的所有者。 + */ + void RecordingPlayerInterruptListener::SetOwner(std::shared_ptr player) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::SetOwner"); + + player_ = player; + } + + /* + * @brief 设置播放器是否处于暂停状态 + */ + void RecordingPlayerInterruptListener::SetPaused(bool value) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::SetPaused"); + + isPaused_ = value; + } + + /* + * @brief 设置播放器是否已恢复播放状态。 + */ + void RecordingPlayerInterruptListener::SetResumed(bool value) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::SetResumed"); + isResumed_ = value; + } + + /* + * @brief 重置标志位 + */ + void RecordingPlayerInterruptListener::RestFlag(void) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::RestFlag"); + + isPaused_ = false; + isDelayed_ = false; + isResumed_ = false; + isBeginStopped_ = false; + isEndStopped_ = false; + } + + /* + * @brief 返回播放器是否处于暂停状态的布尔值 + */ + bool RecordingPlayerInterruptListener::IsPaused() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::IsPaused"); + + return isPaused_; + } + + /* + * @brief 返回播放器是否处于延迟状态的布尔值。 + */ + bool RecordingPlayerInterruptListener::IsDelayed() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::IsDelayed"); + + return isDelayed_; + } + + /* + * @brief 返回播放器是否已恢复播放状态的布尔值 + */ + bool RecordingPlayerInterruptListener::IsResumed() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::IsDelayed"); + + return isResumed_; + } + + /* + * @brief 返回播放器是否已开始停止的布尔值。 + */ + bool RecordingPlayerInterruptListener::IsBeginStopped() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::IsBeginStopped"); + + return isBeginStopped_; + } + + /* + * @brief 返回播放器是否已结束停止的布尔值。 + */ + bool RecordingPlayerInterruptListener::IsEndStopped() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::IsEndStopped"); + + return isEndStopped_; + } + + static void PlayerPostGraphicEvent(void (*fun)(void)) + { + GraphicService::GetInstance()->PostGraphicEvent(*fun); + } + + static void Pause(void) + { + } + + static void Resume(void) + { + } + + static void Stop(void) + { + } + + /* + * @brief 暂停播放器 + */ + void RecordingPlayerInterruptListener::PausePlayer(void) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::PausePlayer"); + + PlayerPostGraphicEvent(Pause); + } + + /* + * @brief 恢复播放器。 + */ + void RecordingPlayerInterruptListener::ResumePlayer(void) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::ResumePlayer"); + + PlayerPostGraphicEvent(Resume); + } + + /* + * @brief 停止播放器 + */ + void RecordingPlayerInterruptListener::StopPlayer(void) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerInterruptListener::StopPlayer"); + + PlayerPostGraphicEvent(Stop); + } + /* ---------------------------------- 播放器回调 --------------------------------- */ + RecordingPlayerCallbackImpl::RecordingPlayerCallbackImpl() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::RecordingPlayerCallbackImpl"); + } + + RecordingPlayerCallbackImpl::~RecordingPlayerCallbackImpl() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::~RecordingPlayerCallbackImpl"); + } + + void RecordingPlayerCallbackImpl::OnPlaybackComplete() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::OnPlaybackComplete"); + /* --------------------------- 处实现代码用于处理文件播放完成的事件 --------------------------- */ + } + + void RecordingPlayerCallbackImpl::OnError(int32_t errorType, int32_t errorCode) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::OnError"); + /* ------------------------------ 此处实现代码用于处理错误事件 ------------------------------ */ + } + + void RecordingPlayerCallbackImpl::OnInfo(int type, int extra) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::OnInfo"); + /* ------------------------------- 此处实现代码用于处理普通事件 ------------------------------ */ + } + + void RecordingPlayerCallbackImpl::OnRewindToComplete() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingPlayerCallbackImpl::OnRewindToComplete"); + /* ---------------------------- 此处实现代码用于处理进度控制完成的事件 ---------------------------- */ + } } \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingView.cpp b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingView.cpp index e70eb186e..9927e1af2 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingView.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingView.cpp @@ -277,6 +277,16 @@ namespace OHOS } // 设置“录音播放器”【录音文件名标签】的"文本内容"为被点击的"录音"的录音名 p_RecordingPlayerView->GetRecordingFileNameLabel()->SetText(RecordingModel::GetInstance()->GetFileNames()[RecordingModel::GetInstance()->GetClickRecordingIndex()].c_str()); + std::string yyyymmhhh_date = RecordingModel::GetInstance()->Getyyyymmhhh_date(); + std::string TotalRecordDuration = RecordingModel::GetInstance()->GetTotalRecordDuration(); + // 去掉日期字符串末尾的换行符 + if (!yyyymmhhh_date.empty() && yyyymmhhh_date.back() == '\n') + { + yyyymmhhh_date.erase(yyyymmhhh_date.length() - 1); + } + std::string RecordingTimeAndDuration = yyyymmhhh_date + "-" + TotalRecordDuration; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingTimeAndDuration %s\n", RecordingTimeAndDuration.c_str()); + p_RecordingPlayerView->GetRecordingTimeAndDurationLabel()->SetText(RecordingTimeAndDuration.c_str()); return true; }