Ios 音频单元渲染回调-动态更改它?
我有一个多通道混音器和一个图形中的远程I/O,设置为播放未压缩的caf文件。到目前为止还不错 接下来,我将尝试在渲染回调上做一些奇怪的事情(比如,生成白噪声,或者播放正弦波,等等——程序生成的声音) 我希望能够在运行时切换附加到每个总线的渲染回调,而不是将条件添加到现有的渲染回调(在设置时分配给混合器的所有总线) 到目前为止,我正在尝试这段代码,但它不起作用:我的可选渲染回调没有被调用Ios 音频单元渲染回调-动态更改它?,ios,core-audio,audiounit,Ios,Core Audio,Audiounit,我有一个多通道混音器和一个图形中的远程I/O,设置为播放未压缩的caf文件。到目前为止还不错 接下来,我将尝试在渲染回调上做一些奇怪的事情(比如,生成白噪声,或者播放正弦波,等等——程序生成的声音) 我希望能够在运行时切换附加到每个总线的渲染回调,而不是将条件添加到现有的渲染回调(在设置时分配给混合器的所有总线) 到目前为止,我正在尝试这段代码,但它不起作用:我的可选渲染回调没有被调用 - (void) playNoise { if (_noiseBus != -1) {
- (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在注释中建议的解决方案,并使用“存根”回调和进一步的函数指针 另一种可行的方法是使用一个固定的渲染回调,该回调通过函数指针重定向到可配置的渲染回调。成本只是一个额外的堆栈帧,它不会被任何音频单元错误或操作系统更改破坏。谢谢,我会这么做的。我将设置一个函数指针的全局数组(每个总线一个),并在(否则为空的)呈现回调中选择适当的一个/调用它。