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_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();
|
||||||
|
|||||||
Reference in New Issue
Block a user