我在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;
}
答案 0 :(得分:2)
-50(kAudio_ParamError
)表示您传递的参数之一是错误的。
AudioUnitRender
的常见错误是传递错误编号的AudioBufferList
(您可能正在录制非交错立体声)的mNumberBuffers
或AudioBuffer
本身可能是尺寸错误或频道数量错误。
每当我忘记模拟器和设备远程音频单元具有不同的默认流格式并且没有通过
显式设置它们时,都会遇到此问题。AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &streamFormatIActuallyWant, UInt32(MemoryLayout<AudioStreamBasicDescription>.size))
我认为模拟器默认为交错整数,设备默认为非交错浮点数,尽管也许这只是我的配置。
来自AudioUnitRender
头文件:
调用方必须提供与ioData相匹配的有效ioData AudioBufferList 给定总线的当前音频格式的预期拓扑。缓冲区 列表可以有两个变体:
(1)如果mData指针非空,则音频单元将呈现其 输出到这些缓冲区。这些缓冲区应对齐到16个字节 边界(通常是malloc返回的内容)。
(2)如果mData指针为空,则音频单元可以提供指针 到自己的缓冲区。在这种情况下,音频单元需要保留那些 在调用线程的I / O周期内有效的缓冲区
通过传递空mData
(点(2))可以为您节省不必要的副本,但是您仍然需要知道格式“拓扑”,即mNumberBuffers
(可能为1或2)。
答案 1 :(得分:0)
确保您传递的 AudioBufferList 具有足够的 mDataByteSize
,它应该大于 inNumberFrames * 通道。