AudioUnitRender 错误 -50 带有奇数长度的缓冲区

Posted

技术标签:

【中文标题】AudioUnitRender 错误 -50 带有奇数长度的缓冲区【英文标题】:AudioUnitRender error -50 with odd length buffers 【发布时间】:2018-08-28 15:32:10 【问题描述】:

我有一个配置了 AVAudiosessionCategoryPlayAndRecord 的 RemoteIO 单元。我在其中发现了一些奇怪的行为。我打开应用程序,并在 audioUnit 完全初始化之前立即关闭它(它实际上在后台初始化,因为我太早退出应用程序)。接下来,我将应用程序带到前台并立即重新启动,我看到 AudioUnitRender 连续失败并出现错误 -50。我发现 inNumberFrames 是 1115,只要这个数字是奇数,它就会失败。

  func recordingCallback(inRefCon:UnsafeMutableRawPointer,
                ioActionFlags:UnsafeMutablePointer<AudioUnitRenderActionFlags>,
                inTimeStamp:UnsafePointer<AudioTimeStamp>,
                inBusNumber:UInt32,
                inNumberFrames:UInt32,
                ioData:UnsafeMutablePointer<AudioBufferList>?) -> OSStatus
  
       let controller = unsafeBitCast(inRefCon, to: MicrophoneOutput.self) 

      let listPtr = controller.audioBufferList.unsafeMutablePointer

     let buffers = UnsafeBufferPointer<AudioBuffer>(start: &listPtr.pointee.mBuffers, count: Int(listPtr.pointee.mNumberBuffers))

   for var buf in buffers 
       buf.mDataByteSize = inNumberFrames * UInt32(sampleWordSize)
    

   let status = AudioUnitRender(controller.audioUnit!, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, listPtr)

if noErr != status 
   print("Error \(status)");
   NSLog("\(AVAudioSession.sharedInstance().currentRoute.inputs[0])")
   fatalError("Render status \(status)")
  // return status;


return noErr

奇怪的是,如果我在 AudioUnitRender 调用中将 inNumberFrames 硬编码为 1114,它就会成功!有谁知道发生了什么?模式是应用程序从后台恢复时,有一个路由更改通知,然后回调中的第一个样本长度为 1114 帧,但它旁边的样本有 1115 帧失败。

【问题讨论】:

【参考方案1】:

原来这是由于对 Swift 语言的误解导致的编程错误。罪魁祸首是这样的:

for var buf in buffers 
   buf.mDataByteSize = inNumberFrames * UInt32(sampleWordSize)

这个答案提供了更多细节 - Swift vs Objective C pointer manipulation issue

【讨论】:

以上是关于AudioUnitRender 错误 -50 带有奇数长度的缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

AudioUnit inputCallback 与 AudioUnitRender -> audioBufferList.mBuffers[0].mDataByteSize 之间不匹配!= in

AudioUnit 帧的最大值?

音频输出单元的输入回调中允许哪些操作

直接调用音频单元而不是回调 iOS

音频回调线程中的内存泄漏(iOS)

使用带有类错误的地图,编译错误