增加故事模式5s未播放音频则自动退出处理
authorxue <2144439972@qq.com>
Thu, 15 Jan 2026 13:28:25 +0000 (21:28 +0800)
committerxue <2144439972@qq.com>
Thu, 15 Jan 2026 13:28:25 +0000 (21:28 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdLullabyView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp

index eeadcd3..8109401 100644 (file)
@@ -49,6 +49,10 @@ namespace OHOS
         // 故事模式超时定时器(1分钟无文本切换则退出)
         void StartStoryModeTimeoutTimer(void);
         void StopStoryModeTimeoutTimer(void);
+         
+        // 故事模式音频播放超时定时器(5秒内无音频播放则退出)
+        void StartStoryAudioPlaybackTimeoutTimer(void);
+        void StopStoryAudioPlaybackTimeoutTimer(void);
 
         // 开机操作函数
         int StartBootOperation();
@@ -243,6 +247,8 @@ namespace OHOS
         void ResetStoryModeFinished(void);
         // 故事模式超时处理函数
         void HandleStoryModeTimeout(void);
+        // 故事模式音频播放超时处理函数
+        void HandleStoryAudioPlaybackTimeout(void);
         
         // 处理蓝牙耳机连接通知
         void HandleBluetoothConnect(const char *bluetoothAddress);
@@ -442,6 +448,7 @@ namespace OHOS
         // 故事模式相关标志
         bool m_storyModeFinished = false;    // 故事模式是否已finished(收到finished=true)
         void* m_storyModeTimeoutTimer;        // 故事模式超时定时器(1分钟无文本切换则退出)
+        void* m_storyAudioPlaybackTimeoutTimer;  // 故事模式音频播放超时定时器(5秒内无音频播放则退出)
         
         // 对话模式相关标志
         bool m_dialogueModeFinished = false; // 对话模式是否已finished(收到finished=true)
index 2bbb579..8257307 100644 (file)
@@ -347,6 +347,9 @@ namespace OHOS
             // 启动故事模式超时定时器(1分钟无文本切换则退出)
             ThunderBirdModel::GetInstance()->StartStoryModeTimeoutTimer();
             
+            // 启动故事模式音频播放超时定时器(5秒内无音频播放则退出)
+            ThunderBirdModel::GetInstance()->StartStoryAudioPlaybackTimeoutTimer();
+            
             // 进入故事模式时关闭VAD
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "进入故事模式,关闭VAD");
             int vad_ret = ln_ws_disable_vad_server();
