为什么AudioServicesCreateSystemSoundID在内部抛出异常但返回0作为错误代码?

时间:2012-03-21 19:26:30

标签: objective-c ios exception audiotoolbox

我在4.3.2,5.0和5.1模拟器中运行iOS程序,而且我在AudioToolbox中遇到了一个奇怪的内部异常。对于所有异常,我在Xcode(Xcode 4.3.1,运行于10.7.3)中设置了断点,并且在调用AudioServicesCreateSystemSoundID()期间调试器正在中断:

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

回溯:

(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

但是,soundID中的音频文件已成功创建,AudioServicesCreateSystemSoundID返回的OSStatus错误代码为0。

这种情况发生在我安装的所有三个iOS模拟器版本中,以及运行5.1的iPhone上。

这看起来与AVAudioPlayer throws breakpoint in debug mode是一样的一般回溯,虽然我的是更直接调用AudioToolbox的结果。

我想用Apple提交此文件,因为它是AudioToolbox中的一个错误(框架不应该使用流量控制,每个bbum和其他的异常),但在此之前,我想知道我可以收集哪些其他信息给他们,如果有任何方法可以避免这种抛出(可能通过调整这个MP3中的ID3标签?)

2 个答案:

答案 0 :(得分:6)

我们在同一个地方遇到异常,结果发现它上面的mp3文件没有有效的ID3标签,通过Tagr等应用程序运行它们修复它们。

答案 1 :(得分:3)

由于各种原因,C ++库可能会在内部抛出并捕获异常,例如缓冲区结束或文件结束。这是否适当使用异常,良好的编码风格或软件工程实践是值得商榷的。只要异常没有使其无法进入您的代码,您就不必担心它。

你说例程返回成功并获得了所需的输出,所以没有错(即它不是错误)。