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_PRIORITY 5U
#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_UPLINK_READY_WAIT_MS 6000U
#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};
while (true) {
TickType_t idle_ticks = pdMS_TO_TICKS(CONTROL_PLANE_LOCAL_RESPONDING_EVENT_IDLE_EXIT_MS);
if (idle_ticks == 0) {
idle_ticks = 1;
}
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 (xQueueReceive(s_local_responding_event_queue,
&msg,
portMAX_DELAY) != pdTRUE) {
continue;
}
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;
return ESP_ERR_NO_MEM;
}
ESP_LOGI(TAG, "Local responding event worker started (persistent)");
}
return ESP_OK;
@@ -709,9 +702,14 @@ static void queue_local_responding_event(local_responding_event_type_t type)
return;
}
esp_err_t worker_err = ensure_local_responding_event_worker();
if (worker_err != ESP_OK) {
ESP_LOGW(TAG, "Local responding event worker unavailable: %s", esp_err_to_name(worker_err));
QueueHandle_t queue = NULL;
if (lock_state()) {
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 (type == LOCAL_RESPONDING_EVENT_STARTED) {
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,
};
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,
"Local responding event queue full (%s)",
type == LOCAL_RESPONDING_EVENT_STARTED ? "started" : "ended");
@@ -1669,11 +1667,24 @@ esp_err_t control_plane_multimodal_start(void)
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(
downstream_playback_event_bridge,
NULL);
if (err != ESP_OK) {
ESP_LOGW(TAG, "Register downstream playback callback failed: %s", esp_err_to_name(err));
stop_local_responding_event_worker();
if (lock_state()) {
s_starting = false;
unlock_state();
@@ -1685,6 +1696,7 @@ esp_err_t control_plane_multimodal_start(void)
if (err != ESP_OK) {
ESP_LOGW(TAG, "Transport start failed: %s", esp_err_to_name(err));
(void)domain_runtime_multimodal_audio_register_downstream_playback_callback(NULL, NULL);
stop_local_responding_event_worker();
if (lock_state()) {
s_starting = false;
unlock_state();