2012-03-21 9 views
12

Używam programu iOS w Symulatorach 4.3.2, 5.0 i 5.1, a ja wybieram dziwny wewnętrzny wyjątek w AudioToolbox. Mam ustawiony punkt przerwania w Xcode (Xcode 4.3.1 działa na 10.7.3) dla wszystkich wyjątków i debugger pęka podczas rozmowy do AudioServicesCreateSystemSoundID():Dlaczego usługa AudioServicesCreateSystemSoundID zgłasza wewnętrznie wyjątek, ale zwraca 0 jako kod błędu?

SystemSoundID soundID; 
OSStatus errorCode = AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID); 
        //^boom.^

backtrace:

(lldb) bt 
* thread #1: tid = 0x1f03, 0x9000e230 libc++abi.dylib`__cxa_throw, stop reason = breakpoint 1.2 
frame #0: 0x9000e230 libc++abi.dylib`__cxa_throw 
frame #1: 0x00144193 AudioToolbox`ID3ParserHandle::ID3ParserHandle(void*, long (*)(void*, unsigned long, unsigned long, unsigned long, void**, unsigned long*)) + 259 
frame #2: 0x001442de AudioToolbox`ID3ParserOpen + 62 
frame #3: 0x0006c0e7 AudioToolbox`MPEGAudioFile::ParseID3Tags() + 87 
frame #4: 0x0006c2ba AudioToolbox`MPEGAudioFile::ParseAudioFile() + 26 
frame #5: 0x00015153 AudioToolbox`AudioFileOpenWithCallbacks + 371 
frame #6: 0x00027020 AudioToolbox`_ZL15VerifyAndMapURLPK7__CFURLRx + 448 
frame #7: 0x00026d85 AudioToolbox`_ZL18ActionDataToServerPK7__CFURLm + 933 
frame #8: 0x000da26b AudioToolbox`AudioServicesCreateSystemSoundID + 235 
frame #9: 0x00005be1 app`-[SoundsViewController playSoundForPath:] + 257 at SoundsViewController.m:161 
frame #10: 0x00005a99 app`-[SoundsViewController tableView:didSelectRowAtIndexPath:] + 777 at SoundsViewController.m:129 
frame #11: 0x0029db68 UIKit`-[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1140 
frame #12: 0x00293b05 UIKit`-[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 219 
frame #13: 0x009ad79e Foundation`__NSFireDelayedPerform + 441 
frame #14: 0x00fb58c3 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19 
frame #15: 0x00fb6e74 CoreFoundation`__CFRunLoopDoTimer + 1220 
frame #16: 0x00f132c9 CoreFoundation`__CFRunLoopRun + 1817 
frame #17: 0x00f12840 CoreFoundation`CFRunLoopRunSpecific + 208 
frame #18: 0x00f12761 CoreFoundation`CFRunLoopRunInMode + 97 
frame #19: 0x01f6b1c4 GraphicsServices`GSEventRunModal + 217 
frame #20: 0x01f6b289 GraphicsServices`GSEventRun + 115 
frame #21: 0x00234c93 UIKit`UIApplicationMain + 1160 
frame #22: 0x00002c45 app`main + 181 at main.m:14 

jednak plik audio soundID tworzony jest z powodzeniem, a kod błędu OSStatus że AudioServicesCreateSystemSoundID zwraca 0.

dzieje się tak we wszystkich trzech wersjach iOS Simulator mam zainstalowany i uruchomiony na moim iPhone 5.1.

Wygląda na taki sam ogólny ślad śledzenia, jak AVAudioPlayer throws breakpoint in debug mode, chociaż moje jest wynikiem bardziej bezpośredniego wywoływania AudioToolbox.

Chcę złożyć to w Apple, ponieważ jest to błąd w AudioToolbox (frameworki nie powinny używać wyjątków do sterowania przepływem, per bbum i innych), ale zanim to zrobię, zastanawiam się, jakie inne informacje mogę zebrać dać im, i czy jest jakiś sposób na uniknięcie tego rzutu (może przez ulepszenie znaczników ID3 w tym pliku mp3?)

+0

Otrzymuję również wyjątek zgłoszony w metodzie ExtAudioFileSetProperty AudioToolbox. Niestety nie znalazłem sposobu na uniknięcie wyjątków. –

+0

Tak, wygląda na to, że używają wewnętrznej tony wyjątków do sterowania przepływem. Najlepszym rozwiązaniem jest nie ręczne dodanie wszystkich rzutów wyjątków jako punktu przerwania, a zamiast tego użycie punktu przerwania "Wyjątkowy punkt przerwania". – cbowns

+0

Wygląda na to, że jest to błąd symulatora. Gdy uruchomię aplikację na moim iPhonie, nie nastąpi awaria. – 0xa6a

Odpowiedz

3

Biblioteki C++ mogą wewnętrznie odrzucać i wychwytywać wyjątki z różnych przyczyn, na przykład koniec bufora lub koniec plik. Czy jest to odpowiednie użycie wyjątków, dobry styl kodowania lub praktyka inżynierii oprogramowania, jest dyskusyjna. Tak długo, jak wyjątek nie sprawi, że nie będzie on dostępny w twoim kodzie, nie powinieneś się o to martwić.

Mówisz, że procedura powraca pomyślnie i otrzymujesz żądane wyjście, więc nic nie jest źle (tj. Nie jest to błąd).

+0

Uzgodnione. Generalnie przestałem ustawiać punkt przerwania "wszystkie wyjątki", ponieważ wiele bibliotek C++ używa go do sterowania przepływem. – cbowns

6

Uruchomiliśmy wyjątek w tym samym miejscu, okazało się, że pliki mp3, na których się pojawił, nie miały prawidłowych tagów ID3, dzięki czemu zostały naprawione przez aplikację, taką jak Tagr.

+0

Dawno temu przestałem pracować nad projektem, ale to świetnie wiedzieć. Dzięki za informację! – cbowns

+0

W przypadku małych partii plików audio z niepoprawnymi znacznikami należy rozważyć użycie aplikacji OSM [Tag] (http://www.wideanglesoftware.com/musictag/) zamiast płacenia za Tagr. – AWrightIV

Powiązane problemy