Ios 音频单元渲染回调-动态更改它?

Ios 音频单元渲染回调-动态更改它?,ios,core-audio,audiounit,Ios,Core Audio,Audiounit,我有一个多通道混音器和一个图形中的远程I/O,设置为播放未压缩的caf文件。到目前为止还不错 接下来,我将尝试在渲染回调上做一些奇怪的事情(比如,生成白噪声,或者播放正弦波,等等——程序生成的声音) 我希望能够在运行时切换附加到每个总线的渲染回调,而不是将条件添加到现有的渲染回调(在设置时分配给混合器的所有总线) 到目前为止,我正在尝试这段代码,但它不起作用:我的可选渲染回调没有被调用 - (void) playNoise { if (_noiseBus != -1) {

我有一个多通道混音器和一个图形中的远程I/O,设置为播放未压缩的caf文件。到目前为止还不错

接下来,我将尝试在渲染回调上做一些奇怪的事情(比如,生成白噪声,或者播放正弦波,等等——程序生成的声音)

我希望能够在运行时切换附加到每个总线的渲染回调,而不是将条件添加到现有的渲染回调(在设置时分配给混合器的所有总线)

到目前为止,我正在尝试这段代码,但它不起作用:我的可选渲染回调没有被调用

- (void) playNoise
{
    if (_noiseBus != -1) {
        // Already playing
        return;
    }

    _noiseBus = [self firstFreeMixerBus];

    AUGraphDisconnectNodeInput(processingGraph,
                               mixerNode,
                               _noiseBus);

    inputCallbackStructArray[_noiseBus].inputProc       = &noiseRenderCallback;
    inputCallbackStructArray[_noiseBus].inputProcRefCon = NULL;

    OSStatus result = AUGraphSetNodeInputCallback(processingGraph,
                                                  mixerNode,
                                                  _noiseBus,
                                                  &inputCallbackStructArray[_noiseBus]);

    if (result != noErr) {
        return NSLog@"AUGraphSetNodeInputCallback");
    }


    result = AudioUnitSetParameter(_mixerUnit,
                                   kMultiChannelMixerParam_Enable,
                                   kAudioUnitScope_Input,
                                   _noiseBus,
                                   1,
                                   0);

    if (result != noErr) {
        return NSLog(@"Failed to enable bus");
    }


    result = AudioUnitSetParameter (_mixerUnit,
                                    kMultiChannelMixerParam_Volume,
                                    kAudioUnitScope_Input,
                                    _noiseBus,
                                    0.5,
                                    0);

    if (result != noErr) {
        return NSLog(@"AudioUnitSetParameter (set mixer unit input volume) Failed");
    }

    unsigned char updated;
    AUGraphUpdate(processingGraph, &(updated));
    // updated ends un being zero ('\0')
}
在上面的代码中,没有一个错误条件得到满足(没有函数调用失败),但是布尔值“updated”在结束之前保持为false

我是否缺少一个步骤,或者在安装后无法切换渲染回调?我是否需要为这些备用回调预留专用总线?我希望能够从客户端代码(调用我的声音引擎的那一方)设置自定义回调

编辑实际上它正在工作,但是只有在第二次之后才工作:我必须调用
-playNoise
,然后
-stopNoise
,从那时起它将正常播放。我说不出来,因为我第一次尝试就放弃了

顺便说一句,
updated
标志仍然是0。 出于绝望,我添加了很多音频单元调用,但可能有些是不必要的。我会看看哪些可以修剪,然后继续寻找它需要两次呼叫才能工作的原因


编辑2:在拨弄、添加/删除调用和修复错误之后,我从第一次开始就知道噪波渲染回调可以工作,但在播放噪波至少一次之后,如果我尝试重用总线窗体播放PCM(caf文件),它仍然使用噪波渲染回调(尽管已断开连接)。我将使用@hotpaw2在注释中建议的解决方案,并使用“存根”回调和进一步的函数指针

另一种可行的方法是使用一个固定的渲染回调,该回调通过函数指针重定向到可配置的渲染回调。成本只是一个额外的堆栈帧,它不会被任何音频单元错误或操作系统更改破坏。谢谢,我会这么做的。我将设置一个函数指针的全局数组(每个总线一个),并在(否则为空的)呈现回调中选择适当的一个/调用它。