From 1f6f0528f89b73d176dc07de3b705e90657c76c3 Mon Sep 17 00:00:00 2001 From: dongliang Date: Fri, 8 May 2026 16:15:38 +0930 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=87=E6=8D=A2=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=97=B6=E5=8F=96=E6=B6=88=E6=AD=A3=E5=9C=A8=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E7=9A=84TTS=E5=90=88=E6=88=90=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stop() 只停了 MediaPlayer,没取消 WebSocket 协程, 导致切换任务后上一个任务的语音下载完仍会播放。 现在 stop() 同时取消协程 Job。 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../xiaoqu/watch/service/manager/EdgeTtsManager.kt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/xiaoqu/watch/service/manager/EdgeTtsManager.kt b/app/src/main/java/com/xiaoqu/watch/service/manager/EdgeTtsManager.kt index 23e9599..8faf576 100644 --- a/app/src/main/java/com/xiaoqu/watch/service/manager/EdgeTtsManager.kt +++ b/app/src/main/java/com/xiaoqu/watch/service/manager/EdgeTtsManager.kt @@ -80,6 +80,9 @@ class EdgeTtsManager @Inject constructor( /** 当前 MediaPlayer */ private var mediaPlayer: MediaPlayer? = null + /** 当前合成协程 Job(用于取消正在进行的请求) */ + private var synthesizeJob: kotlinx.coroutines.Job? = null + /** 是否正在播放 */ var isPlaying: Boolean = false private set @@ -99,10 +102,10 @@ class EdgeTtsManager @Inject constructor( fun speak(text: String, voice: String = VOICE_XIAOXIAO, onError: ((String) -> Unit)? = null) { if (text.isBlank()) return - // 停止当前播放 + // 停止当前播放和进行中的请求 stop() - CoroutineScope(Dispatchers.IO).launch { + synthesizeJob = CoroutineScope(Dispatchers.IO).launch { try { // 检查缓存 val cacheFile = getCacheFile(text, voice) @@ -129,8 +132,12 @@ class EdgeTtsManager @Inject constructor( } } - /** 停止播放 */ + /** 停止播放和进行中的合成请求 */ fun stop() { + // 取消正在进行的合成协程(含 WebSocket 请求) + synthesizeJob?.cancel() + synthesizeJob = null + // 停止音频播放 try { mediaPlayer?.apply { if (isPlaying) stop()