index b90886b..2aeda85 100644 (file)
@@ -128,6 +128,7 @@ extern "C" {
                                           m_bootTime(0),
                                           m_lastCat1RestartTime(0),
                                           m_storyModeTimeoutTimer(nullptr),
+                                          m_storyAudioPlaybackTimeoutTimer(nullptr),
                                           m_networkConnectingReason(NetworkConnectingReason::NONE),
                                           m_networkConnectingTimeoutCount(0)
      {
@@ -179,6 +180,7 @@ extern "C" {
          StopOtaCountdown();
          StopCountUpTimer();
          StopStoryModeTimeoutTimer();
+         StopStoryAudioPlaybackTimeoutTimer();
          //StopReminderHideTimer();
          
          // 停止录音
@@ -356,6 +358,8 @@ extern "C" {
      
      // 故事模式超时定时器回调函数前向声明
      static void StoryModeTimeoutTimerCallback(uint8_t data);
+     // 故事模式音频播放超时定时器回调函数前向声明
+     static void StoryAudioPlaybackTimeoutTimerCallback(uint8_t data);
      
      // ---------------------- 故事模式超时定时器 ----------------------
      void ThunderBirdModel::StartStoryModeTimeoutTimer(void)
@@ -431,6 +435,79 @@ extern "C" {
              }
          }
      }
+     
+     // ---------------------- 故事模式音频播放超时定时器 ----------------------
+     void ThunderBirdModel::StartStoryAudioPlaybackTimeoutTimer(void)
+     {
+         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartStoryAudioPlaybackTimeoutTimer: 启动5秒音频播放超时定时器");
+         
+         // 如果定时器已存在,先停止
+         if (m_storyAudioPlaybackTimeoutTimer != nullptr) {
+             StopStoryAudioPlaybackTimeoutTimer();
+         }
+         
+         // 创建一次性定时器(5秒 = 5000毫秒)
+         m_storyAudioPlaybackTimeoutTimer = osTimerNew((osTimerFunc_t)StoryAudioPlaybackTimeoutTimerCallback, osTimerOnce, nullptr, nullptr);
+         if (m_storyAudioPlaybackTimeoutTimer == nullptr) {
+             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create story audio playback timeout timer");
+             return;
+         }
+         
+         // 启动定时器(5秒 = 5000毫秒)
+         osStatus_t ret = osTimerStart(m_storyAudioPlaybackTimeoutTimer, 5000);
+         if (ret != osOK) {
+             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to start story audio playback timeout timer, ret=%d", ret);
+             osTimerDelete(m_storyAudioPlaybackTimeoutTimer);
+             m_storyAudioPlaybackTimeoutTimer = nullptr;
+         } else {
+             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Story audio playback timeout timer started: 5 seconds");
+         }
+     }
+     
+     void ThunderBirdModel::StopStoryAudioPlaybackTimeoutTimer(void)
+     {
+         if (m_storyAudioPlaybackTimeoutTimer != nullptr) {
+             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopStoryAudioPlaybackTimeoutTimer: 停止故事模式音频播放超时定时器");
+             osTimerStop(m_storyAudioPlaybackTimeoutTimer);
+             osTimerDelete(m_storyAudioPlaybackTimeoutTimer);
+             m_storyAudioPlaybackTimeoutTimer = nullptr;
+         }
+     }
+     
+     // 故事模式音频播放超时处理函数
+     void ThunderBirdModel::HandleStoryAudioPlaybackTimeout(void)
+     {
+         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleStoryAudioPlaybackTimeout: 5秒内未播放音频,退出故事模式");
+         
+         // 检查当前是否还在故事模式
+         ThunderBirdMainView *view = ThunderBirdMainView::GetInstance();
+         if (view) {
+             int16_t currentView = view->GetCurrentView();
+             int16_t currentSubView = view->GetCurrentSubView();
+             
+             if (currentView == THUNDERBIRD_LULLABYVIEW && 
+                 currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4) {
+                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleStoryAudioPlaybackTimeout: 5秒内未播放音频,退出故事模式");
+                 // 停止定时器
+                 StopStoryAudioPlaybackTimeoutTimer();
+                 // 退出故事模式
+                 HandleSleepModeEnd();
+             } else {
+                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleStoryAudioPlaybackTimeout: 当前不在故事模式,停止定时器");
+                 StopStoryAudioPlaybackTimeoutTimer();
+             }
+         }
+     }
+     
+     // 故事模式音频播放超时定时器回调函数
+     static void StoryAudioPlaybackTimeoutTimerCallback(uint8_t data)
+     {
+         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StoryAudioPlaybackTimeoutTimerCallback: 5秒音频播放超时定时器触发");
+         GraphicService::GetInstance()->PostGraphicEvent(
+             std::bind([]() {
+                 ThunderBirdModel::GetInstance()->HandleStoryAudioPlaybackTimeout();
+             }));
+     }
 
      //传入OTA的界面状态,以返回原任务
     int16_t ThunderBirdModel::GetCurrentView() const
@@ -2942,6 +3019,8 @@ extern "C" {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleSleepModeEnd");
         // 停止故事模式超时定时器
         StopStoryModeTimeoutTimer();
+        // 停止故事模式音频播放超时定时器
+        StopStoryAudioPlaybackTimeoutTimer();
         // 重置故事模式finished标志
         m_storyModeFinished = false;
         
@@ -3368,12 +3447,25 @@ extern "C" {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioPlaybackEnd: 故事模式finished且音频播放结束,结束故事模式");
             // 重置标志
             m_storyModeFinished = false;
+            // 停止5秒音频播放超时定时器(正常结束故事)
+            StopStoryAudioPlaybackTimeoutTimer();
             // g_sleep_mode_active = false;
             // 结束故事模式
             HandleSleepModeEnd();
             return;
         }
         
+        // 检查是否在故事模式(THUNDERBIRD_LULLABYVIEW_4),如果是,刷新5秒音频播放超时定时器
+        // 每次音频结束都刷新定时器,确保如果5秒内没有新的音频播放则退出
+        if (currentView == THUNDERBIRD_LULLABYVIEW &&
+            currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioPlaybackEnd: 故事模式音频播放结束,刷新5秒超时定时器");
+            // 停止旧的定时器并重新启动,实现刷新
+            StopStoryAudioPlaybackTimeoutTimer();
+            StartStoryAudioPlaybackTimeoutTimer();
+        }
+        
     }
     
     // 录音开始处理函数