微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – AVAudioEngine在通话期间拔下耳机时崩溃

这是我在日志中看到的:
16:33:20.236: Call is Dialing
16:33:21.088: AVAudioSessionInterruptionNotification
16:33:21.450: AVAudioSessionRouteChangeNotification
16:33:21.450: ....change reason CategoryChange
16:33:21.539: AVAudioEngineConfigurationChangeNotification
16:33:21.542: Starting Audio Engine
16:33:23.863: AVAudioSessionRouteChangeNotification
16:33:23.863: ....change reason OldDeviceUnavailable
16:33:23.860 ERROR:     [0x100a70000] AVAudioIONodeImpl.mm:317: ___ZN13AVAudioIoUnit11GetHWFormatEjPj_block_invoke: required condition is false: hwFormat
*** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio',reason: 'required condition is false: hwFormat'

订阅了AVAudioEngineConfigurationChangeNotification,AVAudioSessionInterruptNotification:

@objc private func handleAudioEngineConfigurationChangeNotification(notification: NSNotification) {
    println2(notification.name)
    makeEngineConnections()
    startEngine()
}

@objc private func handleAudioSessionInterruptionNotification(notification: NSNotification) {
    println2(notification.name)
    if let interruptionType = AVAudioSessionInterruptionType(rawValue: notification.userInfo?[AVAudioSessionInterruptionTypeKey] as! UInt) {
        switch interruptionType {
        case .Began:
            audioPlayerNode.stop()
        case .Ended:
            if let interruptionoptionValue = notification.userInfo?[AVAudioSessionInterruptionoptionKey] as? UInt {
                let interruptionoption = AVAudioSessionInterruptionoptions(interruptionoptionValue)
                if interruptionoption == AVAudioSessionInterruptionoptions.OptionShouldResume {
                    AVAudioSession.sharedInstance().setActive(true,error: nil)
                    startEngine()
                }
            }
        }
    }
}

func startEngine() {
    println2("Starting Audio Engine")
    var error: NSError?

    if !audioEngine.running {
        audioEngine.startAndReturnError(&error)
        if let error = error {
            println2("Error initializing Audio Engine: " + error.localizedDescription)
        }
    }
}

private func makeEngineConnections() {
    let mainmixer = audioEngine.mainmixerNode
    audioEngine.connect(audioPlayerNode,to: audioEqNode,format: mainmixer.outputFormatForBus(0))
    audioEngine.connect(audioEqNode,to: audioTimePitch,format: mainmixer.outputFormatForBus(0))
    audioEngine.connect(audioTimePitch,to: mainmixer,format: mainmixer.outputFormatForBus(0))
}

但它似乎没有工作.

如何避免这个崩溃?

解决方法

我怀疑问题在这里
audioEngine.connect(audioTimePitch,to:mainmixer,format:mainmixer.outputFormatForBus(0))

documentation说:

This method calls connect:to:fromBus:toBus:format: using bus 0 for the source audio node,and bus 0 for the destination audio node,except in the case of a destination which is a mixer,in which case the destination is the mixer’s nextAvailableInputBus.

原文地址:https://www.jb51.cc/iOS/335443.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