From 7956cebde1a664a8b6231831eafbf63931069561 Mon Sep 17 00:00:00 2001 From: clement Date: Fri, 19 Jun 2026 15:22:15 +0200 Subject: [PATCH] fix(bt): dtmf_stop sans delete force du RX --- components/dtmf/dtmf.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/components/dtmf/dtmf.c b/components/dtmf/dtmf.c index e3ecd13..4d2409a 100644 --- a/components/dtmf/dtmf.c +++ b/components/dtmf/dtmf.c @@ -325,18 +325,20 @@ void dtmf_stop(void) s_armed_flag = false; s_run = false; - /* Attend que la tâche se supprime elle-même (timeout 100 ms) */ - const TickType_t deadline = xTaskGetTickCount() + pdMS_TO_TICKS(100); + /* Attend la sortie GRACIEUSE de la tâche : elle finit son i2s_channel_read + * en cours (timeout 100 ms) puis sort sur s_run=false. NE JAMAIS vTaskDelete + * de force : si la tâche est dans i2s_channel_read, elle détient le sémaphore + * du canal RX — la tuer le verrouille à vie et casse toute capture ultérieure + * (micro mort pendant les appels SCO). On attend largement plus que le read. */ + const TickType_t deadline = xTaskGetTickCount() + pdMS_TO_TICKS(500); while (s_task_handle != NULL && xTaskGetTickCount() < deadline) { - vTaskDelay(pdMS_TO_TICKS(5)); + vTaskDelay(pdMS_TO_TICKS(10)); } if (s_task_handle != NULL) { - /* Timeout dépassé — force la suppression en dernier recours */ - ESP_LOGW(TAG, "dtmf_stop: timeout — suppression forcée"); - vTaskDelete(s_task_handle); - s_task_handle = NULL; + ESP_LOGW(TAG, "dtmf_stop: tâche pas encore sortie (PAS de delete forcé)"); + } else { + ESP_LOGI(TAG, "dtmf_stop: tâche arrêtée proprement"); } - ESP_LOGI(TAG, "dtmf_stop: tâche arrêtée, canal RX libéré"); } #endif /* DTMF_HOST_TEST */