#define DOUBLES 2
#define APP_RES_PATH "/user/res"
+#ifdef SINGLE_USER_PARTITION
+#define APP_MUSIC_PATH "/user/musci/user_music"
+#else
#define APP_MUSIC_PATH "/user/userdata/music"
+#endif
#define APP_VIDEO_PATH "/user/video"
#define APP_DEFAULT_DIAL_PATH "/user/dial" /*默认表盘安装路径*/
#define APP_DOWNLOAD_DIAL_PATH "/user/userdata/dial" /*表盘市场安装路径*/
RECORDER_RESPONSE_MAX,
};
-#define MAX_RECORDING_NUM 30
+#define MAX_RECORDING_NUM 99
typedef struct
{
char recordingFileName[32]; // 录音文件名
void UpdateRecordProcess();
int getMaxRecordingNumber(void);
void setMaxRecordingNumber(int number);
+ void SetCurView(int16_t viewNum);
+ int GetCurView(void);
+ int GetUsedRecordingTime(void);
+ bool CheckRecordingTimeOut(int time);
+ void CheckRecordingSpaceOut(void);
+ bool GetCheckRecordingSpaceOut(void);
+ void SendCheckRecordingSpaceOutCmd(void);
private:
RecordingModel();
/* -------------------------------------------------------------------------- */
std::vector<std::string> fileNames; // 录音文件名数组
int RecordingMp3FileCount = 0; // 录音MP3数量
+#ifdef SINGLE_USER_PARTITION
+ const std::string directory = "/user/music/recording/"; // 录音目录
+ const std::string recordInfoFile = "/user/music/recording/recordinfo.bin";
+#else
const std::string directory = "/user/userdata/recording/"; // 录音目录
const std::string recordInfoFile = "/user/userdata/recording/recordinfo.bin";
+#endif
std::vector<RecordingListItem> Recordings{0}; // 存放录音信息的动态数组
std::string recordDuration; // 录音时长
/* -------------------------------------------------------------------------- */
int MaxRecordingNumber{0}; //要录取的最大录音编号
/* -------------------------------------------------------------------------- */
bool RecordingPlayerViewIsCreate{false};
+ int curView{0};
+ int usedRecordingTime{0};//已使用的录音总时长
+ bool RecordingSpaceIsOut{false};
};
}
--- /dev/null
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-10-21 16:29:03
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-10-21 16:40:18
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingModelC.h
+ */
+
+
+#ifndef RECORDING_MODELC_H
+#define RECORDING_MODELC_H
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C"
+{
+#endif
+#endif
+#include <stdint.h>
+ void CheckRecordingSpaceOutC(void);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif
+#endif
+#endif
\ No newline at end of file
* @Author: luozheng 1732036298@qq.com\r
* @Date: 2024-02-27 09:16:51\r
* @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-10-20 17:08:05\r
+ * @LastEditTime: 2024-10-21 11:20:46\r
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingPresenter.h\r
*/\r
\r
static RecordingPresenter *GetInstance();\r
int convertNumericDateTime(const char *numericDateTime, char *formattedDateTime);\r
void UpdateRecordProcess();\r
+ void StopRecord(void);\r
+ void showWarning(void);\r
\r
private:\r
// 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;\r
void Notify() override;\r
void SetCircleProgress();\r
void StartRecord(void);\r
- void StopRecord(void);\r
+ // void StopRecord(void);\r
RecordingModel *p_RecordingModel{nullptr};\r
uint8_t state_ = UICheckBox::UICheckBoxState::MAX_STATUS_NUM;\r
int64_t playerCurrentTime_{0};\r
#include <sys/stat.h>
#include "ConfigModel.h"
#include "cstring"
+#include "system/include/SystemLogModel.h"
+#include "record/include/RecordingModelC.h"
+#include "uiservice/include/ui_service.h"
+#include "custom_runtime.h"
+#include "vibrator_service.h"
namespace OHOS
{
std::string RecordingModel::recordTempDuration = 0;
+ // 声明定时器变量
+ 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;
+ const int TOTAL_RECORDING_TIME = 20 * 60; // 20 分钟换算为秒
static MutexId g_mutex;
RecordingModel::RecordingModel()
{
return ""; // 返回空字符串表示不是 .mp3 文件
}
+ static int timeToSeconds(const char *timeStr)
+ {
+ int minutes = 0;
+ int seconds = 0;
+ sscanf(timeStr, "%d:%d", &minutes, &seconds);
+ return minutes * 60 + seconds;
+ }
+
/*
* @brief 搜索录音文件
* @param -directory 录音文件目录
strcpy(info[mp3FileCount].recordingFileName, recordingInfo.recordingFileName);
strcpy(info[mp3FileCount].recordingDuration, recordingInfo.recordingDuration);
strcpy(info[mp3FileCount].recordingTime, recordingInfo.recordingTime);
+ usedRecordingTime += timeToSeconds(recordingInfo.recordingDuration);
mp3FileCount++;
}
}
}
RecordingMp3FileCount = 0;
MaxRecordingNumber = 0;
+ usedRecordingTime = 0;
/* -------------------------------------------------------------------------- */
SearchFiles(directory, Recordings, RecordingMp3FileCount);
if (RecordingMp3FileCount != 0)
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recordingDuration %s", recordingInfo.recordingDuration);
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "recordingTime %s", recordingInfo.recordingTime);
}
+
+ /*设置当前哪个子视图是可见的*/
+ void RecordingModel::SetCurView(int16_t viewNum)
+ {
+ curView = viewNum;
+ }
+
+ /*获取当前哪个子视图是可见的*/
+ int RecordingModel::GetCurView(void)
+ {
+ return curView;
+ }
+ int RecordingModel::GetUsedRecordingTime(void)
+ {
+ return usedRecordingTime;
+ }
+
+ // 检查录音时间是否超时
+ bool RecordingModel::CheckRecordingTimeOut(int time)
+ {
+ if (time >= TOTAL_RECORDING_TIME)
+ {
+ return true;
+ }
+ return false;
+ }
+
+ // 检查录音空间是否满了
+ void RecordingModel::CheckRecordingSpaceOut(void)
+ {
+ long long size = SystemLogModel::GetInstance()->getFolderSize(TOTAL_RECORDING_SPACE_PATH);
+ if (size >= TOTAL_RECORDING_SPACE)
+ {
+ RecordingSpaceIsOut = true;
+ }
+ else
+ {
+ RecordingSpaceIsOut = false;
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingModel::CheckRecordingSpaceOut:%d", RecordingSpaceIsOut);
+ }
+
+ bool RecordingModel::GetCheckRecordingSpaceOut(void)
+ {
+ return RecordingSpaceIsOut;
+ }
+
+ void RecordingModel::SendCheckRecordingSpaceOutCmd(void)
+ {
+ do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_RECORDING_SPACE_READ, nullptr, 0);
+ }
+
/* ----------------------------------- 定时器 ---------------------------------- */
- // 声明定时器变量
- 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 显示录音时长
*/
static void Recording_TimerCallbackProc(int data)
{
- #if 0
+#if 0
g_RecordingTimes++;
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_RecordingTimes:%d\n", g_RecordingTimes);
}
RecordGoingView::GetInstance()->GetRecordingDurationLabel()->SetText(RecordingModel::GetInstance()->DisplayRecordDuration());
- #endif
+#endif
+ int g_TotalUsedTime = RecordingModel::GetInstance()->GetUsedRecordingTime(); // 已用时间
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_RecordingTimes + g_TotalUsedTime = %d", g_RecordingTimes + g_TotalUsedTime);
+ if (RecordingModel::GetInstance()->CheckRecordingTimeOut(g_RecordingTimes + g_TotalUsedTime))
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Recording_TimerCallback g_TotalUsedSpace >= TOTAL_RECORDING_TIME");
+ // 录取时长不足,停止录制并弹出警告
+ if (RecordingPresenter::GetInstance())
+ {
+ ScreenTurnOn(3 * 1000); // 亮屏3s
+ if (true != OHOS::ConfigModel::GetInstance()->GetDnotdisturb() && (!uapi_sleep_mode_flag_get()))
+ {
+ // 震动提醒
+ ui_api_vibrate_once_func();
+ }
+ RecordingPresenter::GetInstance()->StopRecord(); // 停止录制
+ RecordingPresenter::GetInstance()->showWarning(); // 显示警告
+ }
+ }
+ g_RecordingTimes++;
}
/*
*/
static void Recording_TimerCallback(int data)
{
- g_RecordingTimes++;
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_RecordingTimes:%d\n", g_RecordingTimes);
- // GraphicService::GetInstance()->PostGraphicEvent(std::bind(Recording_TimerCallbackProc, data));
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(Recording_TimerCallbackProc, data));
}
/*
}
}
-}
\ No newline at end of file
+}
+#ifdef __cplusplus
+#if __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+ void CheckRecordingSpaceOutC(void)
+ {
+ OHOS::RecordingModel::GetInstance()->CheckRecordingSpaceOut();
+ }
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
\ No newline at end of file
image->SetSrc(PNG_ATTENTION_IMAGE);
scrollView->Add(image);
}
- /* -------------------------------------------------------------------------- */
+/* -------------------------------------------------------------------------- */
+#if 0
labelconfig = {
.left = 53,
.top = 222,
}
scrollView->Add(note);
}
+#else
+ if (note == nullptr)
+ {
+ note = new UILabelExt();
+ if (note == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "note can not be nullptr!");
+ return nullptr;
+ }
+ note->SetPosition(53, 222, 360, 70); // 位置大小
+ note->SetStyle(STYLE_TEXT_FONT, 30); // 字体大小
+ note->SetStyle(STYLE_LINE_HEIGHT, 35); // 字体行高
+ note->SetText("录音空间已满");
+ note->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); // 断行模式。
+ note->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+ note->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+ scrollView->Add(note);
+ }
+#endif
/* -------------------------------------------------------------------------- */
if (goitbutton == nullptr)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "goitbutton can not be nullptr!");
return nullptr;
}
- goitbutton->SetPosition(93, note->GetY() + note->GetTextHeight() + 48, 280, 90);
+ goitbutton->SetPosition(93, 340, 280, 90);
goitbutton->SetViewId(RECORDINGNUMLIMITBUTTONVIEW);
goitbutton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
goitbutton->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
* @Author: luozheng 1732036298@qq.com\r
* @Date: 2024-03-30 09:14:38\r
* @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-10-21 10:30:26\r
+ * @LastEditTime: 2024-10-21 17:01:15\r
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPresenter.cpp\r
*/\r
\r
// 初始化录音信息\r
p_RecordingModel->InitRecordingListItem();\r
p_RecordingModel->AudioInit();\r
+ p_RecordingModel->SendCheckRecordingSpaceOutCmd(); //进入录音视图后发送指令查看录音空间是否已满\r
Presenter<RecordingView>::OnStart();\r
// ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);\r
}\r
p_RecordingModel->RecordDataWriteToFile(recordingFileName.c_str());\r
RecordingModel::GetInstance()->InitRecordingListItem();\r
\r
+ p_RecordingModel->SendCheckRecordingSpaceOutCmd(); //录音完后发送指令查看录音空间是否已满\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordingView StopRecord over!!");\r
}\r
\r
+ //弹窗警告\r
+ void RecordingPresenter::showWarning(void)\r
+ {\r
+ if(view_)\r
+ {\r
+ view_->ChangeView(RecordingModel::GetInstance()->GetCurView(), RECORDINGEXCELIMIT);\r
+ }\r
+ }\r
+\r
bool RecordingPresenter::OnClick(UIView &view, const ClickEvent &event)\r
{\r
RecordingView *p_RecordingView = RecordingView::GetInstance();\r
\r
if (strcmp(view.GetViewId(), RECORD_BUTTON) == 0)\r
{\r
- if (p_RecordingModel->GetRecordingListNum() >= MAX_RECORDING_NUM)\r
+ int g_TotalUsedTime = RecordingModel::GetInstance()->GetUsedRecordingTime(); // 已用时间\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_TotalUsedTime:%d", g_TotalUsedTime);\r
+ if (p_RecordingModel->CheckRecordingTimeOut(g_TotalUsedTime) || p_RecordingModel->GetRecordingListNum() >= MAX_RECORDING_NUM ||\r
+ p_RecordingModel->GetCheckRecordingSpaceOut())\r
{\r
view_->ChangeView(RECORDINGVIEW, RECORDINGEXCELIMIT);\r
return true;\r
RecordingViewScrollView[hideView]->SetVisible(false);\r
ClickFunc(showView);\r
RecordingViewScrollView[showView]->SetVisible(true);\r
+ RecordingModel::GetInstance()->SetCurView(showView);\r
Draw();\r
}\r
\r
#include <memory>
#define TOTAL_MUSIC_SPACE (10 * 1024 * 1024) // 10M
-#define TOTAL_MUSIC_SPACE_PATH "/user/musci/usermusci"
+#define TOTAL_MUSIC_SPACE_PATH "/user/music/user_musci"
#define TOTAL_RECORDING_SPACE (10 * 1024 * 1024) // 10M
-#define TOTAL_RECORDING_SPACE_PATH "/user/musci/recording"
+#define TOTAL_RECORDING_SPACE_PATH "/user/music/recording"
#define TOTAL_RING_SPACE (2 * 1024 * 1024) // 2M
-#define TOTAL_RING_SPACE_PATH "/user/musci/ring"
+#define TOTAL_RING_SPACE_PATH "/user/music/ring"
#define TOTAL_DIAL_SPACE (27 * 1024 * 1024) // 27M
#define TOTAL_DIAL_SPACE_PATH "/user/dial/offlinedial"
#include "sleep/include/SleepModelC.h"
#include "player/include/PlayersModelC.h"
+#include "record/include/RecordingModelC.h"
#include "mmc5603_hal.h"
case CUSTOM_FILEOPERATE_MSG_TYPE_MUSICNAME_READ:
custom_setUpListCase();
break;
+
+ case CUSTOM_FILEOPERATE_MSG_TYPE_RECORDING_SPACE_READ:
+ CheckRecordingSpaceOutC();
+ break;
default:
PRINT("Unknown CUSTOM_FILE_OPERATE_MSG cmd 0x%02X \r\n", mail.cmd);
break;
char *filebuf[] = {"/user/system/ConfigModel.json",
"/user/userdata",
"/user/system/kvstore",
+ "/user/music/user_music",
+ "/user/music/recording",
};
#else
#define CUSTOM_FILEOPERATE_MSG_TYPE_MUSICNAME_READ 0x0C //读取音乐文件名
+#define CUSTOM_FILEOPERATE_MSG_TYPE_RECORDING_SPACE_READ 0x0D //读取录音空间
+
errcode_t uapi_custom_fileoperate_service_init(void);
errcode_t do_custom_fileoperate_service_check_msg(int cmd, void *params, int paramlen);
using Audio::AudioManager;
#define PLAYER_CONTROL_CMD_LEN 20
#define READ_RETRY_TIME_US 10000
-#define READ_COUNT_MAX 1000
+// #define READ_COUNT_MAX 1000 //原
+#define READ_COUNT_MAX 17000*2 //改过的 20分钟
#define GET_AUDIO_TIME_INTERVAL_TIMES 100
#define MAX_ARGC 5