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

时间:2014-04-10 13:09:48

标签: ios core-audio audiounit

我在图表中有一个多声道混音器和一个远程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')
}

在上面的代码中,没有满足任何错误条件(没有函数调用失败),但布尔“已更新”在结束前仍为false。

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

编辑实际上 正在工作,但 仅在第二次 之后 :我必须拨打-playNoise,然后拨打-stopNoise,然后就可以正常播放。我不知道,因为我在第一次尝试时就放弃了......

BTW,updated标志仍为0。 我绝望地添加了许多音频单元调用,但也许有些是不必要的。我会看到哪些可以修剪,然后继续寻找它需要两个工作的原因......

编辑2 :在四处寻找,添加/删除呼叫并修复错误之后,我从第一次到达噪声渲染回调的位置,但在播放噪声至少一次之后,如果我尝试重用那个播放PCM(caf文件)的总线形式,它仍然使用噪声渲染回调(尽管已断开连接)。我将在评论中使用@ hotpaw2建议的解决方案并使用'stub'回调和更多函数指针......

0 个答案:

没有答案