iOS Не удается переключиться между двумя устройствами Bluetooth - PullRequest
0 голосов
/ 29 февраля 2020

Я хочу переключаться между двумя подключенными устройствами / динамиками 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);
    }


РЕДАКТИРОВАТЬ: последний подключенный динамик воспроизводит звук. Но я не могу переключаться между ними. Это как-то возможно?

...