当用户输入特定字符时,我想在两个连接的蓝牙设备/扬声器之间切换。但是,当我调用“ changeToSecondBleSpeaker()”时,以下代码不会切换。
在我的情况下,第一个是Beats耳机,第二个是UE BOOM 2。 它仅通过UE BOOM 2(secondBle)播放声音,但不切换到Beats耳机(firstBle)。
有人知道为什么吗?预先感谢!
@IBOutlet weak var textField: UITextField!
private let synthesizer = AVSpeechSynthesizer()
let audioSession = AVAudioSession.sharedInstance()
var firstBle:AVAudioSessionPortDescription?
var secondBle:AVAudioSessionPortDescription?
var currentSpeaker: speaker = .firstBle
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.textField.delegate = self
do {
try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: .default, options: .allowBluetooth)
} catch let error as NSError {
print("setCategory error: \(error.localizedDescription)")
}
firstBle = audioSession.availableInputs?.first(where: {return $0.portType == .bluetoothHFP && $0.portName.contains("Beats")})
secondBle = audioSession.availableInputs?.first(where: {return $0.portType == .bluetoothHFP && $0.portName.contains("BOOM")})
changeToFirstBleSpeaker()
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string == "w" {
changeToSecondBleSpeaker()
speak(text: textField.text!)
} else {
if currentSpeaker != .firstBle {
changeToFirstBleSpeaker()
}
speak(text: string)
}
return true
}
func changeToFirstBleSpeaker() {
do {
if let firstBleSpeaker = firstBle {
try audioSession.setActive(false)
try audioSession.setPreferredInput(firstBleSpeaker)
try audioSession.setActive(true)
currentSpeaker = .firstBle
print("switched to \(firstBleSpeaker.portName)")
} else {
print("Error connecting to firstBleDevice")
currentSpeaker = .firstBle
}
} catch {
print("Error connecting to firstBleDevice")
currentSpeaker = .firstBle
}
}
func changeToSecondBleSpeaker() {
do {
if let secondBleSpeaker = secondBle {
try audioSession.setActive(false)
try audioSession.setPreferredInput(secondBleSpeaker)
try audioSession.setActive(true)
currentSpeaker = .secondBle
print("switched to \(secondBleSpeaker.portName)")
} else {
print("Error connecting to secondBleSpeaker")
currentSpeaker = .firstBle
}
} catch {
print("Error connecting to secondBleSpeaker")
currentSpeaker = .firstBle
}
}
func speak(text: String) {
let utterance = AVSpeechUtterance(string: text)
utterance.rate = 0.5
utterance.voice = AVSpeechSynthesisVoice(identifier: "com.apple.ttsbundle.Markus-premium")
print(utterance.description)
synthesizer.speak(utterance);
}
编辑: 最后连接的扬声器播放声音。但是我不能在它们之间切换。有可能吗?