fix(multimodal): keep local responding worker persistent
This commit is contained in:
+28
-16
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user