2015-07-19 16 views
13

Oto, co widzę w dzienniku:AVAudioEngine wywala kiedy odłączyć słuchawki podczas rozmowy

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' 

Mam subskrybowanych zarówno AVAudioEngineConfigurationChangeNotification, AVAudioSessionInterruptionNotification:

@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)) 
} 

ale to nie robi wydaje się działać.

Jak uniknąć awarii?

+0

Przejdź do strony http://stackoverflow.com/questions/26728250/avaudioengine-crashes-when-plug-headphones-in-or-out – Omar

+0

Dzięki, ale to nie pomaga. Jak widać, aplikacja subskrybuje "AVAudioEngineConfigurationChangeNotification" –

+0

Czy otrzymujesz powiadomienia? Czy dźwięk zatrzymał się pomyślnie? lub czy ulega awarii przed otrzymaniem powiadomienia. – Omar

Odpowiedz

1

Podejrzewam, że problem jest tutaj:
audioEngine.connect(audioTimePitch, to: mainMixer, format: mainMixer.outputFormatForBus(0))

documentation mówi:

metoda ta wymaga podłączenia: do: fromBus: toBus: format: za pomocą magistrali 0 do węzła źródło dźwięku, i magistralę 0 dla docelowego węzła audio, z wyjątkiem przypadku docelowego, który jest mikserem, w którym to przypadku punktem docelowym jest nextAvailableInputBus miksera.

Powiązane problemy