fix(audio): isolate NFC leave-message sessions
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user