#include "audio_base_type.h"
#if ENABLE_VAD_SERVER
#include "vad_server.h" // Added for VAD processing
+#include "imsl_vad.h" // Added for AuthInfo and auth_vad
+#include "dmp_api.h" // Added for dmp_read_dev_token and dmp_aut_login
#endif
// 功能开关宏定义
#define ENABLE_BINARY_DATA_INTERRUPT_CHECK 1 // 启用二进制数据间隔检查
/* VAD 服务器状态标志位 */
static volatile bool g_vad_server_enabled = false;
static volatile bool g_vad_server_initialized = false;
+static volatile bool g_vad_server_auth_success = false;
/* 回调函数结构体 */
static ws_call_backs_t g_ws_callbacks = {0};
if (ret == ERRCODE_SUCC) {
g_vad_server_initialized = true;
LN_WS_INFO("VAD server initialized successfully\n");
+ // 通知 UI VAD 服务器初始化完成,取消等待提醒
+ if (g_ws_message_callback != NULL) {
+ g_ws_message_callback(NULL, WS_CMD_VAD_INITIALIZED);
+ }
} else {
LN_WS_ERROR("Failed to initialize VAD server: %d\n", ret);
}
{
return g_vad_server_initialized;
}
+
+/**
+ * @brief 获取 VAD 服务器认证成功状态
+ * @return true=已认证成功,false=未认证成功
+ */
+bool ln_ws_is_vad_server_auth_success(void)
+{
+ return g_vad_server_auth_success;
+}
+
+/**
+ * @brief 执行 VAD 认证
+ * @return 0成功,-1失败
+ * @note 此函数由 custom_cmd_service 异步调用,无需创建后台任务
+ */
+int ln_ws_vad_auth(void)
+{
+ LN_WS_INFO("Starting VAD authentication...\n");
+ // 使用静态变量,避免重复认证
+ static uint8_t task_dmp_auth = 0;
+ static uint8_t task_dmp_auth_retry_count = 0;
+ const uint8_t MAX_AUTH_RETRY = 5; // 最多重试1次
+
+ if(task_dmp_auth == 0 && task_dmp_auth_retry_count < MAX_AUTH_RETRY)
+ {
+ task_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);
+ LN_WS_INFO("VAD auth result: %d, token: %s\n", ret, auth_info.dmp_token);
+ task_dmp_auth = 1; // 无论成功失败都标记为已尝试,避免重复
+ return (ret == 1) ? 0 : -1; // auth_vad 返回1表示成功
+ }
+ else
+ {
+ if(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);
+ LN_WS_INFO("VAD auth result after login: %d, token: %s\n", ret, auth_info.dmp_token);
+ task_dmp_auth = 1;
+ g_vad_server_auth_success = true;
+ return (ret == 1) ? 0 : -1; // auth_vad 返回1表示成功
+ }
+ else
+ {
+ LN_WS_ERROR("VAD auth failed: failed to read token after login\n");
+ task_dmp_auth = 1; // 标记为已尝试,避免重复
+ return -1;
+ }
+ }
+ else
+ {
+ LN_WS_ERROR("VAD auth failed: dmp_aut_login failed, retry_count=%d\n", task_dmp_auth_retry_count);
+ // 如果网络失败,也标记为已尝试,避免无限重试
+ if(task_dmp_auth_retry_count >= MAX_AUTH_RETRY)
+ {
+ task_dmp_auth = 1; // 达到最大重试次数,不再尝试
+ }
+ return -1;
+ }
+ }
+ }
+ else
+ {
+ LN_WS_INFO("VAD authentication already attempted, skipping\n");
+ return 0; // 已经尝试过,返回成功(避免重复执行)
+ }
+}
#endif /* ENABLE_VAD_SERVER */