我在图表中有一个多声道混音器和一个远程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'回调和更多函数指针......