From 49ce6c2de4ea5d232945067061c0ec54e9ec4180 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Tue, 14 Oct 2025 10:38:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/translations/language/zh_cn.dart | 2 +- .../azure_speech/AzureTtsHelper.kt | 2 +- .../chat_api/QQMusicSystemFunctionHandler.kt | 83 ++++++++++++------- 3 files changed, 57 insertions(+), 30 deletions(-) diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 2d837fc25..63d24ebbb 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -511,7 +511,7 @@ const Map zhCN = { "loadMoreMessages": "加载更多消息...", "loadFailedClickRetry": "加载失败,点击重试", "swipeUpForMore": "向上滑动查看更多", - "callingTool": "正在为您调用工具查询相关信息!", + "callingTool": "正在调用工具!", // 预设提示词 "presetMusic": "来点音乐", // 来点音乐 diff --git a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureTtsHelper.kt b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureTtsHelper.kt index 0c0600aba..09ac0dd40 100644 --- a/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureTtsHelper.kt +++ b/local_plugins/azure_speech/android/src/main/kotlin/com/yunqiinnovation/azure_speech/AzureTtsHelper.kt @@ -671,8 +671,8 @@ class AzureTtsHelper(private val context: Context) : ITtsService { try { synthesizer?.StopSpeakingAsync() + synthesizer?.close() streamBuffer.clear() - isSpeaking = false return true } catch (e: Exception) { diff --git a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/QQMusicSystemFunctionHandler.kt b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/QQMusicSystemFunctionHandler.kt index 1736c1a0d..37f405c66 100644 --- a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/QQMusicSystemFunctionHandler.kt +++ b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/QQMusicSystemFunctionHandler.kt @@ -6,6 +6,7 @@ import kotlinx.coroutines.delay import com.yunqiinnovation.qq_music.QQMusicSingleton import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.resume +import kotlinx.coroutines.CompletableDeferred /** * QQ音乐系统功能处理器 * 负责注册QQ音乐相关的MCP函数 @@ -211,7 +212,8 @@ private class QQMusicPlaySongsHandler(private val context: Context?) : FunctionH val index = (arguments["index"] as? Number)?.toInt() ?: 0 val qqMusicSingleton = QQMusicSingleton.getInstance() var result = "" - + // 创建一个CompletableDeferred用于等待回调结果 + val deferred = CompletableDeferred() qqMusicSingleton.playSongs(songMids, index) { playResult -> result = if (playResult.isSuccess) { "{\"broadcast\": false, \"success\": true, \"message\": \"开始播放歌曲列表\"}" @@ -219,11 +221,12 @@ private class QQMusicPlaySongsHandler(private val context: Context?) : FunctionH val error = playResult.exceptionOrNull() "{\"success\": false, \"message\": \"播放失败: ${error?.message}\"}" } + // 回调完成,唤醒挂起的协程 + deferred.complete(result) } - // 等待回调完成 十秒 - delay(10000) - result.ifEmpty { "{\"nocard\": false,\"broadcast\": true, \"success\": false, \"message\": \"播放超时\"}" } + // 挂起等待回调结果(无超时,直到回调触发) + deferred.await() } catch (e: Exception) { Log.e("QQMusicPlaySongsHandler", "QQ音乐播放歌曲失败", e) "{\"nocard\": true, \"success\": false, \"message\": \"播放异常: ${e.message}\"}" @@ -236,7 +239,8 @@ private class QQMusicPlayHandler(private val context: Context?) : FunctionHandle return try { val qqMusicSingleton = QQMusicSingleton.getInstance() var result = "" - + // 创建一个CompletableDeferred用于等待回调结果 + val deferred = CompletableDeferred() qqMusicSingleton.playMusic { playResult -> result = if (playResult.isSuccess) { "{\"broadcast\": false, \"success\": true, \"message\": \"开始播放\"}" @@ -244,10 +248,12 @@ private class QQMusicPlayHandler(private val context: Context?) : FunctionHandle val error = playResult.exceptionOrNull() "{\"success\": false, \"message\": \"播放失败: ${error?.message}\"}" } + // 回调完成,唤醒挂起的协程 + deferred.complete(result) } - delay(10000) - result.ifEmpty { "{\"success\": false, \"message\": \"播放超时\"}" } + // 挂起等待回调结果(无超时,直到回调触发) + deferred.await() } catch (e: Exception) { Log.e("QQMusicPlayHandler", "QQ音乐播放失败", e) "{\"success\": false, \"message\": \"播放异常: ${e.message}\"}" @@ -260,7 +266,8 @@ private class QQMusicPauseHandler(private val context: Context?) : FunctionHandl return try { val qqMusicSingleton = QQMusicSingleton.getInstance() var result = "" - + // 创建一个CompletableDeferred用于等待回调结果 + val deferred = CompletableDeferred() qqMusicSingleton.pauseMusic { pauseResult -> result = if (pauseResult.isSuccess) { "{\"broadcast\": false, \"success\": true, \"message\": \"暂停播放\"}" @@ -268,10 +275,12 @@ private class QQMusicPauseHandler(private val context: Context?) : FunctionHandl val error = pauseResult.exceptionOrNull() "{\"success\": false, \"message\": \"暂停失败: ${error?.message}\"}" } + // 回调完成,唤醒挂起的协程 + deferred.complete(result) } - delay(2000) - result.ifEmpty { "{\"success\": false, \"message\": \"暂停超时\"}" } + // 挂起等待回调结果(无超时,直到回调触发) + deferred.await() } catch (e: Exception) { Log.e("QQMusicPauseHandler", "QQ音乐暂停失败", e) "{\"success\": false, \"message\": \"暂停异常: ${e.message}\"}" @@ -284,7 +293,8 @@ private class QQMusicResumeHandler(private val context: Context?) : FunctionHand return try { val qqMusicSingleton = QQMusicSingleton.getInstance() var result = "" - + // 创建一个CompletableDeferred用于等待回调结果 + val deferred = CompletableDeferred() qqMusicSingleton.resumeMusic { resumeResult -> result = if (resumeResult.isSuccess) { "{\"broadcast\": false, \"success\": true, \"message\": \"恢复播放\"}" @@ -292,10 +302,12 @@ private class QQMusicResumeHandler(private val context: Context?) : FunctionHand val error = resumeResult.exceptionOrNull() "{\"success\": false, \"message\": \"恢复播放失败: ${error?.message}\"}" } + // 回调完成,唤醒挂起的协程 + deferred.complete(result) } - delay(2000) - result.ifEmpty { "{\"success\": false, \"message\": \"恢复播放超时\"}" } + // 挂起等待回调结果(无超时,直到回调触发) + deferred.await() } catch (e: Exception) { Log.e("QQMusicResumeHandler", "QQ音乐恢复播放失败", e) "{\"success\": false, \"message\": \"恢复播放异常: ${e.message}\"}" @@ -308,7 +320,8 @@ private class QQMusicStopHandler(private val context: Context?) : FunctionHandle return try { val qqMusicSingleton = QQMusicSingleton.getInstance() var result = "" - + // 创建一个CompletableDeferred用于等待回调结果 + val deferred = CompletableDeferred() qqMusicSingleton.stopMusic { stopResult -> result = if (stopResult.isSuccess) { "{\"broadcast\": false, \"success\": true, \"message\": \"停止播放\"}" @@ -316,10 +329,12 @@ private class QQMusicStopHandler(private val context: Context?) : FunctionHandle val error = stopResult.exceptionOrNull() "{\"success\": false, \"message\": \"停止失败: ${error?.message}\"}" } + // 回调完成,唤醒挂起的协程 + deferred.complete(result) } - delay(2000) - result.ifEmpty { "{\"success\": false, \"message\": \"停止超时\"}" } + // 挂起等待回调结果(无超时,直到回调触发) + deferred.await() } catch (e: Exception) { Log.e("QQMusicStopHandler", "QQ音乐停止失败", e) "{\"success\": false, \"message\": \"停止异常: ${e.message}\"}" @@ -332,7 +347,8 @@ private class QQMusicNextHandler(private val context: Context?) : FunctionHandle return try { val qqMusicSingleton = QQMusicSingleton.getInstance() var result = "" - + // 创建一个CompletableDeferred用于等待回调结果 + val deferred = CompletableDeferred() qqMusicSingleton.skipToNext { nextResult -> result = if (nextResult.isSuccess) { "{\"broadcast\": false, \"success\": true, \"message\": \"切换到下一首\"}" @@ -340,10 +356,12 @@ private class QQMusicNextHandler(private val context: Context?) : FunctionHandle val error = nextResult.exceptionOrNull() "{\"success\": false, \"message\": \"切换失败: ${error?.message}\"}" } + // 回调完成,唤醒挂起的协程 + deferred.complete(result) } - delay(2000) - result.ifEmpty { "{\"success\": false, \"message\": \"切换超时\"}" } + // 挂起等待回调结果(无超时,直到回调触发) + deferred.await() } catch (e: Exception) { Log.e("QQMusicNextHandler", "QQ音乐下一首失败", e) "{\"success\": false, \"message\": \"切换异常: ${e.message}\"}" @@ -356,7 +374,8 @@ private class QQMusicPreviousHandler(private val context: Context?) : FunctionHa return try { val qqMusicSingleton = QQMusicSingleton.getInstance() var result = "" - + // 创建一个CompletableDeferred用于等待回调结果 + val deferred = CompletableDeferred() qqMusicSingleton.skipToPrevious { previousResult -> result = if (previousResult.isSuccess) { "{\"broadcast\": false, \"success\": true, \"message\": \"切换到上一首\"}" @@ -364,10 +383,12 @@ private class QQMusicPreviousHandler(private val context: Context?) : FunctionHa val error = previousResult.exceptionOrNull() "{\"success\": false, \"message\": \"切换失败: ${error?.message}\"}" } + // 回调完成,唤醒挂起的协程 + deferred.complete(result) } - delay(2000) - result.ifEmpty { "{\"success\": false, \"message\": \"切换超时\"}" } + // 挂起等待回调结果(无超时,直到回调触发) + deferred.await() } catch (e: Exception) { Log.e("QQMusicPreviousHandler", "QQ音乐上一首失败", e) "{\"success\": false, \"message\": \"切换异常: ${e.message}\"}" @@ -380,7 +401,8 @@ private class QQMusicGetPlaybackStateHandler(private val context: Context?) : Fu return try { val qqMusicSingleton = QQMusicSingleton.getInstance() var result = "" - + // 创建一个CompletableDeferred用于等待回调结果 + val deferred = CompletableDeferred() qqMusicSingleton.getPlaybackState { stateResult -> result = if (stateResult.isSuccess) { val state = stateResult.getOrNull() ?: emptyMap() @@ -392,10 +414,12 @@ private class QQMusicGetPlaybackStateHandler(private val context: Context?) : Fu val error = stateResult.exceptionOrNull() "{\"success\": false, \"message\": \"获取播放状态失败: ${error?.message}\"}" } + // 回调完成,唤醒挂起的协程 + deferred.complete(result) } - delay(2000) - result.ifEmpty { "{\"success\": false, \"message\": \"获取播放状态超时\"}" } + // 挂起等待回调结果(无超时,直到回调触发) + deferred.await() } catch (e: Exception) { Log.e("CahtApi", "获取QQ音乐播放状态失败", e) "{\"success\": false, \"message\": \"获取播放状态异常: ${e.message}\"}" @@ -408,7 +432,8 @@ private class QQMusicGetCurrentSongHandler(private val context: Context?) : Func return try { val qqMusicSingleton = QQMusicSingleton.getInstance() var result = "" - + // 创建一个CompletableDeferred用于等待回调结果 + val deferred = CompletableDeferred() qqMusicSingleton.getCurrentSong { songResult -> result = if (songResult.isSuccess) { val song = songResult.getOrNull() ?: emptyMap() @@ -420,10 +445,12 @@ private class QQMusicGetCurrentSongHandler(private val context: Context?) : Func val error = songResult.exceptionOrNull() "{\"success\": false, \"message\": \"获取当前歌曲失败: ${error?.message}\"}" } + // 回调完成,唤醒挂起的协程 + deferred.complete(result) } - delay(2000) - result.ifEmpty { "{\"success\": false, \"message\": \"获取当前歌曲超时\"}" } + // 挂起等待回调结果(无超时,直到回调触发) + deferred.await() } catch (e: Exception) { Log.e("QQMusicLoginHandler", "获取QQ音乐当前歌曲失败", e) "{\"success\": false, \"message\": \"获取当前歌曲异常: ${e.message}\"}"