From 6795c02f4c8c8401497227180dc201efcc6a1720 Mon Sep 17 00:00:00 2001 From: xue <2144439972@qq.com> Date: Thu, 25 Dec 2025 19:48:19 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E5=AF=B9=E8=AF=9D=E6=AD=BB?= =?utf8?q?=E6=9C=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../thunderbird/src/ThunderBirdMainView.cpp | 27 +++++++------- .../thunderbird/src/ThunderBirdPresenter.cpp | 24 ++++++------- .../zhihui/leiniao/imsl_ln/ln_api_websocket.c | 35 ++++++++++--------- 3 files changed, 45 insertions(+), 41 deletions(-) diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp index ac917ef0b..cf9e28cae 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp @@ -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; } diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp index b4faccc45..8ffce1dd8 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp @@ -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); } diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c index 10cbb7518..85d25c741 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c @@ -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; } -- 2.17.1