fix(multimodal): keep local responding worker persistent

This commit is contained in:
chenjintao
2026-08-12 16:07:30 +08:00
parent 273550b28b
commit 4e7fadde56
@@ -84,7 +84,6 @@
#define CONTROL_PLANE_LOCAL_RESPONDING_EVENT_TASK_STACK_BYTES 4096U #define CONTROL_PLANE_LOCAL_RESPONDING_EVENT_TASK_STACK_BYTES 4096U
#define CONTROL_PLANE_LOCAL_RESPONDING_EVENT_TASK_PRIORITY 5U #define CONTROL_PLANE_LOCAL_RESPONDING_EVENT_TASK_PRIORITY 5U
#define CONTROL_PLANE_LOCAL_RESPONDING_EVENT_QUEUE_LEN 4U #define CONTROL_PLANE_LOCAL_RESPONDING_EVENT_QUEUE_LEN 4U
#define CONTROL_PLANE_LOCAL_RESPONDING_EVENT_IDLE_EXIT_MS 5000U
#define CONTROL_PLANE_MULTIMODAL_BINARY_SUMMARY_INTERVAL 200U #define CONTROL_PLANE_MULTIMODAL_BINARY_SUMMARY_INTERVAL 200U
#define CONTROL_PLANE_UPLINK_READY_WAIT_MS 6000U #define CONTROL_PLANE_UPLINK_READY_WAIT_MS 6000U
#define CONTROL_PLANE_AUDIO_SEND_FAILURE_WINDOW_MS 100U #define CONTROL_PLANE_AUDIO_SEND_FAILURE_WINDOW_MS 100U
@@ -545,17 +544,10 @@ static void local_responding_event_worker(void *arg)
local_responding_event_msg_t msg = {0}; local_responding_event_msg_t msg = {0};
while (true) { while (true) {
TickType_t idle_ticks = pdMS_TO_TICKS(CONTROL_PLANE_LOCAL_RESPONDING_EVENT_IDLE_EXIT_MS); if (xQueueReceive(s_local_responding_event_queue,
if (idle_ticks == 0) { &msg,
idle_ticks = 1; portMAX_DELAY) != pdTRUE) {
} continue;
if (xQueueReceive(s_local_responding_event_queue, &msg, idle_ticks) != pdTRUE) {
if (lock_state()) {
s_local_responding_event_task = NULL;
unlock_state();
}
vTaskDelete(NULL);
return;
} }
if (msg.type == LOCAL_RESPONDING_EVENT_QUIT) { if (msg.type == LOCAL_RESPONDING_EVENT_QUIT) {
@@ -628,6 +620,7 @@ static esp_err_t ensure_local_responding_event_worker(void)
s_local_responding_event_queue = NULL; s_local_responding_event_queue = NULL;
return ESP_ERR_NO_MEM; return ESP_ERR_NO_MEM;
} }
ESP_LOGI(TAG, "Local responding event worker started (persistent)");
} }
return ESP_OK; return ESP_OK;
@@ -709,9 +702,14 @@ static void queue_local_responding_event(local_responding_event_type_t type)
return; return;
} }
esp_err_t worker_err = ensure_local_responding_event_worker(); QueueHandle_t queue = NULL;
if (worker_err != ESP_OK) { if (lock_state()) {
ESP_LOGW(TAG, "Local responding event worker unavailable: %s", esp_err_to_name(worker_err)); queue = s_local_responding_event_task != NULL ?
s_local_responding_event_queue : NULL;
unlock_state();
}
if (queue == NULL) {
ESP_LOGW(TAG, "Local responding event worker unavailable");
if (lock_state()) { if (lock_state()) {
if (type == LOCAL_RESPONDING_EVENT_STARTED) { if (type == LOCAL_RESPONDING_EVENT_STARTED) {
s_local_responding_started_send_pending = false; s_local_responding_started_send_pending = false;
@@ -727,7 +725,7 @@ static void queue_local_responding_event(local_responding_event_type_t type)
.type = type, .type = type,
}; };
strlcpy(msg.task_id, task_id, sizeof(msg.task_id)); strlcpy(msg.task_id, task_id, sizeof(msg.task_id));
if (xQueueSend(s_local_responding_event_queue, &msg, 0) != pdTRUE) { if (xQueueSend(queue, &msg, 0) != pdTRUE) {
ESP_LOGW(TAG, ESP_LOGW(TAG,
"Local responding event queue full (%s)", "Local responding event queue full (%s)",
type == LOCAL_RESPONDING_EVENT_STARTED ? "started" : "ended"); type == LOCAL_RESPONDING_EVENT_STARTED ? "started" : "ended");
@@ -1669,11 +1667,24 @@ esp_err_t control_plane_multimodal_start(void)
return err; return err;
} }
err = ensure_local_responding_event_worker();
if (err != ESP_OK) {
ESP_LOGW(TAG,
"Local responding event worker start failed: %s",
esp_err_to_name(err));
if (lock_state()) {
s_starting = false;
unlock_state();
}
return err;
}
err = domain_runtime_multimodal_audio_register_downstream_playback_callback( err = domain_runtime_multimodal_audio_register_downstream_playback_callback(
downstream_playback_event_bridge, downstream_playback_event_bridge,
NULL); NULL);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGW(TAG, "Register downstream playback callback failed: %s", esp_err_to_name(err)); ESP_LOGW(TAG, "Register downstream playback callback failed: %s", esp_err_to_name(err));
stop_local_responding_event_worker();
if (lock_state()) { if (lock_state()) {
s_starting = false; s_starting = false;
unlock_state(); unlock_state();
@@ -1685,6 +1696,7 @@ esp_err_t control_plane_multimodal_start(void)
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGW(TAG, "Transport start failed: %s", esp_err_to_name(err)); ESP_LOGW(TAG, "Transport start failed: %s", esp_err_to_name(err));
(void)domain_runtime_multimodal_audio_register_downstream_playback_callback(NULL, NULL); (void)domain_runtime_multimodal_audio_register_downstream_playback_callback(NULL, NULL);
stop_local_responding_event_worker();
if (lock_state()) { if (lock_state()) {
s_starting = false; s_starting = false;
unlock_state(); unlock_state();