Я хочу переключаться между двумя подключенными устройствами / динамиками Bluetooth, когда пользователь вводит c символов. Но следующий код не переключается, когда я вызываю «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);
}
РЕДАКТИРОВАТЬ: последний подключенный динамик воспроизводит звук. Но я не могу переключаться между ними. Это как-то возможно?