gpt4 book ai didi

swift - AVAudioPlayerNode.Stop 上的 AVFoundation Mutex 互锁

转载 作者:行者123 更新时间:2023-11-28 07:45:58 27 4
gpt4 key购买 nike

我正在尝试编写我的第一个 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>

调试的下一步是什么?

最佳答案

注意音频引擎设置中的线程。从注入(inject)的均衡器单元保存音频帧时遇到同样的问题:

    equalizer.installTap(onBus: 0, ... ) { buffer, _ in
...
status = ExtAudioFileWrite(file, numberOfFrames, audioBufferList)
...
}

通过将 ExtAudioFileWrite 调用转发到主线程来修复互锁互锁

关于swift - AVAudioPlayerNode.Stop 上的 AVFoundation Mutex 互锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51034151/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com