优化对话死机问题 2974/1
authorxue <2144439972@qq.com>
Thu, 25 Dec 2025 11:48:19 +0000 (19:48 +0800)
committerxue <2144439972@qq.com>
Thu, 25 Dec 2025 11:48:19 +0000 (19:48 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp
code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c

index ac917ef..cf9e28c 100644 (file)
@@ -773,26 +773,29 @@ namespace OHOS
             
             // 更新当前播放的视频路径
             currentVideoPath_ = targetPath;
-            
-            // 释放最后一帧截图的内存
-            if (hasLastFrame && lastFrameImage.data != nullptr)
-            {
-                ImageCacheFree(lastFrameImage);
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Released last frame image memory");
-            }
-            
             // 清除切换视频标志
             g_isSwitchingVideo = false;
             
             // 隐藏最后一帧视图(放到最后,确保新播放器已经完全接管显示)
             if (firstFrameReady && lastFrameView_ != nullptr && lastFrameView_->IsVisible())
             {
-                usleep(200000); // 200ms
-                lastFrameView_->SetVisible(false);
-                lastFrameView_->Invalidate();
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Hidden last frame view, new player first frame rendered");
+                
+                //异步隐藏最后一帧视图
+                GraphicService::GetInstance()->PostGraphicEvent([this]() {
+                    usleep(200000); // 100ms
+                    lastFrameView_->SetVisible(false);
+                    lastFrameView_->Invalidate();
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Hidden last frame view, new player first frame rendered");
+                });
             }
             
+            // 释放最后一帧截图的内存
+            if (hasLastFrame && lastFrameImage.data != nullptr)
+            {
+                ImageCacheFree(lastFrameImage);
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Released last frame image memory");
+            }
+
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Successfully switched to video: %s", uri);
             return true;
         }
index b4faccc..8ffce1d 100644 (file)
@@ -453,17 +453,14 @@ namespace OHOS
                 // WebSocket 未连接,不执行操作,避免状态混乱
                 return;
             }
-            
-            GraphicService::GetInstance()->PostGraphicEvent([]() {
                 AI_ForceInterrupt();
                 ln_ws_end_audio_chat();
                 ln_ws_send_voice_chat_interrupt("新对话开始");
-            });
             ThunderBirdDialogueView::GetInstance()->IsReconnect = true;
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始录音,跳转到聆听状态");
             // 开始录音
             ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
-            ln_ws_start_audio_chat(LN_AUDIO_CHAT_VOICE_CHAT_REQUEST);
+            // ln_ws_start_audio_chat(LN_AUDIO_CHAT_VOICE_CHAT_REQUEST);
         }
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "语音键处理完成");
     }
@@ -1235,7 +1232,14 @@ namespace OHOS
                 // 停止实际的音频播放
                 // ai_media_play_stop();
                 ThunderBirdDialogueView::GetInstance()->DialogueFirst = true;
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdPresenter::HandleFuncKeyLongPress: Stopped AI audio playback");
+                // 退出对话模式时恢复表情
+                AI_ForceInterrupt();
+                ln_ws_send_voice_chat_interrupt("退出对话");
+                do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
+                
+                // 退出对话模式,执行清理
+                ThunderBirdModel::GetInstance()->OnExitDialogueMode();
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdPresenter::HandleFuncKeyLongPress: Stopped AI audio playback");
                 
                 // 等待视频切换完成,避免在视频切换过程中退出导致资源冲突
                 if (ThunderBirdMainView::GetInstance() && ThunderBirdMainView::IsSwitchingVideo()) {
@@ -1248,22 +1252,16 @@ namespace OHOS
                 
                 ln_ws_end_audio_chat();//结束对话
                 
-                // 退出对话模式时恢复表情
-                AI_ForceInterrupt();
-                ln_ws_send_voice_chat_interrupt("退出对话");
+
                 
                 // 检查绑定状态,如果未绑定则跳转到 THUNDERBIRD_GUIDEVIEW_5
                 if (!ThunderBirdModel::GetInstance()->getbind_status()) {
                     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "设备未绑定,跳转到 THUNDERBIRD_GUIDEVIEW_5");
-                    // 退出对话模式,执行清理
-                    ThunderBirdModel::GetInstance()->OnExitDialogueMode();
-                    do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
                     ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_GUIDEVIEW, ThunderBirdGuideView::THUNDERBIRD_GUIDEVIEW_5);
                 } else {
                     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "设备已绑定,跳转到 THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW");
                     // 退出对话模式,执行清理(无论从哪个子状态退出都需要清理)
-                    ThunderBirdModel::GetInstance()->OnExitDialogueMode();
-                    do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
+
                     ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
                 }
                 
index 10cbb75..85d25c7 100644 (file)
@@ -1738,26 +1738,29 @@ int ln_ws_send_voice_chat_interrupt(const char *reason)
     LN_WS_DEBUG("Sending VoiceChatInterrupt: %s\n", json_string);
     
     // 发送消息
-    int ret = uapi_ws_send_text(json_string);
     
     // 清理资源
-    cJSON_free(json_string);
-    cJSON_Delete(json);
-    
-    if (ret == 0) {
-        LN_WS_DEBUG("VoiceChatInterrupt sent successfully\n");
-        
-        if (need_reconnect ||  (g_audio_chat_ctx.finish_state == LN_CHAT_SENT_END_NO_REPLY)) {
-            // 如果检测到频繁数据接收,直接重连
-            LN_WS_INFO("Triggering reconnection due to frequent binary data reception\n");
-            if (ln_ws_reconnect() != 0) {
-                LN_WS_ERROR("Failed to reconnect after frequent data reception\n");
+    int ret=0;
+    if (need_reconnect ||  (g_audio_chat_ctx.finish_state == LN_CHAT_SENT_END_NO_REPLY)) 
+    {
+        ret = uapi_ws_send_text(json_string);
+        if (ret == 0) {
+            LN_WS_DEBUG("VoiceChatInterrupt sent successfully\n");
+            {
+                // 如果检测到频繁数据接收,直接重连
+                LN_WS_INFO("Triggering reconnection due to frequent binary data reception\n");
+                if (ln_ws_reconnect() != 0) {
+                    LN_WS_ERROR("Failed to reconnect after frequent data reception\n");
+                }
             }
-        }
-    } else {
-        LN_WS_ERROR("Failed to send VoiceChatInterrupt\n");
+        } 
     }
-    
+    else {
+        LN_WS_INFO("no to send VoiceChatInterrupt\n");
+    }
+    cJSON_free(json_string);
+    cJSON_Delete(json);
+
     return ret;
 }