diff --git a/components/control_plane/src/multimodal/control_plane_multimodal_session_service.c b/components/control_plane/src/multimodal/control_plane_multimodal_session_service.c index 83bda77..858ca3f 100644 --- a/components/control_plane/src/multimodal/control_plane_multimodal_session_service.c +++ b/components/control_plane/src/multimodal/control_plane_multimodal_session_service.c @@ -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();