将回调附加到远程IO的输出元素

时间:2012-11-28 15:39:20

标签: core-audio

我想从iOS设备的麦克风中捕获音频并将其写入.caf文件。

我可以将远程IO音频设备连接到多声道混音器单元(MCMU),并将回调连接到MCMU的输入。在回调中,我可以使用ExtAudioFileAsyncWrite()将音频数据从麦克风成功写入文件。

我想简化一些事情并从图片中删除MCMU。我的想法是我可以简单地将回调附加到远程IO的输入范围的输出总线和回调调用ExtAudioFileAsyncWrite()内部。

但是当我尝试这个时,ExtAudioFileAsyncWrite()返回-50(paramError)。

是否无法将回调附加到远程IO的输入元件的输出总线?

1 个答案:

答案 0 :(得分:3)

有可能。您需要使用AudioUnitSetProperty来设置kAudioOutputUnitProperty_SetInputCallback属性。此回调的功能与渲染回调非常相似,但只要RemoteIO / mic为您提供了一些新数据(而不是请求程序中的数据),就会调用它。

示例:

AURenderCallbackStruct callbackInfo = {YourInputCallback, NULL};
AudioUnitSetProperty(remoteIO,
                     kAudioOutputUnitProperty_SetInputCallback,
                     kAudioUnitScope_Global,
                     0,
                     &callbackInfo,
                     sizeof(callbackInfo));

只要有一批新样本,这将使RemoteIO / mic呼叫YourInputCallback。您可以像以前一样使用此回调来呼叫ExtAudioFileWriteAsync。请注意,您还必须在RemoteIO上调用AudioUnitRender,以便从中获取新样本。

关于-50错误,这不是一个非常有用的错误诊断。它基本上只是说“你的一个参数出错了”。很可能您的ExtAudioFile为NULL或未正确设置(在这种情况下,您之前使用的ExtAudioFile*函数之一会返回一个更有用的错误代码,您可以使用它来诊断它)。