diff --git a/lib/data/services/bluetooth_manager.dart b/lib/data/services/bluetooth_manager.dart index 4c4f58ffd..08fff314c 100644 --- a/lib/data/services/bluetooth_manager.dart +++ b/lib/data/services/bluetooth_manager.dart @@ -3,6 +3,7 @@ import 'package:get/get.dart'; import 'package:classic_bluetooth/classic_bluetooth.dart'; import '../../core/utils/logger.dart'; import '../../routes/app_routes.dart'; +import 'ble_manager.dart'; // 重新导出蓝牙设备类型,让外部可以通过BluetoothManager访问 export 'package:classic_bluetooth/classic_bluetooth.dart' show BluetoothDevice; @@ -19,7 +20,7 @@ class BluetoothManager extends GetxService { // 当前经典蓝牙设备 final Rx currentDeviceRx = Rx(null); BluetoothDevice? get currentDevice => currentDeviceRx.value; - + final BleManager _bleManager = Get.find(); // 订阅 StreamSubscription? _bluetoothSubscription; @@ -75,7 +76,7 @@ class BluetoothManager extends GetxService { currentDeviceRx.value = newDevice; // 检查当前是否在OTA升级界面,如果是则不跳转 - if (!_isInOtaUpgradePage()) { + if (!_isInOtaUpgradePage() && !_bleManager.isConnected) { Get.toNamed(Routes.pairing, arguments: newDevice); } else { Logger.info('当前在OTA升级界面,跳过配对页面跳转'); diff --git a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift index 2d08ca702..30dfd7464 100644 --- a/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift +++ b/local_plugins/azure_speech/ios/azure_speech/Sources/azure_speech/AzureTtsHelper.swift @@ -264,74 +264,44 @@ public class AzureTtsHelper: NSObject, ITtsService { pendingTasks.removeAll() taskLock.unlock() - // 使用异步停止方法并等待完成 - let stopGroup = DispatchGroup() - stopGroup.enter() - - synthesisQueue.async { [weak self] in - guard let self = self else { - stopGroup.leave() - return - } + do { + print("liwei-------------停止语音合成播放") + try self.synthesizer?.stopSpeaking() + self.notifyEvent(eventType: .synthesisCanceled) + if !micCapture.isCapturing{ + // 停止时设置音频会话为非活跃状态 + // try AVAudioSession.sharedInstance().setActive(false) + } + + print("音频会话已设置为非活跃状态") + } catch { + os_log("停止语音合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription) + self.notifyEvent(eventType: .error, params: [ + "errorCode": "STOP_FAILED", + "errorMessage": error.localizedDescription + ]) + } + + synthesisQueue.async { do { - print("liwei-------------停止语音合成播放") - // 使用同步停止方法 - if let synthesizer = self.synthesizer { - try synthesizer.stopSpeaking() - } - - self.notifyEvent(eventType: .synthesisCanceled) - - if !self.micCapture.isCapturing { - // 停止时设置音频会话为非活跃状态 - // try AVAudioSession.sharedInstance().setActive(false) - } - - print("音频会话已设置为非活跃状态") - - // 等待所有合成操作完成后再重新创建 - self.synthesisGroup.wait() - - // 安全地销毁和重新创建合成器 self.synthesizer = nil try self.recreateSynthesizer() - - } catch { - os_log("停止语音合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription) - self.notifyEvent(eventType: .error, params: [ - "errorCode": "STOP_FAILED", - "errorMessage": error.localizedDescription - ]) + }catch { + os_log("重置语音合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription) } - - stopGroup.leave() } - // 等待停止操作完成 - stopGroup.wait() return true } /** * 释放资源 */ public func dispose() { - // 先停止所有操作 _ = stop() - - // 等待所有异步操作完成 synthesisGroup.wait() synthesisQueue.sync { - // 确保合成器完全停止后再销毁 - if let synthesizer = self.synthesizer { - do { - try synthesizer.stopSpeaking() - } catch { - os_log("停止合成器失败: %{public}@", log: self.log, type: .error, error.localizedDescription) - } - } - synthesizer = nil speechConfig = nil customAudioOutputStream = nil @@ -471,45 +441,29 @@ public class AzureTtsHelper: NSObject, ITtsService { /** * 执行语音合成 */ - private func performSynthesis(sessionid: String, text: String) { + private func performSynthesis(sessionid:String,text: String) { if (self.sessionid != sessionid) { return } - - // 进入合成组 - synthesisGroup.enter() - speaking = true +// lastSpokenText = text // 生成SSML let ssml = generateOptimizedSsml(text) do { if (self.sessionid != sessionid) { - synthesisGroup.leave() return } os_log("开始合成: %{public}@", log: log, type: .debug, ssml) + let result = try synthesizer?.startSpeakingSsml(ssml) - // 使用同步合成方法 - if let synthesizer = self.synthesizer { - do { - try synthesizer.startSpeakingSsml(ssml) - os_log("合成开始成功", log: self.log, type: .debug) - } catch { - self.speaking = false - os_log("合成失败: %{public}@", log: self.log, type: .error, error.localizedDescription) - self.notifyEvent(eventType: .error, params: [ - "errorCode": "SYNTHESIS_FAILED", - "errorMessage": error.localizedDescription - ]) - } + if let result = result { + os_log("合成完成,结果: %{public}@", log: log, type: .debug, String(describing: result.reason)) } - } catch { speaking = false + // 减少待处理文本计数 pendingTextCount = max(0, pendingTextCount - text.count) - synthesisGroup.leave() - os_log("语音合成失败: %{public}@", log: log, type: .error, error.localizedDescription) notifyEvent(eventType: .error, params: [ "errorCode": "SYNTHESIS_FAILED",