我正在尝试重塑一个看起来像这样的AUGraph
:
multichannel mixer -> remote I/O
这样的事情:
callback -> converter1 -> bandpass -> reverb -> converter2 -> mixer(bus 0) -> remote I/O
图形初始化并启动后(即“即时”)。为了允许传播流格式并使音频单元协商每个连接的格式,我按此顺序附加新创建的音频单元:
AUGraphClearConnections()
)。mixer
- > remote I/O
) converter2
附加到mixer
,总线#0 (converter2将其输出与调音台匹配:整数) reverb
附加到converter2
(converter1将其输入与reverb:float匹配) bandpass
附加到reverb
(均使用浮动) converter1
附加到bandpass
(converter1 应匹配其输出到bandpass:float) (转换器1的输入先前已设置为整数,手动,使用AudioUnitSetProperty
)
...最后,将渲染回调连接到转换器#1的输入。
我检查所有Core Audio功能的返回值(错误代码)。此外,在连接每个节点后,我会在图表上调用AUGraphUpdate()
和CAShow()
。
最后一步(“5.将转换器#1连接到带通效果”)失败,代码为-10868(kAudioUnitErr_FormatNotSupported
)。
这是在CAShow()
的违规通话之前的AUGraphUpdate()
输出:
AudioUnitGraph 0x305A000:
Member Nodes:
node 1: 'aumx' 'mcmx' 'appl', instance 0x17822d0e0 O I
node 2: 'auou' 'rioc' 'appl', instance 0x17822cd80 O I
node 3: 'aufc' 'conv' 'appl', instance 0x170833e40 O
node 4: 'aufx' 'bpas' 'appl', instance 0x170827b60 O I
node 5: 'aufx' 'rvb2' 'appl', instance 0x170835100 O I
node 6: 'aufc' 'conv' 'appl', instance 0x170a21460 O I
Connections:
node 1 bus 0 => node 2 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000C2C) 8.24-bit little-endian signed integer, deinterleaved]
node 6 bus 0 => node 1 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000C2C) 8.24-bit little-endian signed integer, deinterleaved]
node 5 bus 0 => node 6 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 4 bus 0 => node 5 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
CurrentState:
mLastUpdateError=0, eventsToProcess=F, isInitialized=T, isRunning=T (1)
那么,发生了什么?
注意对AUGraphConnectNodeInput()
的最后一次调用本身会返回noErr
;之后图形更新会引发错误。
答案 0 :(得分:1)
因此,Stack Overflow的黄金法则再次出现:
除了笑话,我就是这样解决的:发一个问题,你会在5分钟内找到答案 拥有。但只有你发布它!
在连接外部转换器#1(在源渲染回调和第一个过滤器之间)之前,我抓住了过滤器的本机流格式,并手动将其设置为转换器流格式(输出范围),如下所示:
AudioStreamBasicDescription filterStreamDesc = { 0 };
UInt32 size = sizeof(filterStreamDesc);
// GET
result = AudioUnitGetProperty(reverbUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input, // output or global should work, too?
0,
&(filterStreamDesc),
&size);
[self checkAudioResult:result]; // (custom method that compares against noErr)
// SET
result = AudioUnitSetProperty(converterUnit0,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
0,
&(filterStreamDesc),
size);
//(input stream format already set above)
[self checkAudioResult:result]; // (custom method that compares against noErr)
总而言之,出于某种原因,我必须直接设置两种流格式:input(int)和output(float)才能连接此转换器。现有的多声道混音器和新的混响滤波器之间的某个设备会以某种方式自动设置...(仍然有点困惑,但是又一次...... Core Audio,对吗?)