无法将渲染回调添加到输出单元

时间:2014-05-28 17:40:43

标签: ios audio audiounit

我正在编写一个应该从磁盘中混合多个声音并将生成的文件保存到磁盘的应用程序。我正在尝试使用音频单元。 我使用Apple's MixerHost作为我的应用的基础。它具有连接到远程I / O的多通道混音器。当我尝试向远程IO添加渲染回调时,我得到错误-10861“无法在两个节点之间尝试连接。”当调用AUGraphConnectNodeInput(...)时。 我做错了什么?将文件混合并记录到磁盘的正确方法是什么?

回调存根:

static OSStatus saveToDiskRenderCallback(void *inRefCon,
                                     AudioUnitRenderActionFlags *ioActionFlags,
                                     const AudioTimeStamp *inTimeStamp,
                                     UInt32 inBusNumber,
                                     UInt32 inNumberFrames,
                                     AudioBufferList *ioData) 
{
    return noErr;
}

向远程I / O单元添加回调:

    AURenderCallbackStruct saveToDiskCallbackStruct;
saveToDiskCallbackStruct.inputProc = &saveToDiskRenderCallback;


result = AUGraphSetNodeInputCallback (
                                      processingGraph,
                                      iONode,
                                      0,
                                      &saveToDiskCallbackStruct
                                      );    

错误:

    result = AUGraphConnectNodeInput (
             processingGraph,
             mixerNode,         // source node
             0,                 // source node output bus number
             iONode,            // destination node
             0                  // desintation node input bus number
         );

1 个答案:

答案 0 :(得分:4)

您对音频单元的工作原理感到困惑。

节点输入回调(由AUGraphSetNodeInputCallback设置)和节点输入连接(由AUGraphConnectNodeInput设置)都位于远程IO的同一输入侧单元。看起来您认为输入回调将是图表的输出。这是错的。

AUGraph提供两条路径来提供AudioUnit的输入:

  • 来自其他上游节点(AUGraphConnectNodeInput
  • 或来自自定义回调(AUGraphSetNodeInputCallback),

所以你不能同时设置它们,它没有任何意义。

现在有两种可能性

1)实时监控

这不是你所描述的,但这更容易从你所在的位置获得。因此,我假设您希望在处理(实时)时听远程I / O上的混音。 然后Read this

2)离线渲染

如果你不打算实时收听(这是我从你的描述中首先理解的),那么远程IO在这里无关,因为它的目的是与物理输出进行通信。然后是read that。它用通用输出单元替换远程I / O单元。请注意,图表不能以相同的方式运行。