Bläddra i källkod

解决打断语音识别问题,已解决

xuxinyi 4 månader sedan
förälder
incheckning
2186efb8b4
2 ändrade filer med 46 tillägg och 9 borttagningar
  1. 41 9
      main/application.cc
  2. 5 0
      main/application.h

+ 41 - 9
main/application.cc

@@ -418,7 +418,7 @@ void Application::Start() {
         Application* app = (Application*)arg;
         app->MainLoop();
         vTaskDelete(NULL);
-    }, "main_loop", 4096 * 2, this, 3, nullptr);
+    }, "main_loop", 4096 , this, 3, nullptr);
 
     /* Wait for the network to be ready */
     board.StartNetwork();
@@ -657,18 +657,50 @@ void Application::Schedule(std::function<void()> callback) {
 );
  * 
  */
-void Application::MainLoop() {
-    while (true) {
-        auto bits = xEventGroupWaitBits(event_group_,
-            SCHEDULE_EVENT | AUDIO_INPUT_READY_EVENT | AUDIO_OUTPUT_READY_EVENT,
+
+// 初始化函数中创建音频任务
+void Application::Init() {
+    // 创建音频输入任务
+    xTaskCreate([](void* arg) {
+        Application* app = (Application*)arg;
+        while(true) {
+            auto bits = xEventGroupWaitBits(app->event_group_,
+            AUDIO_INPUT_READY_EVENT,
             pdTRUE, pdFALSE, portMAX_DELAY);
 
-        if (bits & AUDIO_INPUT_READY_EVENT) {
-            InputAudio();
+            if (bits & AUDIO_INPUT_READY_EVENT) {
+                app->InputAudio();
+            }
+            
+            // ESP_LOGI(TAG, "录音中");
         }
-        if (bits & AUDIO_OUTPUT_READY_EVENT) {
-            OutputAudio();
+    }, "audio_input_task", 4096*2, this, 2, &inputTaskHandle);
+
+    // 创建音频输出任务
+    xTaskCreate([](void* arg) {
+        Application* app = (Application*)arg;
+        while(true) {
+            auto bits = xEventGroupWaitBits(app->event_group_,
+            AUDIO_OUTPUT_READY_EVENT,
+            pdTRUE, pdFALSE, portMAX_DELAY);
+
+            if (bits & AUDIO_OUTPUT_READY_EVENT) {
+                app->OutputAudio();
+            }
+            
+            // ESP_LOGI(TAG, "播放中");
         }
+    }, "audio_output_task", 4096*2, this, 2, &outputTaskHandle);
+}
+
+void Application::MainLoop() {
+
+    Init();
+    
+    while (true) {
+        auto bits = xEventGroupWaitBits(event_group_,
+            SCHEDULE_EVENT,
+            pdTRUE, pdFALSE, portMAX_DELAY);
         if (bits & SCHEDULE_EVENT) {
             std::unique_lock<std::mutex> lock(mutex_);
             std::list<std::function<void()>> tasks = std::move(main_tasks_);

+ 5 - 0
main/application.h

@@ -110,6 +110,10 @@ private:
     OpusResampler reference_resampler_;
     OpusResampler output_resampler_;
 
+    // 在Application类中添加任务句柄成员变量
+    TaskHandle_t inputTaskHandle = nullptr;
+    TaskHandle_t outputTaskHandle = nullptr;
+
     void MainLoop();
     void InputAudio();
     void OutputAudio();
@@ -118,6 +122,7 @@ private:
     void CheckNewVersion();
     void ShowActivationCode();
     void OnClockTimer();
+    void Init();
 };
 
 #endif // _APPLICATION_H_