From 2d5173724954ca27650af3744d1e11cfcc61a91f Mon Sep 17 00:00:00 2001 From: xue <2144439972@qq.com> Date: Fri, 21 Nov 2025 16:43:17 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0=E8=81=94=E7=BD=91=E5=90=8E?= =?utf8?q?=E8=87=AA=E5=8A=A8vad=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../thunderbird/src/ThunderBirdModel.cpp | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp index f9560ce1b..816a194b2 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp @@ -46,6 +46,14 @@ #include "ai_media.h" #include "ConfigModelC.h" #include "ConfigModel.h" +#ifdef __cplusplus +extern "C" { +#endif +#include "imsl_vad.h" +#include "dmp_api.h" +#ifdef __cplusplus +} +#endif #define JUHEPINGTAI 0 #if JUHEPINGTAI #include "websocket_server_manager.h" @@ -1494,6 +1502,7 @@ // 检查是否在对话界面 if (currentView == THUNDERBIRD_DIALOGUEVIEW && (currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING || currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)) { // 检查是否是在对话模式进入时因为WebSocket未连接而显示的提醒 + do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_INIT, NULL, 0); ThunderBirdPresenter *presenter = ThunderBirdPresenter::GetInstance(); if (presenter && presenter->isDialogueing) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[定时器] WebSocket连接成功,隐藏网络断开提醒,进入对话模式"); @@ -1504,7 +1513,7 @@ } // 如果在对话界面,初始化音频 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[定时器] WebSocket连接成功,在对话界面,初始化音频"); - do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_INIT, NULL, 0); + } } } @@ -1513,6 +1522,58 @@ uapi_init_all_websocket_servers(); uapi_start_all_websocket_servers(0); // 连接服务器 #endif + + // VAD 认证初始化(只尝试一次,避免网络失败时重复重试导致死机) + static uint8_t dmp_auth = 0; + static uint8_t dmp_auth_retry_count = 0; + const uint8_t MAX_AUTH_RETRY = 1; // 最多重试1次 + + if(dmp_auth == 0 && dmp_auth_retry_count < MAX_AUTH_RETRY) + { + dmp_auth_retry_count++; + char dmp_token[64] = {0}; + if(dmp_read_dev_token(dmp_token)) + { + struct AuthInfo auth_info; + memset(&auth_info, 0, sizeof(auth_info)); + strcpy(auth_info.dmp_token, dmp_token); + int ret = auth_vad(&auth_info); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VAD auth result: %d, token: %s", ret, auth_info.dmp_token); + dmp_auth = 1; // 无论成功失败都标记为已尝试,避免重复 + } + else + { + // 只有在网络正常时才尝试登录,避免网络失败时阻塞 + if(HasNetwork() && dmp_aut_login()) + { + // 登录成功后重新尝试读取token + if(dmp_read_dev_token(dmp_token)) + { + struct AuthInfo auth_info; + memset(&auth_info, 0, sizeof(auth_info)); + strcpy(auth_info.dmp_token, dmp_token); + int ret = auth_vad(&auth_info); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VAD auth result after login: %d, token: %s", ret, auth_info.dmp_token); + dmp_auth = 1; + } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VAD auth failed: failed to read token after login"); + dmp_auth = 1; // 标记为已尝试,避免重复 + } + } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "VAD auth failed: dmp_aut_login failed or no network, retry_count=%d", dmp_auth_retry_count); + // 如果网络失败,也标记为已尝试,避免无限重试 + // 但允许在下次网络恢复时再试一次(通过 retry_count 控制) + if(dmp_auth_retry_count >= MAX_AUTH_RETRY) + { + dmp_auth = 1; // 达到最大重试次数,不再尝试 + } + } + } + } init_falg = true; } -- 2.17.1