// 因为继承了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
#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
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
/*\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
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
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
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
void RecordingListAdapter::AddListItem(const RecordingListItem &item)
{
- listData.push_front(item);
+ listData.push_back(item);
}
}
\ No newline at end of file
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);
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);
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);
#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"
#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()
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;
/// @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);
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。 -------------------------------- */
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)
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)
}
IsActivateAudioInterrupt = true;
}
- /* ----------------------------- 6.设置播放器的音频会话ID。 ---------------------------- */
+ /* ----------------------------- 设置播放器的音频会话ID。 ---------------------------- */
PlayerCtr->SetAudioSessionId(SessionId);
- /* ---------------------------- 7.开始播放内容,如果播放失败: ---------------------------- */
+ /* ---------------------------- 开始播放内容,如果播放失败: ---------------------------- */
ret = PlayerCtr->Play();
if (ret != 0)
{
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;
}
/*
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 显示录音时长
#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
{\r
return nullptr;\r
}\r
+ RecordingModel::GetInstance()->RecordingPlayerInit();\r
/* ----------------------------------- Add ---------------------------------- */\r
RecordingPlayerViewScrollView->Add(RecordingPlayBackground);\r
RecordingPlayerViewScrollView->Add(RecordingFileName);\r
#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
\r
RecordingPresenter::RecordingPresenter()\r
{\r
+ p_RecordingModel = RecordingModel::GetInstance();\r
g_pRecordPresenter = this;\r
}\r
\r
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
{\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
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
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
{\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
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
}\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
}\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