fix(audio): isolate NFC leave-message sessions

This commit is contained in:
chenjintao
2026-09-24 17:52:07 +08:00
parent 82a419f812
commit 83ef72839e
2 changed files with 340 additions and 247 deletions
@@ -299,9 +299,47 @@ void vad_leave_message(void)
audio_packet_type = 4;
vad_leave_message_flag = 1;
/* A previous conversation may still be parked in WAITING_COMMAND. NFC
* leave-message recording must enter IDLE first, otherwise g_triggered is
* left pending forever and its 10-second no-speech timer never starts. */
set_state(STATE_IDLE);
vad_audio_trigger_record();
}
int vad_leave_message_is_active(void)
{
return vad_leave_message_flag != 0 || audio_packet_type == 4;
}
/* The conversation key has priority over an unfinished NFC leave-message
* transaction. Clear every local latch before the normal conversation prompt
* is queued so that its recording can never inherit packetType=4. */
int vad_cancel_leave_message(void)
{
int was_active = vad_leave_message_is_active();
if (!was_active) return 0;
printf("cancel pending leave message\r\n");
vad_leave_message_flag = 0;
g_triggered = false;
audio_packet_type = 0;
no_speech_timeout = 0;
speech_detect_count = 0;
vad_preroll_next = 0;
vad_preroll_count = 0;
key_start_leave = 0;
if (vad_audio_is_recording()) {
set_state(STATE_IDLE);
vad_audio_stop_no_wait_resp();
} else {
set_state(STATE_IDLE);
}
return 1;
}
// 主处理函数 - 需要在循环中定期调用
void vad_audio_process(void) {
size_t bytes_read = 0;
@@ -315,10 +353,9 @@ void vad_audio_process(void) {
// 状态机处理
switch (g_state) {
case STATE_IDLE:
no_speech_timeout = 0;
vad_leave_message_flag = 0;
speech_detect_count = 0; // 空闲时清零计数器
case STATE_IDLE:
no_speech_timeout = 0;
speech_detect_count = 0; // 空闲时清零计数器
vad_tts_playback_finished_status = 0;
if (g_triggered) {
@@ -448,15 +485,20 @@ void vad_audio_process(void) {
buffer_offset = 0;
break;
case STATE_WAITING_COMMAND:
if(vad_tts_playback_finished_status == 1) {
printf("finished_status:%d, no_speech_timeout:%d\n", vad_tts_playback_finished_status, no_speech_timeout);
set_state(STATE_IDLE);
ql_rtos_task_sleep_ms(50);
if(no_speech_timeout == 0&&vad_leave_message_flag==0) {
vad_audio_trigger_record();
}
}
case STATE_WAITING_COMMAND:
if(vad_tts_playback_finished_status == 1) {
int leave_message_finished = vad_leave_message_flag != 0;
printf("finished_status:%d, no_speech_timeout:%d\n", vad_tts_playback_finished_status, no_speech_timeout);
set_state(STATE_IDLE);
ql_rtos_task_sleep_ms(50);
if(no_speech_timeout == 0&&vad_leave_message_flag==0) {
vad_audio_trigger_record();
}
if(leave_message_finished) {
vad_leave_message_flag = 0;
audio_packet_type = 0;
}
}
key_start_leave = 0;
break;