AudioUnitRender Error -50 含义

AudioUnitRender Error -50 meaning

我在 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;
}

-50 (kAudio_ParamError)表示你传递的其中一个参数是错误的。

AudioUnitRender 的一个常见错误是传递带有错误数量 mNumberBuffersAudioBufferList(您可能正在录制非交错立体声)或 AudioBuffer s 本身可能尺寸错误或通道数量错误。

每当我忘记模拟器和设备远程音频单元具有不同的默认流格式并且没有通过

明确设置它们时,我就会遇到这个问题
AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &streamFormatIActuallyWant, UInt32(MemoryLayout<AudioStreamBasicDescription>.size))

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

来自 AudioUnitRender 头文件:

The caller must provide a valid ioData AudioBufferList that matches the expected topology for the current audio format for the given bus. The buffer list can be of two variants:
(1) If the mData pointers are non-null then the audio unit will render its output into those buffers. These buffers should be aligned to 16 byte boundaries (which is normally what malloc will return).
(2) If the mData pointers are null, then the audio unit can provide pointers to its own buffers. In this case the audio unit is required to keep those buffers valid for the duration of the calling thread's I/O cycle

通过传递null mData(第(2)点)可以节省你不必要的副本,但你仍然需要知道格式"topology",它只是mNumberBuffers(可能1 或 2).

确保你传递的 AudioBufferList 足够 mDataByteSize,它应该大于 inNumberFrames * 通道。