AVAudioPlayerNode.Stop上的AVFoundation Mutex互锁

时间:2018-06-26 02:40:33

标签: swift xcode avfoundation mutex

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

调试的下一步是什么?

1 个答案:

答案 0 :(得分:0)

请注意音频引擎设置中的线程。 从注入的均衡器单元保存音频帧时出现相同的问题:

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

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