From dd6b160707f3e47dfa971cc1e7bb99fb04e47cd6 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sun, 5 Apr 2026 08:06:05 +0530 Subject: [PATCH] fix(android): tighten compressed talk playback --- .../ai/openclaw/app/voice/TalkAudioPlayer.kt | 73 ++++++++++--------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkAudioPlayer.kt b/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkAudioPlayer.kt index ea6ab467d09..59dceb7182a 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkAudioPlayer.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/voice/TalkAudioPlayer.kt @@ -165,44 +165,49 @@ internal class TalkAudioPlayer( writeBytes(bytes) } } - val finished = CompletableDeferred() - val player = - withContext(Dispatchers.Main) { - MediaPlayer().apply { - setAudioAttributes( - AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) - .build(), - ) - setDataSource(tempFile.absolutePath) - setOnCompletionListener { - finished.complete(Unit) + try { + val finished = CompletableDeferred() + val player = + withContext(Dispatchers.Main) { + MediaPlayer().apply { + setAudioAttributes( + AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) + .build(), + ) + setDataSource(tempFile.absolutePath) + setOnCompletionListener { + finished.complete(Unit) + } + setOnErrorListener { _, what, extra -> + finished.completeExceptionally(IllegalStateException("MediaPlayer error ($what/$extra)")) + true + } + prepare() } - setOnErrorListener { _, what, extra -> - finished.completeExceptionally(IllegalStateException("MediaPlayer error ($what/$extra)")) - true - } - prepare() - start() + } + val playback = + ActivePlayback( + cancel = { + finished.completeExceptionally(CancellationException("assistant speech cancelled")) + runCatching { player.stop() } + }, + ) + register(playback) + try { + withContext(Dispatchers.Main) { + player.start() + } + finished.await() + } finally { + clear(playback) + withContext(Dispatchers.Main) { + runCatching { player.stop() } + player.release() } } - val playback = - ActivePlayback( - cancel = { - finished.completeExceptionally(CancellationException("assistant speech cancelled")) - runCatching { player.stop() } - }, - ) - register(playback) - try { - finished.await() } finally { - clear(playback) - withContext(Dispatchers.Main) { - runCatching { player.stop() } - player.release() - } withContext(Dispatchers.IO) { tempFile.delete() }