首页 > 解决方案 > AudioUnitRender Error -50 含义

问题描述

我在 AudioUnitRender 调用中收到错误 -50。我的音频单元只是一个从麦克风获取样本的 RemoteIO 单元。错误-50是什么意思?

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

if noErr != status {
    print("Error \(status)");
    fatalError("Render status \(status)")
  // return status;
}

标签: iosavfoundationavaudiosessionaudiounitremoteio

解决方案


-50 ( kAudio_ParamError) 表示您传递的参数之一是错误的。

一个常见的错误AudioUnitRender是传递AudioBufferList错误数量的an mNumberBuffers(您可能正在录制非交错立体声),或者AudioBuffers 本身的大小可能错误或通道数量错误。

每当我忘记模拟器和设备远程音频单元具有不同的默认流格式并且没有通过显式设置它们时,我都会遇到这个问题

AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &streamFormatIActuallyWant, UInt32(MemoryLayout<AudioStreamBasicDescription>.size))

认为模拟器默认为交错整数,设备默认为非交错浮点,尽管这可能只是我的配置。

从头AudioUnitRender文件:

调用者必须提供与给定总线的当前音频格式的预期拓扑相匹配的有效 ioData AudioBufferList。缓冲区列表可以有两种变体:
(1) 如果 mData 指针不为空,则音频单元会将其输出渲染到这些缓冲区中。这些缓冲区应与 16 字节边界对齐(通常是 malloc 将返回的内容)。
(2) 如果 mData 指针为空,则音频单元可以提供指向它自己的缓冲区的指针。在这种情况下,音频单元需要在调用线程的 I/O 周期内保持这些缓冲区有效

通过传递 null mData(第 (2) 点)可以为您节省不必要的副本,但您仍然需要知道“拓扑”的格式,它只是mNumberBuffers (可能是 1 或 2)。


推荐阅读