我正在使用添加剂合成在iPhone上合成音频,我的应用程序用Objective C编写,在播放音频时崩溃。该合成引擎在该应用程序的早期版本和较早的iOS中运行。我目前正在使用Xcode 8.3.3对iOS 10.3.3进行测试。
编辑 - 在当前版本中,视图控制器发送消息的MIDI音符以与合成引擎通信。以前的版本没有使用MIDI命令。
该应用程序合成两种声音:铃声和正弦音合唱。它做得很顺利,没有瞬变。但是,如果在试图播放另一个声音时播放一个声音,它将会崩溃。然而,如果重复相同的声音或用户在播放铃声之前停止合唱声音(或反之亦然),它永远不会崩溃。
铃声有11个固定频率的部分,每个部分由幅度包络形成。合唱音调有5个部分,每个部分具有音调移位包络和幅度包络。信封持续时间在运行时计算,从用户触发声音到最后一个活动状态结束,如图(下面)所示。
在两种情况下,崩溃始终如一。
首先,在合唱声仍在播放时播放铃声可能导致崩溃,在这种情况下,Xcode进入调试状态,寻找Amplitude partial 6,
不会被使用的部分如果缓冲区仍在尝试访问只有 5 partials 的合唱声音。
该图显示了如果在第一个状态(0:00和0:24之间)播放的两个声音事件之后是在以下状态下播放的第三个声音,应该发生什么。所有三个的包络持续时间计算结束于1:36。通常,铃声(在0:24和0:48之间)将持续到1:36,除非玩家通过播放与前两个声音一样的另一个声音来中断它。但是,作为第一个在新状态下播放的声音,播放它会将应用程序发送到调试状态。
另外,在铃声仍在播放时播放合唱声也会导致崩溃,其中Xcode进入调试状态,查看Pitch shift partial 1,
部分永不使用的声音如果缓冲区仍然试图访问铃声固定的铃声。
在这两个示例中,当尝试访问状态更改之前处于活动状态的缓冲区时,我的代码看起来好像失败了。但我无法找到原因。我尝试更改缓冲区大小,但没有什么区别(当我在下面生成日志时恰好设置为5)。
以下是我用于为钟形和合唱合成提供缓冲输入的两种方法,定义缓冲区状态的typedef
和典型的铃声崩溃和合唱崩溃的调试日志。在深入了解音频被合成到输出缓冲区的例程之前,我需要一些关于这些的反馈。我也乐意与大家分享,但希望这个问题对其他人来说已经很明显了。
该应用程序几乎可以正常运行但过去几周我已经破解了代码并修复了几次而没有更接近解决这个问题。
我的代码是由Mattias Hollejman创建的非常有用的 AudioBufferPlayer
和 Synth
示例的扩展Mario Diana。
更新
我添加了一个名为showPark
的新方法,以生成更清晰的日志,显示每个实时事件到达时音频缓冲区的状态。当音频缓冲区大小为3时,日志会清楚地显示三个事件之后的缓冲区填充,而不会发生所有后续事件。
问题在前24秒内不明显,因为合成参数保持不变。然而,在24秒之后,当事件6发生时,事情发生变化,合成引擎无法访问合成铃声所需的参数。我认为这解释了崩溃是如何发生的。在此基础上,我试图找出解决问题的最佳方法,我欢迎任何知道该怎么做的人的建议。
这是一个崩溃日志。
崩溃日志(最新)
2017-08-01 13:48:59.330 SatGam2[1169:1226966] PlayView loaded (selectedFamily:1 selectedPlayerID:9)
2017-08-01 13:48:59.331 SatGam2[1169:1226966] ENABLED (player 9: state 0)
2017-08-01 13:49:01.071 SatGam2[1169:1226966]
2017-08-01 13:49:01.072 SatGam2[1169:1226966] EVENT 1
2017-08-01 13:49:01.072 SatGam2[1169:1226966]
2017-08-01 13:49:01.072 SatGam2[1169:1226966] MIDI Status: 0 MIDI Note: 0 State: ToneEventStateInactive
2017-08-01 13:49:01.073 SatGam2[1169:1226966] MIDI Status: 0 MIDI Note: 0 State: ToneEventStateInactive
2017-08-01 13:49:01.073 SatGam2[1169:1226966] MIDI Status: 0 MIDI Note: 0 State: ToneEventStateInactive
2017-08-01 13:49:01.073 SatGam2[1169:1226966] update parkPointer [1]
2017-08-01 13:49:01.073 SatGam2[1169:1226966]
2017-08-01 13:49:01.074 SatGam2[1169:1226966] Risset Chorus playing MIDI note number: 1 length: 95
2017-08-01 13:49:01.074 SatGam2[1169:1226966] [playChorus - buffer: 0 state: 0]
2017-08-01 13:49:03.873 SatGam2[1169:1226966] EVENT 2
2017-08-01 13:49:03.874 SatGam2[1169:1226966]
2017-08-01 13:49:03.874 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 1 State: ToneEventStatePressed
2017-08-01 13:49:03.874 SatGam2[1169:1226966] MIDI Status: 0 MIDI Note: 0 State: ToneEventStateInactive
2017-08-01 13:49:03.875 SatGam2[1169:1226966] MIDI Status: 0 MIDI Note: 0 State: ToneEventStateInactive
2017-08-01 13:49:03.875 SatGam2[1169:1226966] update parkPointer [2]
2017-08-01 13:49:03.875 SatGam2[1169:1226966]
2017-08-01 13:49:03.875 SatGam2[1169:1226966] Risset Chorus playing MIDI note number: 3 length: 92
2017-08-01 13:49:03.876 SatGam2[1169:1226966] [playChorus - buffer: 1 state: 0]
2017-08-01 13:49:06.180 SatGam2[1169:1226966] EVENT 3
2017-08-01 13:49:06.180 SatGam2[1169:1226966]
2017-08-01 13:49:06.180 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 1 State: ToneEventStatePressed
2017-08-01 13:49:06.180 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 3 State: ToneEventStatePressed
2017-08-01 13:49:06.181 SatGam2[1169:1226966] MIDI Status: 0 MIDI Note: 0 State: ToneEventStateInactive
2017-08-01 13:49:06.181 SatGam2[1169:1226966] update parkPointer [0]
2017-08-01 13:49:06.181 SatGam2[1169:1226966]
2017-08-01 13:49:06.181 SatGam2[1169:1226966] Risset Chorus playing MIDI note number: 5 length: 90
2017-08-01 13:49:06.182 SatGam2[1169:1226966] [playChorus - buffer: 2 state: 0]
2017-08-01 13:49:10.162 SatGam2[1169:1226966] EVENT 4
2017-08-01 13:49:10.162 SatGam2[1169:1226966]
2017-08-01 13:49:10.163 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 1 State: ToneEventStatePressed
2017-08-01 13:49:10.163 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 3 State: ToneEventStatePressed
2017-08-01 13:49:10.163 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 5 State: ToneEventStatePressed
2017-08-01 13:49:10.163 SatGam2[1169:1226966] update parkPointer [1]
2017-08-01 13:49:10.163 SatGam2[1169:1226966]
2017-08-01 13:49:10.164 SatGam2[1169:1226966] Risset Chorus playing MIDI note number: 7 length: 86
2017-08-01 13:49:11.352361+1000 SatGam2[1169:1228409] [aqme] 254: AQDefaultDevice (173): skipping input stream 0 0 0x0
2017-08-01 13:49:13.041 SatGam2[1169:1226966]
2017-08-01 13:49:13.042 SatGam2[1169:1226966] EVENT 5
2017-08-01 13:49:13.043 SatGam2[1169:1226966]
2017-08-01 13:49:13.043 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 1 State: ToneEventStatePressed
2017-08-01 13:49:13.043 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 3 State: ToneEventStatePressed
2017-08-01 13:49:13.043 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 5 State: ToneEventStatePressed
2017-08-01 13:49:13.044 SatGam2[1169:1226966] update parkPointer [2]
2017-08-01 13:49:13.044 SatGam2[1169:1226966]
2017-08-01 13:49:13.044 SatGam2[1169:1226966] Risset Chorus playing MIDI note number: 9 length: 83
2017-08-01 13:49:23.332 SatGam2[1169:1226966] ENABLED (player 9: state 1)
2017-08-01 13:49:25.228 SatGam2[1169:1226966] EVENT 6
2017-08-01 13:49:25.228 SatGam2[1169:1226966]
2017-08-01 13:49:25.229 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 1 State: ToneEventStatePressed
2017-08-01 13:49:25.229 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 3 State: ToneEventStatePressed
2017-08-01 13:49:25.229 SatGam2[1169:1226966] MIDI Status: 144 MIDI Note: 5 State: ToneEventStatePressed
2017-08-01 13:49:25.229 SatGam2[1169:1226966] update parkPointer [0]
2017-08-01 13:49:25.229 SatGam2[1169:1226966]
2017-08-01 13:49:25.230 SatGam2[1169:1226966] Risset Bell playing MIDI note number: 0 length: 71
SatGam2 was compiled with optimization - stepping may behave oddly; variables may not be available.
(lldb) bt
* thread #9, name = 'com.apple.coreaudio.AQClient', stop reason = EXC_BAD_ACCESS (code=1, address=0xb174)
* frame #0: 0x000a1ea5 SatGam2`-[Synth amplitudeLookupPartial6:](self=<unavailable>, _cmd="amplitudeLookupPartial6:", n=<unavailable>) at Synth.m:988 [opt]
frame #1: 0x000a1519 SatGam2`-[Synth fillBuffer:frames:](self=0x7a831a00, _cmd="fillBuffer:frames:", buffer=<unavailable>, frames=<unavailable>) at Synth.m:805 [opt]
frame #2: 0x000a516c SatGam2`__39-[PlayViewController startAudioSession]_block_invoke((null)=0x7ce7f8e0, buffer=<unavailable>, audioFormat=AudioStreamBasicDescription @ 0xb0422ab8) at PlayViewController.m:397 [opt]
frame #3: 0x000a3aa8 SatGam2`PlayCallback(inUserData=0x7946f4c0, inAudioQueue=<unavailable>, inBuffer=<unavailable>) at AudioBufferPlayer.m:30 [opt]
(日志的其余部分与下面显示的日志相同)
以下是新方法的代码
- (void)showPark:(uint8_t)midiStatus data1:(uint8_t)mapped_MIDINoteNumber
{
// see if MIDI events are currently active and what kind of event
eventCount++;
NSLog(@"\n\n");
NSLog(@"EVENT %i", eventCount);
NSLog(@"\n");
for (int n = 0; n < MaxToneEvents; ++n)
{
// scan buffers
int a = _tones[n].state;
int b = _tones[n].midiStatus;
int c = _tones[n].midiNote;
NSLog(@" MIDI Status: %3d MIDI Note: %3d State: %@", b, c, [self getCurrent:(int)a]);
}
// update parkPointer
parkPointer = (parkPointer + 1) % MaxToneEvents;
NSLog(@" update parkPointer [%i]", parkPointer);
NSLog(@"\n");
}
-(NSString *)getCurrent:(int)state
{
switch(state){
case ToneEventStateInactive:
return @"ToneEventStateInactive";
case ToneEventStatePressed:
return @"ToneEventStatePressed";
case ToneEventStateReleased:
return @"ToneEventStateReleased";
default:
return @"null";
}
}
showPark
是通过之前未显示的方法调用的,因此我将其包含在此处。
- (void)sendMIDIEvent:(uint8_t)midiStatus
data1:(uint8_t)mapped_MIDINoteNumber // dekany buttons mapped to MIDI Note Numbers 0-9
data2:(uint8_t)data2
{
// 1. check parking bay
[self showPark:(uint8_t)midiStatus data1:(uint8_t)mapped_MIDINoteNumber];
// 2. identify MIDI status
if (midiStatus == MIDI_Status_KeyOn_RissetChorus) // 144
{
// 3. pick up duration and send a message to playChorus
[self playChorus:(uint8_t)midiStatus
chorusPitch:(uint8_t)mapped_MIDINoteNumber
length:(int)noteLength];
}
else
{
if (midiStatus == MIDI_Status_KeyOn_RissetBell) // 145
{
// 4. pick up duration and send a message to playBell
[self playBell:(uint8_t)midiStatus
bellPitch:(uint8_t)mapped_MIDINoteNumber
length:(int)noteLength];
}
}
}
playBell
-(void)playBell:(uint8_t)midiStatus
bellPitch:(uint8_t)midiNoteNumber
length:(int)length;
{
hasPitchEnvelope = FALSE;
for (int n = 0; n < MaxToneEvents; ++n)
{
if (_tones[n].state == ToneEventStateInactive) // find an empty slot
{
_tones[n].state = ToneEventStatePressed;
_tones[n].frequency = _pitches[midiNoteNumber];
_tones[n].phase1 = 0.0f;
_tones[n].phase2 = 0.0f;
_tones[n].phase3 = 0.0f;
_tones[n].phase4 = 0.0f;
_tones[n].phase5 = 0.0f;
_tones[n].phase6 = 0.0f;
_tones[n].phase7 = 0.0f;
_tones[n].phase8 = 0.0f;
_tones[n].phase9 = 0.0f;
_tones[n].phase10 = 0.0f;
_tones[n].phase11 = 0.0f;
_tones[n].levelEnvelope1 = _levelPartialEnvelope1;
_tones[n].levelEnvelope2 = _levelPartialEnvelope2;
_tones[n].levelEnvelope3 = _levelPartialEnvelope3;
_tones[n].levelEnvelope4 = _levelPartialEnvelope4;
_tones[n].levelEnvelope5 = _levelPartialEnvelope5;
_tones[n].levelEnvelope6 = _levelPartialEnvelope6;
_tones[n].levelEnvelope7 = _levelPartialEnvelope7;
_tones[n].levelEnvelope8 = _levelPartialEnvelope8;
_tones[n].levelEnvelope9 = _levelPartialEnvelope9;
_tones[n].levelEnvelope10 = _levelPartialEnvelope10;
_tones[n].levelEnvelope11 = _levelPartialEnvelope11;
_tones[n].gain = 1.0f;
_tones[n].envStep = 0.0f;
_tones[n].envDelta = ENVELOPE_LENGTH / length; // GS Envelope
_tones[n].fadeOut = 1.0f;
return;
}
}
}
playChorus
- (void)playChorus:(uint8_t)midiStatus
chorusPitch:(uint8_t)midiNoteNumber
length:(int)length;
{
hasPitchEnvelope = TRUE;
for (int n = 0; n < MaxToneEvents; ++n)
{
if (_tones[n].state == ToneEventStateInactive) // find an empty slot
{
_tones[n].state = ToneEventStatePressed;
_tones[n].frequency = _pitches[midiNoteNumber];
_tones[n].phase1 = 0.0f;
_tones[n].phase2 = 0.0f;
_tones[n].phase3 = 0.0f;
_tones[n].phase4 = 0.0f;
_tones[n].phase5 = 0.0f;
_tones[n].phase6 = 0.0f;
_tones[n].phase7 = 0.0f;
_tones[n].phase8 = 0.0f;
_tones[n].phase9 = 0.0f;
_tones[n].phase10 = 0.0f;
_tones[n].phase11 = 0.0f;
_tones[n].levelEnvelope1 = _levelEnvelopeAboveOuter;
_tones[n].levelEnvelope2 = _levelEnvelopeAboveInner;
_tones[n].levelEnvelope3 = _levelEnvelopeCentreNote;
_tones[n].levelEnvelope4 = _levelEnvelopeBelowInner;
_tones[n].levelEnvelope5 = _levelEnvelopeBelowOuter;
_tones[n].pitchEnvelope1 = _pitchEnvelopeAboveOuter;
_tones[n].pitchEnvelope2 = _pitchEnvelopeAboveInner;
_tones[n].pitchEnvelope3 = _pitchEnvelopeCentreNote;
_tones[n].pitchEnvelope4 = _pitchEnvelopeBelowInner;
_tones[n].pitchEnvelope5 = _pitchEnvelopeBelowOuter;
_tones[n].gain = 1.0f;
_tones[n].envStep = 0.0f;
_tones[n].envDelta = ENVELOPE_LENGTH / length; // GS Envelope
_tones[n].fadeOut = 1.0f;
return;
}
}
}
ToneEvent
typedef enum
{
ToneEventStateInactive = 0, // ToneEvent is not used for playing a tone
ToneEventStatePressed, // ToneEvent is still playing normally
ToneEventStateReleased, // ToneEvent is released and ringing out
}
ToneEventState;
铃声崩溃
2017-07-28 21:05:28.438 SatGam2[897:503237] ENABLED (player 4: state 1)
2017-07-28 21:05:28.502804+1000 SatGam2[897:504929] [aqme] 254: AQDefaultDevice (173): skipping input stream 0 0 0x0
2017-07-28 21:05:30.511372+1000 SatGam2[897:504929] [aqme] 254: AQDefaultDevice (173): skipping input stream 0 0 0x0
2017-07-28 21:05:30.852 SatGam2[897:503237] ToneEventStatePressed
2017-07-28 21:05:30.853 SatGam2[897:503237] ToneEventStateReleased
2017-07-28 21:05:30.853 SatGam2[897:503237] ToneEventStatePressed
2017-07-28 21:05:30.854 SatGam2[897:503237] ToneEventStatePressed
2017-07-28 21:05:30.854 SatGam2[897:503237] ToneEventStatePressed
2017-07-28 21:05:30.854 SatGam2[897:503237] noteLength 70
2017-07-28 21:05:30.855 SatGam2[897:503237] timeToGo 70 [RissetBells, from PlayViewController]
2017-07-28 21:05:30.855 SatGam2[897:503237] Risset Bell MIDI note number 1 : length 70
2017-07-28 21:05:30.855 SatGam2[897:503237] Clapper button 7 pressed
SatGam2 was compiled with optimization - stepping may behave oddly; variables may not be available.
(lldb) bt
* thread #10, name = 'com.apple.coreaudio.AQClient', stop reason = EXC_BAD_ACCESS (code=1, address=0x9514)
* frame #0: 0x00071d82 SatGam2`-[Synth amplitudeLookupPartial6:](self=<unavailable>, _cmd="amplitudeLookupPartial6:", n=<unavailable>) at Synth.m:875 [opt]
frame #1: 0x000713f6 SatGam2`-[Synth fillBuffer:frames:](self=0x7e805a00, _cmd="fillBuffer:frames:", buffer=<unavailable>, frames=<unavailable>) at Synth.m:692 [opt]
frame #2: 0x000751e9 SatGam2`__39-[PlayViewController startAudioSession]_block_invoke((null)=0x7ae48160, buffer=<unavailable>, audioFormat=AudioStreamBasicDescription @ 0xb0491ab8) at PlayViewController.m:393 [opt]
frame #3: 0x00073985 SatGam2`PlayCallback(inUserData=0x7c44ac60, inAudioQueue=<unavailable>, inBuffer=<unavailable>) at AudioBufferPlayer.m:30 [opt]
frame #4: 0x00a65e90 AudioToolbox`ClientAudioQueue::CallOutputCallback(AudioQueueBuffer*) + 336
frame #5: 0x00a69a99 AudioToolbox`ClientMessageHandler::OutputBufferComplete(unsigned int) + 137
frame #6: 0x00a5fc90 AudioToolbox`AQClientCallbackMessageReader::DispatchCallbacks(void const*, unsigned long) + 176
frame #7: 0x00a5f98d AudioToolbox`ClientAudioQueue::FetchAndDeliverPendingCallbacks(unsigned int) + 301
frame #8: 0x00a5fb78 AudioToolbox`AQCallbackReceiver_CallbackNotificationsAvailable + 152
frame #9: 0x009b071a AudioToolbox`_XCallbackNotificationsAvailable + 42
frame #10: 0x00c3b37b AudioToolbox`mshMIGPerform + 207
frame #11: 0x035e28b3 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 35
frame #12: 0x035e2822 CoreFoundation`__CFRunLoopDoSource1 + 498
frame #13: 0x035daccd CoreFoundation`__CFRunLoopRun + 2669
frame #14: 0x035d9fd4 CoreFoundation`CFRunLoopRunSpecific + 372
frame #15: 0x035d9e4b CoreFoundation`CFRunLoopRunInMode + 123
frame #16: 0x00a6a822 AudioToolbox`GenericRunLoopThread::Entry(void*) + 178
frame #17: 0x00c406b2 AudioToolbox`CAPThread::Entry(CAPThread*) + 96
frame #18: 0x06215047 libsystem_pthread.dylib`_pthread_body + 184
frame #19: 0x06214f8f libsystem_pthread.dylib`_pthread_start + 243
frame #20: 0x0621484a libsystem_pthread.dylib`thread_start + 34
(lldb)
合唱失败
2017-07-28 20:30:13.061 SatGam2[864:436890] ENABLED (player 4: state 2)
2017-07-28 20:30:13.227994+1000 SatGam2[864:438359] [aqme] 254: AQDefaultDevice (173): skipping input stream 0 0 0x0
2017-07-28 20:30:14.878 SatGam2[864:436890] ToneEventStatePressed
2017-07-28 20:30:14.878 SatGam2[864:436890] ToneEventStateReleased
2017-07-28 20:30:14.879 SatGam2[864:436890] ToneEventStatePressed
2017-07-28 20:30:14.879 SatGam2[864:436890] ToneEventStatePressed
2017-07-28 20:30:14.879 SatGam2[864:436890] ToneEventStatePressed
2017-07-28 20:30:14.879 SatGam2[864:436890] noteLength 47
2017-07-28 20:30:14.880 SatGam2[864:436890] timeToGo 47 [RissetChorus, from PlayViewController]
2017-07-28 20:30:14.880 SatGam2[864:436890] Risset Chorus MIDI note number 3 : length 47
2017-07-28 20:30:14.880 SatGam2[864:436890] Note button 4 pressed
SatGam2 was compiled with optimization - stepping may behave oddly; variables may not be available.
(lldb) bt
* thread #10, name = 'com.apple.coreaudio.AQClient', stop reason = EXC_BAD_ACCESS (code=1, address=0xe62c)
* frame #0: 0x0007b728 SatGam2`-[Synth pitchShiftLookupPartial1:](self=0x7bb0d400, _cmd="pitchShiftLookupPartial1:", n=0) at Synth.m:762 [opt]
frame #1: 0x0007aeb6 SatGam2`-[Synth fillBuffer:frames:](self=0x7bb0d400, _cmd="fillBuffer:frames:", buffer=<unavailable>, frames=<unavailable>) at Synth.m:724 [opt]
frame #2: 0x0007f1e9 SatGam2`__39-[PlayViewController startAudioSession]_block_invoke((null)=0x7c74d5b0, buffer=<unavailable>, audioFormat=AudioStreamBasicDescription @ 0xb01f9ab8) at PlayViewController.m:393 [opt]
frame #3: 0x0007d985 SatGam2`PlayCallback(inUserData=0x7b656430, inAudioQueue=<unavailable>, inBuffer=<unavailable>) at AudioBufferPlayer.m:30 [opt]
frame #4: 0x00a14e90 AudioToolbox`ClientAudioQueue::CallOutputCallback(AudioQueueBuffer*) + 336
frame #5: 0x00a18a99 AudioToolbox`ClientMessageHandler::OutputBufferComplete(unsigned int) + 137
frame #6: 0x00a0ec90 AudioToolbox`AQClientCallbackMessageReader::DispatchCallbacks(void const*, unsigned long) + 176
frame #7: 0x00a0e98d AudioToolbox`ClientAudioQueue::FetchAndDeliverPendingCallbacks(unsigned int) + 301
frame #8: 0x00a0eb78 AudioToolbox`AQCallbackReceiver_CallbackNotificationsAvailable + 152
frame #9: 0x0095f71a AudioToolbox`_XCallbackNotificationsAvailable + 42
frame #10: 0x00bea37b AudioToolbox`mshMIGPerform + 207
frame #11: 0x035988b3 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 35
frame #12: 0x03598822 CoreFoundation`__CFRunLoopDoSource1 + 498
frame #13: 0x03590ccd CoreFoundation`__CFRunLoopRun + 2669
frame #14: 0x0358ffd4 CoreFoundation`CFRunLoopRunSpecific + 372
frame #15: 0x0358fe4b CoreFoundation`CFRunLoopRunInMode + 123
frame #16: 0x00a19822 AudioToolbox`GenericRunLoopThread::Entry(void*) + 178
frame #17: 0x00bef6b2 AudioToolbox`CAPThread::Entry(CAPThread*) + 96
frame #18: 0x0621f047 libsystem_pthread.dylib`_pthread_body + 184
frame #19: 0x0621ef8f libsystem_pthread.dylib`_pthread_start + 243
frame #20: 0x0621e84a libsystem_pthread.dylib`thread_start + 34
(lldb)