fix(bt): dtmf_stop sans delete force du RX

This commit is contained in:
clement
2026-06-19 15:22:15 +02:00
parent 8f722db9f4
commit 7956cebde1
+10 -8
View File
@@ -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 */