swift - AVAudioPlayerNode.Stop 上的 AVFoundation Mutex 互锁

标签 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>

调试的下一步是什么?

最佳答案

注意音频引擎设置中的线程。 从注入(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/

相关文章:

iphone - 如何在url中使用变量

iphone - AVAssetExportSession 错误 -11820

ios - AVCaptureDevice videoZoomFactor 始终超出范围

ios - 将日期转换为格式为 "yyyy-MM-dd' T'HH :mm:ssZ"的字符串

swift - 有没有办法在 Core Data 中使用带有参数的计算属性?

xcode - 如何在 Xcode 中定位代码中的错误而不是内存地址

ios - AVAssetWriter 可以透明写入文件吗?

objective-c - 我在 Swift 中调用此 Objective-C block /API 调用时做错了什么?

swift - 基本授权 - SSL 握手失败

c++ - CMake error no CMAKE_C_COMPILER can be found using Xcode and GLFW