fix(bt): dtmf_stop sans delete force du RX
This commit is contained in:
+10
-8
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user