Я успешно реализовал WebRTC в своем приложении, однако у меня возникла проблема, из-за которой звук выводился из ресивера, а не из ресивера + динамика.Я закончил тем, что изменил решение, которое нашел для обработки аудио маршрутизации при подключении и отключении Bluetooth-гарнитур или обычных гарнитур.Уведомление обычно срабатывает, как только я получаю звук через библиотеку WebRTC.
NotificationCenter.default.addObserver(forName: AVAudioSession.routeChangeNotification, object: nil, queue: nil, using: routeChange)
func routeChange(_ n: Notification) {
guard let info = n.userInfo,
let value = info[AVAudioSessionRouteChangeReasonKey] as? UInt,
let reason = AVAudioSession.RouteChangeReason(rawValue: value) else { return }
switch reason {
case .categoryChange:
for description in AVAudioSession.sharedInstance().currentRoute.outputs {
if description.portType == AVAudioSession.Port.builtInSpeaker || description.portType == AVAudioSession.Port.builtInReceiver {
try? AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
}
}
case .oldDeviceUnavailable:
try? AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
default:
return
}
}
Однако это решение не позволило мне воспроизвести аудиофайл, который я использую в качестве сигнала / обратной связи, когда пользователь нажимает кнопку в моемприложение.По сути, следующий код будет воспроизводить аудиофайл, но он испортит конфигурацию, указанную выше, различными способами.В первую очередь звук будет выводиться из ресивера, а не из динамика и ресивера.Я считаю, что это также испортилось с гарнитурами.
private func playTapSound() {
guard let url = Bundle.main.url(forResource: App.AudioFile.tapFeedback, withExtension: "mp3") else { return }
do {
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
try AVAudioSession.sharedInstance().setActive(true)
audioPlayer = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
guard let player = audioPlayer else { return }
player.play()
} catch let error {
print("### Error - playing tap audio -", error.localizedDescription)
}
}
Мне нужно воспроизвести аудиофайл, не затрагивая метод routeChange.