2015-12-14 8 views
9

Ho il seguente codice per (ri) avviare AVAudioEngine cablato fino a AVAudioEngineConfigurationChangeNotification:Crash in AVAudioEngine.start() anche se è avvolto in Do/catch

do { 
     try self.engine.start() 
    } catch { 
     DDLogError("could not start sound engine") 
     self.soundEnabled = false 
     return 
    } 

self.engine è definito come

private let engine = AVAudioEngine() 

Tuttavia, ho spesso ricevo segnalazioni di crash via dicendo Crashlytics

irreversibile: com.apple.coreaudio. errore avfaudio 561015905

sulla riga contenente try self.engine.start().

561015905 è AVAudioSessionErrorCodeCannotStartPlaying e da quanto ho capito, questo dovrebbe essere un codice di errore di NSError, non un'eccezione, che dovrebbe essere catturato dal mio vuoto catch nel codice sopra. Tuttavia, l'app sembra proprio bloccarsi a quel punto. Cosa mi manca?

So che ci sono situazioni in cui l'applicazione si sveglia in background in cui questo errore può verificarsi e mi sarebbe bene con che, fintanto che posso in qualche modo catturare ciò accada, come ho pensato che avrei potuto con do/catch.

+1

Viene visualizzato un errore simile. Hai capito perché questo stava accadendo? – Pulsar

+1

No. Ho aperto una segnalazione di bug con Apple ma non ho ancora ricevuto una risposta. Nel frattempo ho smesso di usare 'AVAudioEngine'. – Mike

+0

@Puoi eventuali aggiornamenti su questo? Hai trovato un lavoro migliore di sleep()? E hai sentito parlare di Apple? Questo è ancora un problema in iOS 11 dal suo aspetto. –

risposta

2

Ho riscontrato lo stesso errore quando gestivo la notifica AVAudioSessionInterruption.
Nel mio caso, l'errore si stava verificando quando ho provato ad avviare AVAudioEngine dopo l'interruzione.
Dopo una verifica dettagliata e il debug per un po ', ho notato che l'app non si arrestava in modo anomalo se introducevo un debugger breakpoint prima del audioEngine.prepare() o audioEngine.start().
Quindi ho aggiunto sleep(1) prima del audioEngine.start() e la mia app si è arrestata in modo anomalo!

So che non è una soluzione molto elegante, ma spero che questo possa aiutare qualcun altro!

1

Xcode versione 9.2 (9C40b) + Swift 4: So che questa domanda è un po 'vecchia, tuttavia, stavo avendo gli stessi problemi di arresto con audioEngine.start() anche se in un do/try/catch e ricevendo anche quanto segue da Crashalytics :

irreversibile: errore com.apple.coreaudio.avfaudio 561015905

sonno S1LENT GUERRIERO (1) "hack" ha lavorato in alcuni casi, ma non tutti (in particolare con selettore AVAudioEngineConfigurationChangeNotification).

Infine, ho usato Obj-C gestione delle eccezioni per catturare davvero l'errore così non si verifica alcun incidente, da questo post molto utile per Freytag (grande grazie!):

Catching NSException in Swift

Ora, dopo l'attuazione della objC file .he .m e l'intestazione bridging, mi fanno:

do { 
    try ObjC.catchException { 
     try! self.audioEngine.start() 
    } 
} 
catch { 
    print("An error occurred: \(error)") 
} 

È possibile verificare questo avvitando l'inizializzazione del motore (per esempio non .attach o .Connect nulla) e nessun incidente ...Solo:

2018-01-06 10: 01: 48,890,801 mila + 0700 XXXXXX [16389: 3.367.770] [avae] AVAEInternal.h: 70: _AVAE_Check: condizione richiesta è falsa: [AVAudioEngineGraph.mm:1209:Initialize : (inputNode = nullptr || outputNode = nullptr!!)] è verificato un errore: errore di dominio = com.apple.coreaudio.avfaudio codice = 0 "(null)"

Assicurati di controllare l'Audioengine è in esecuzione prima di usarlo, qualcosa del tipo:

func play(soundName: String) { 
    if !audioEngine.isRunning { 
     return 
    } 
    // play sound 
} 

OK, così si ottiene nessun suono, ma è un "fallito grazioso".

Sembra ridicolo che in Swift non si riesca a rilevare correttamente un'eccezione, e ok se vuoi fare alcune eccezioni non catchabili, allora almeno fornisci un metodo per testare prima, qualcosa come audioEngine.areYouConfiguredProperly(). Oh aspetta c'è questo metodo (in Obj-C) [AVAudioEngine startAndReturnError:] ma qualcuno ha deciso di avvolgerlo con la funzione startEngine() e di eliminare tutte le funzionalità utili ... doh.

Problemi correlati