WS刚连接成功可以进行 对话,超过30sWS断开后,语音上行停止,需要修复

This commit is contained in:
CSBOOK\44744
2026-06-26 15:56:26 +08:00
parent 8c6f5c7a78
commit c61d1a5043
10 changed files with 218 additions and 11 deletions
@@ -46,6 +46,7 @@
#define CONTROL_PLANE_DOWNSTREAM_PLAYBACK_GUARD_MS 220
#define CONTROL_PLANE_IDLE_TRANSPORT_SHUTDOWN_MS 30000
#define CONTROL_PLANE_WATCHDOG_TASK_STACK_SIZE 6144
#define CONTROL_PLANE_SERVER_SUCCESS_PROMPT_FILE "/littlefs/audio_prompts/server_connect_success.opus"
#ifndef CONFIG_TQ_NETWORK_TASK_CORE
#define CONFIG_TQ_NETWORK_TASK_CORE 0
@@ -295,6 +296,13 @@ static esp_err_t control_plane_start_uplink_if_ready(void)
esp_err_t control_plane_multimodal_handle_ptt_press_step(void)
{
esp_err_t capture_err = control_plane_multimodal_start_capture();
if (capture_err != ESP_OK &&
capture_err != ESP_ERR_INVALID_STATE &&
capture_err != ESP_ERR_NOT_SUPPORTED) {
ESP_LOGW(TAG, "PTT capture start failed: %s", esp_err_to_name(capture_err));
}
control_plane_multimodal_runtime_state_t state = {0};
esp_err_t state_err = control_plane_multimodal_get_runtime_state(&state);
if (state_err != ESP_OK) {
@@ -580,6 +588,7 @@ static void control_plane_multimodal_event_bridge(control_plane_multimodal_event
switch (event) {
case CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_CONNECTED:
(void)domain_runtime_behavior_play_prompt_file(CONTROL_PLANE_SERVER_SUCCESS_PROMPT_FILE);
if (CONTROL_PLANE_MULTIMODAL_AUTO_START_FLAG) {
schedule_autostart_if_enabled();
}
@@ -83,6 +83,8 @@
#define CONTROL_PLANE_LOCAL_RESPONDING_EVENT_TASK_PRIORITY 5U
#define CONTROL_PLANE_LOCAL_RESPONDING_EVENT_QUEUE_LEN 4U
#define CONTROL_PLANE_MULTIMODAL_BINARY_SUMMARY_INTERVAL 200U
#define CONTROL_PLANE_UPLINK_READY_WAIT_MS 6000U
#define CONTROL_PLANE_UPLINK_READY_POLL_MS 20U
#ifndef CONFIG_TQ_LOCAL_TASK_CORE
#define CONFIG_TQ_LOCAL_TASK_CORE 1
@@ -1322,7 +1324,12 @@ static void transport_event_bridge(const domain_multimodal_transport_event_t *ev
break;
case DOMAIN_MULTIMODAL_TRANSPORT_EVENT_DISCONNECTED:
reset_session_state();
if (lock_state()) {
s_started = false;
memset(&s_auth, 0, sizeof(s_auth));
reset_session_state_locked();
unlock_state();
}
notify_event(CONTROL_PLANE_MULTIMODAL_EVENT_TRANSPORT_DISCONNECTED);
break;
@@ -1426,6 +1433,30 @@ static void downstream_playback_event_bridge(
static esp_err_t control_plane_audio_uplink_send_cb(const uint8_t *data, size_t len, void *ctx)
{
(void)ctx;
uint32_t waited_ms = 0U;
while (waited_ms < CONTROL_PLANE_UPLINK_READY_WAIT_MS) {
esp_err_t err = control_plane_multimodal_send_audio_realtime(data, len);
if (err != ESP_ERR_INVALID_STATE) {
return err;
}
control_plane_multimodal_runtime_state_t state = {0};
if (control_plane_multimodal_get_runtime_state(&state) == ESP_OK &&
state.connected) {
if (!state.has_active_task) {
(void)control_plane_multimodal_send_start();
} else if (state.server_listening &&
!state.client_speech_active &&
!state.ptt_release_required &&
!state.remote_responding) {
(void)control_plane_multimodal_send_speech_start();
}
}
vTaskDelay(pdMS_TO_TICKS(CONTROL_PLANE_UPLINK_READY_POLL_MS));
waited_ms += CONTROL_PLANE_UPLINK_READY_POLL_MS;
}
return control_plane_multimodal_send_audio_realtime(data, len);
}
@@ -1439,7 +1470,7 @@ esp_err_t control_plane_multimodal_start(void)
if (lock_state()) {
bool already_started = s_started;
unlock_state();
if (already_started && domain_runtime_multimodal_transport_is_connected()) {
if (already_started) {
return ESP_OK;
}
}
@@ -2056,6 +2087,22 @@ static esp_err_t control_plane_multimodal_prepare_audio_runtime(void)
return domain_runtime_multimodal_audio_init();
}
esp_err_t control_plane_multimodal_start_capture(void)
{
if (!domain_runtime_multimodal_audio_is_initialized()) {
esp_err_t init_err = domain_runtime_multimodal_audio_init();
if (init_err != ESP_OK) {
return init_err;
}
}
if (domain_runtime_multimodal_audio_is_uplink_running()) {
return ESP_OK;
}
return domain_runtime_multimodal_audio_start_uplink(control_plane_audio_uplink_send_cb, NULL);
}
esp_err_t control_plane_multimodal_start_uplink(void)
{
esp_err_t ready_err = control_plane_multimodal_prepare_audio_runtime();
@@ -2072,7 +2119,7 @@ esp_err_t control_plane_multimodal_start_uplink(void)
void control_plane_multimodal_stop_uplink(void)
{
esp_err_t err = domain_runtime_multimodal_audio_stop_uplink(2000);
esp_err_t err = domain_runtime_multimodal_audio_stop_uplink(CONTROL_PLANE_UPLINK_READY_WAIT_MS);
if (err != ESP_OK) {
ESP_LOGW(TAG, "Mic uplink stop ended with %s", esp_err_to_name(err));
}