|
|
|
@ -52,6 +52,8 @@ class MobileElfController extends GetxController { |
|
|
|
bool _callStarting = false; // 防止并发 startCall |
|
|
|
// PTT 松开后仍有异步事件待处理(recognition_result / assistant_response / tts) |
|
|
|
bool _pttResultPending = false; |
|
|
|
// BLE/AI 唤醒触发的会话(非通话、非PTT模式下的唤醒) |
|
|
|
bool _bleWakeupActive = false; |
|
|
|
final _storage = GetStorage(); |
|
|
|
|
|
|
|
// ═══════════════════════════════════════════════════════════════════════════ |
|
|
|
@ -118,10 +120,11 @@ class MobileElfController extends GetxController { |
|
|
|
Logger.info('$_tag event: ${event.type} data: ${event.data}'); |
|
|
|
// PTT 松开后 pttRecording=false,但 fin_result/assistant_response/tts 仍异步到达 |
|
|
|
// 用 _pttResultPending 保持会话激活,直到 ttsCompleted/error 才关闭 |
|
|
|
final sessionActive = _inCallMode || pttRecording.value || _pttResultPending; |
|
|
|
final sessionActive = _inCallMode || pttRecording.value || _pttResultPending || _bleWakeupActive; |
|
|
|
switch (event.type) { |
|
|
|
case AgentServiceEventType.recognitionStarted: |
|
|
|
if (!sessionActive) break; |
|
|
|
// BLE/AI 唤醒:即使没有主动会话也激活 |
|
|
|
if (!sessionActive) _bleWakeupActive = true; |
|
|
|
status.value = MobileElfStatus.recording; |
|
|
|
realtimeText.value = ''; |
|
|
|
micAlive.value = true; |
|
|
|
@ -168,6 +171,7 @@ class MobileElfController extends GetxController { |
|
|
|
case AgentServiceEventType.ttsCompleted: |
|
|
|
if (!sessionActive) break; |
|
|
|
_pttResultPending = false; // PTT 一轮结束 |
|
|
|
_bleWakeupActive = false; // BLE 唤醒一轮结束 |
|
|
|
if (_inCallMode) { |
|
|
|
status.value = MobileElfStatus.recording; |
|
|
|
micAlive.value = true; |
|
|
|
@ -181,6 +185,7 @@ class MobileElfController extends GetxController { |
|
|
|
case AgentServiceEventType.ttsStopped: |
|
|
|
if (!sessionActive) break; |
|
|
|
_pttResultPending = false; // TTS 被打断也视为结束 |
|
|
|
_bleWakeupActive = false; |
|
|
|
status.value = _inCallMode ? MobileElfStatus.recording : MobileElfStatus.idle; |
|
|
|
micAlive.value = _inCallMode; |
|
|
|
break; |
|
|
|
@ -188,6 +193,7 @@ class MobileElfController extends GetxController { |
|
|
|
case AgentServiceEventType.error: |
|
|
|
if (!sessionActive) break; |
|
|
|
_pttResultPending = false; // 出错时结束等待 |
|
|
|
_bleWakeupActive = false; |
|
|
|
final msg = event.data['message']?.toString() ?? '未知错误'; |
|
|
|
status.value = MobileElfStatus.error; |
|
|
|
errorMsg.value = msg; |
|
|
|
@ -260,6 +266,7 @@ class MobileElfController extends GetxController { |
|
|
|
_callStarting = false; |
|
|
|
_inCallMode = false; |
|
|
|
_pttResultPending = false; // 强制结束所有等待 |
|
|
|
_bleWakeupActive = false; |
|
|
|
inCall.value = false; |
|
|
|
_callTimer?.cancel(); |
|
|
|
_callTimer = null; |
|
|
|
|