From 628fc2119257de7f8dd1b44e4a1be3970ab06eec Mon Sep 17 00:00:00 2001 From: Michael Faath Date: Sat, 4 Apr 2026 23:37:46 +0200 Subject: [PATCH] Android: stop reply speaker on voice teardown --- .../app/src/main/java/ai/openclaw/app/NodeRuntime.kt | 11 +++++++++-- .../java/ai/openclaw/app/voice/MicCaptureManager.kt | 4 ++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt b/apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt index 04a7f154110..4f4aafc3c03 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt @@ -760,7 +760,7 @@ class NodeRuntime( prefs.setTalkEnabled(value) if (value) { // Tapping mic on interrupts any active TTS (barge-in) - talkMode.stopTts() + stopVoicePlayback() talkMode.ttsOnAllResponses = false scope.launch { talkMode.ensureChatSubscribed() } } @@ -782,12 +782,19 @@ class NodeRuntime( private fun stopActiveVoiceSession() { talkMode.ttsOnAllResponses = false - talkMode.stopTts() + stopVoicePlayback() micCapture.setMicEnabled(false) prefs.setTalkEnabled(false) externalAudioCaptureActive.value = false } + private fun stopVoicePlayback() { + talkMode.stopTts() + if (voiceReplySpeakerLazy.isInitialized()) { + voiceReplySpeaker.stopTts() + } + } + fun refreshGatewayConnection() { val endpoint = connectedEndpoint ?: run { diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/MicCaptureManager.kt b/apps/android/app/src/main/java/ai/openclaw/app/voice/MicCaptureManager.kt index dcb7300d0ca..3c9367e4c35 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/MicCaptureManager.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/voice/MicCaptureManager.kt @@ -244,7 +244,7 @@ class MicCaptureManager( pendingRunId = null pendingAssistantEntryId = null _isSending.value = false - if (messageQueue.isNotEmpty()) { + if (hasQueuedMessages()) { _statusText.value = queuedWaitingStatus() } } @@ -352,7 +352,7 @@ class MicCaptureManager( _statusText.value = when { _isSending.value -> "Listening · sending queued voice" - messageQueue.isNotEmpty() -> "Listening · ${messageQueue.size} queued" + hasQueuedMessages() -> "Listening · ${queuedMessageCount()} queued" else -> "Listening" } _isListening.value = true