2015-12-14 13 views
9

Mam następujący kod do (re) zaczynają AVAudioEngine przewodowy do AVAudioEngineConfigurationChangeNotification:Zawieszenie w AVAudioEngine.start(), mimo że jest owinięty DO/połowu

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

self.engine jest zdefiniowany jako

private let engine = AVAudioEngine() 

jednak często otrzymują raporty o awariach poprzez Crashlytics mówiąc

krytyczny wyjątek: com.apple.coreaudio. avfaudio błąd 561015905

na linii zawierającej try self.engine.start().

561015905 jest AVAudioSessionErrorCodeCannotStartPlaying iz tego co rozumiem, to powinien być kod NSError błąd, nie wyjątek, który powinien być złapany przez mojego pustego catch w kodzie powyżej. Mimo to aplikacja po prostu się zawiesza. czego mi brakuje?

Wiem, że zdarzają się sytuacje, w których aplikacja budzi się w tle, gdzie może wystąpić ten błąd, a ja byłbym w porządku z tym, o ile uda mi się go złapać, jak sądziłem, że mogę z do/catch.

+1

Otrzymuję podobny błąd. Czy domyśliłeś się, dlaczego tak się dzieje? – Pulsar

+1

Nie. Otworzyłem zgłoszenie błędu w Apple, ale nie otrzymałem jeszcze odpowiedzi. Tymczasem przestałem używać 'AVAudioEngine'. – Mike

+0

@Mike jakieś aktualizacje w tej sprawie? Czy znalazłeś lepszą pracę niż sen()? Czy w ogóle słyszałeś od Apple? Wciąż wygląda na to problem w systemie iOS 11. –

Odpowiedz

2

Napotkano ten sam błąd podczas obsługi powiadomienia AVAudioSessionInterruption.
W moim przypadku błąd pojawił się, gdy próbowałem uruchomić AVAudioEngine po zakończeniu przerwy.
Po szczegółowym testowaniu i debugowaniu przez pewien czas zauważyłem, że aplikacja nie uległa awarii, jeśli wprowadzę debugger breakpoint przed audioEngine.prepare() lub audioEngine.start().
Więc dodałem sleep(1) przed audioEngine.start() i moja aplikacja przestała się zawiesza!

Wiem, że nie jest to bardzo eleganckie rozwiązanie, ale nadal mam nadzieję, że może to pomóc komuś innemu!

1

Xcode wersja 9.2 (9C40b) + Swift 4: Wiem, że to pytanie jest trochę stare, jednak miałem takie same problemy z zawieszaniem się z audioEngine.start(), mimo że w do/try/catch, a także otrzymywanie następujących od Crashalytics :

krytyczny wyjątek: com.apple.coreaudio.avfaudio błąd 561015905

sen S1LENT wojownika (1) "hack" pracował w niektórych przypadkach, ale nie wszyscy (konkretnie z selektorem AVAudioEngineConfigurationChangeNotification).

Wreszcie, użyłem Obj-C wyjątek obsługi naprawdę złapać błąd więc nie dochodzi do katastrofy, z tym bardzo użyteczny post przez Freytag (wielkie dzięki!):

Catching NSException in Swift

Teraz, po wdrożeniu ObjC .h i pliki .m a nagłówek pomostowych, robię:

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

można to sprawdzić poprzez wkręcenie się inicjalizacji silnika (np nie .attach .Podłączyć lub cokolwiek) i bez awarii ...tylko:

2018-01-06 10: 01: 0700 + 48,890801 XXXXXX [16389: 3367770] [avae] AVAEInternal.h: 70: _AVAE_Check: wymagany warunek nie jest spełniony [AVAudioEngineGraph.mm:1209:Initialize (inputNode = nullptr || outputNode = nullptr!)] wystąpił błąd: błąd Domain = com.apple.coreaudio.avfaudio Code = 0 "(null)"

Upewnij się sprawdzić Audioengine jest działa przed użyciem, coś takiego:

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

OK, więc otrzymujesz brak dźwięku, ale jest to "zgrabna porażka".

Wydaje się śmieszne, że w Swift nie można właściwie złapać wyjątku, i ok, jeśli zamierzasz zrobić wyjątki, które nie są łatwe do odłowu, to przynajmniej najpierw przetestuj metodę, na przykład audioEngine.areYouConfiguredProperly(). No wiesz, jest ta metoda (w Obj-C) [AVAudioEngine startAndReturnError:], ale ktoś postanowił owinąć ją funkcją startEngine() i zlikwidować całą użyteczną funkcjonalność ... doh.

Powiązane problemy