1.一个分区模式下修改音乐和录音文件夹
authorluozheng <1732036298@qq.com>
Mon, 21 Oct 2024 10:13:58 +0000 (18:13 +0800)
committerluozheng <1732036298@qq.com>
Mon, 21 Oct 2024 10:13:58 +0000 (18:13 +0800)
2.录音添加空间判断管理
3.录音添加”空间已满弹窗“:在总时长大于20分钟或总数大于等于99,录音总空间大于等于10M,弹出
4.判断录音空间大小是否超出采用指令队列读职
5.修改底层录音文件audio_capture_wrapper.cpp大小参数使之录取一个录音最长时间在20分钟左右

13 files changed:
code/sdk/application/wearable/fd230app/nativelauncher/include/UiConfig.h
code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingModel.h
code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingModelC.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingPresenter.h
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingNumLimitView.cpp
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/record/src/RecordingView.cpp
code/sdk/application/wearable/fd230app/nativeui/system/include/SystemLogModel.h
code/sdk/drivers/peripheral/utils/custom_fileoperate_service.c
code/sdk/drivers/peripheral/utils/custom_utils.c
code/sdk/drivers/peripheral/utils/custom_utils.h
code/sdk/middleware/services/media/foundation/sample/wrapper/audio_capture_wrapper.cpp

index e47fae3..11505e5 100644 (file)
@@ -65,7 +65,11 @@ namespace OHOS
 #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"      /*表盘市场安装路径*/
index 7c21eda..4aaa71b 100644 (file)
@@ -38,7 +38,7 @@ namespace OHOS
         RECORDER_RESPONSE_MAX,
     };
 
-#define MAX_RECORDING_NUM 30
+#define MAX_RECORDING_NUM 99
     typedef struct
     {
         char recordingFileName[32]; // 录音文件名
@@ -103,6 +103,13 @@ namespace OHOS
         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();
@@ -128,8 +135,13 @@ namespace OHOS
         /* -------------------------------------------------------------------------- */
         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;                                // 录音时长
         /* -------------------------------------------------------------------------- */
@@ -144,6 +156,9 @@ namespace OHOS
         int MaxRecordingNumber{0}; //要录取的最大录音编号
         /* -------------------------------------------------------------------------- */
         bool RecordingPlayerViewIsCreate{false};
+        int curView{0};
+        int usedRecordingTime{0};//已使用的录音总时长
+        bool RecordingSpaceIsOut{false};
     };
 }
 
diff --git a/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingModelC.h b/code/sdk/application/wearable/fd230app/nativeui/record/include/RecordingModelC.h
new file mode 100644 (file)
index 0000000..c50fceb
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * @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
index 5d29727..674d514 100644 (file)
@@ -2,7 +2,7 @@
  * @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
@@ -131,6 +131,8 @@ namespace OHOS
         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
@@ -141,7 +143,7 @@ namespace OHOS
         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
index bbabf12..8fc5094 100644 (file)
 #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()
     {
@@ -537,6 +552,14 @@ namespace OHOS
         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 录音文件目录
@@ -565,6 +588,7 @@ namespace OHOS
                             strcpy(info[mp3FileCount].recordingFileName, recordingInfo.recordingFileName);
                             strcpy(info[mp3FileCount].recordingDuration, recordingInfo.recordingDuration);
                             strcpy(info[mp3FileCount].recordingTime, recordingInfo.recordingTime);
+                            usedRecordingTime += timeToSeconds(recordingInfo.recordingDuration);
                             mp3FileCount++;
                         }
                     }
@@ -617,6 +641,7 @@ namespace OHOS
         }
         RecordingMp3FileCount = 0;
         MaxRecordingNumber = 0;
+        usedRecordingTime = 0;
         /* -------------------------------------------------------------------------- */
         SearchFiles(directory, Recordings, RecordingMp3FileCount);
         if (RecordingMp3FileCount != 0)
@@ -908,16 +933,59 @@ namespace OHOS
         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 显示录音时长
@@ -980,7 +1048,7 @@ namespace OHOS
      */
     static void Recording_TimerCallbackProc(int data)
     {
-        #if 0
+#if 0
         g_RecordingTimes++;
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_RecordingTimes:%d\n", g_RecordingTimes);
 
@@ -1003,7 +1071,26 @@ namespace OHOS
         }
 
         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++;
     }
 
     /*
@@ -1011,9 +1098,7 @@ namespace OHOS
      */
     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));
     }
 
     /*
@@ -1077,4 +1162,21 @@ namespace OHOS
         }
     }
 
-}
\ 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
index 1cf98c5..32e4216 100644 (file)
@@ -120,7 +120,8 @@ namespace OHOS
                 image->SetSrc(PNG_ATTENTION_IMAGE);
                 scrollView->Add(image);
             }
-            /* -------------------------------------------------------------------------- */
+/* -------------------------------------------------------------------------- */
+#if 0
             labelconfig = {
                 .left = 53,
                 .top = 222,
@@ -141,6 +142,25 @@ namespace OHOS
                 }
                 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)
             {
@@ -150,7 +170,7 @@ namespace OHOS
                     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);
index 0dd97e9..e7846e7 100644 (file)
@@ -2,7 +2,7 @@
  * @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
@@ -49,6 +49,7 @@ namespace OHOS
         // 初始化录音信息\r
         p_RecordingModel->InitRecordingListItem();\r
         p_RecordingModel->AudioInit();\r
+        p_RecordingModel->SendCheckRecordingSpaceOutCmd(); //进入录音视图后发送指令查看录音空间是否已满\r
         Presenter<RecordingView>::OnStart();\r
         // ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);\r
     }\r
@@ -232,9 +233,19 @@ namespace OHOS
         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
@@ -246,7 +257,10 @@ namespace OHOS
 \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
index af9d7d2..5dcb6f1 100644 (file)
@@ -312,6 +312,7 @@ namespace OHOS
         RecordingViewScrollView[hideView]->SetVisible(false);\r
         ClickFunc(showView);\r
         RecordingViewScrollView[showView]->SetVisible(true);\r
+        RecordingModel::GetInstance()->SetCurView(showView);\r
         Draw();\r
     }\r
 \r
index 341933e..ec766e8 100644 (file)
@@ -8,13 +8,13 @@
 #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"
index e065e1c..7842fe8 100644 (file)
@@ -44,6 +44,7 @@
 #include "sleep/include/SleepModelC.h"
 
 #include "player/include/PlayersModelC.h"
+#include "record/include/RecordingModelC.h"
 
 #include "mmc5603_hal.h"
 
@@ -147,6 +148,10 @@ static void custom_fileoperate_service_check_task(void const *arg)
         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;
index 478f58e..3e7069d 100644 (file)
@@ -2074,6 +2074,8 @@ void uapi_restore_factory_setting(void)
     char *filebuf[] = {"/user/system/ConfigModel.json",
                     "/user/userdata",
                     "/user/system/kvstore",
+                    "/user/music/user_music",
+                    "/user/music/recording",
                     };
 
 #else
index b532c7c..c1514e9 100644 (file)
@@ -255,6 +255,8 @@ errcode_t do_custom_cmd_service_check_msg_head(int cmd, void *params, int paraml
 
 #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);
 
index f301325..b475d99 100755 (executable)
@@ -41,7 +41,8 @@ using Audio::AudioInterrupt;
 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