我正在尝试编写我的第一个Swift应用程序,并且它在模拟器中运行得很好!该应用程序通过AVFoundation生成音调,当我开始在iPhone上播放音调时,它运行良好,但是当我尝试停止AVAudioPlayerNode时,我的iPhone应用程序就会冻结10次中的5次。一切都在模拟器中完美运行。
这是停止代码:
@IBAction func togglePlay(_ sender: UIButton) {
if tone.isPlaying {
engine.mainMixerNode.volume = 0.0
tone.stop() // This is where is freezes up and tone is a AVAudioPlayerNode
engine.reset() // engine is a AVAudioEngine
sender.setImage(UIImage(named:"icons8-play-100")!, for: UIControl.State())
} else {
tone.preparePlaying()
tone.play()
engine.mainMixerNode.volume = 1.0
sender.setImage(UIImage(named:"icons8-stop-filled-100")!, for: UIControl.State())
}
如果我在冻结代码时暂停代码并查看堆栈跟踪,那么看起来它正在等待某种互斥量被释放。但是我经验不足,不知道如何进一步调查我做错了什么
这是堆栈跟踪:
VFAudio`-[AVAudioPlayerNode stop]:
0x187b68c34 <+0>: stp x22, x21, [sp, #-0x30]!
0x187b68c38 <+4>: stp x20, x19, [sp, #0x10]
0x187b68c3c <+8>: stp x29, x30, [sp, #0x20]
0x187b68c40 <+12>: add x29, sp, #0x20 ; =0x20
0x187b68c44 <+16>: mov x21, x0
0x187b68c48 <+20>: adrp x8, 177438
0x187b68c4c <+24>: add x8, x8, #0x700 ; =0x700
0x187b68c50 <+28>: ldr x19, [x8]
0x187b68c54 <+32>: cbz x19, 0x187b68c70 ; <+60>
0x187b68c58 <+36>: ldr x8, [x19]
0x187b68c5c <+40>: ldr x8, [x8, #0x10]
0x187b68c60 <+44>: mov x0, x19
0x187b68c64 <+48>: blr x8
0x187b68c68 <+52>: mov x20, x0
0x187b68c6c <+56>: b 0x187b68c74 ; <+64>
0x187b68c70 <+60>: mov w20, #0x0
0x187b68c74 <+64>: adrp x8, 177435
0x187b68c78 <+68>: add x8, x8, #0x9dc ; =0x9dc
0x187b68c7c <+72>: ldrsw x8, [x8]
0x187b68c80 <+76>: ldr x21, [x21, x8]
0x187b68c84 <+80>: ldr x8, [x21]
0x187b68c88 <+84>: ldr x8, [x8, #0x198]
0x187b68c8c <+88>: mov x0, x21
0x187b68c90 <+92>: blr x8
0x187b68c94 <+96>: ldr x0, [x21, #0x8] <— This is where it breaks
libsystem_kernel.dylib`__psynch_mutexwait:
0x181c15134 <+0>: mov x16, #0x12d
0x181c15138 <+4>: svc #0x80
-> 0x181c1513c <+8>: b.lo 0x181c15154 ; <+32>
调试的下一步是什么?
答案 0 :(得分:0)
请注意音频引擎设置中的线程。 从注入的均衡器单元保存音频帧时出现相同的问题:
equalizer.installTap(onBus: 0, ... ) { buffer, _ in
...
status = ExtAudioFileWrite(file, numberOfFrames, audioBufferList)
...
}
通过将ExtAudioFileWrite调用转发到主线程来修复互斥锁