无法将转换器音频单元连接至混响效果
我正试图重塑一个看起来像这样的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将其输出匹配到mixer:整数) reverb
附加到converter2
(converter1将其输入与混响:浮点相匹配) bandpass
附加到reverb
(都使用浮点) converter1
连接到bandpass
(converter1 应匹配其输出到带通:浮点) (使用AudioUnitSetProperty
手动将converter1的输入设置为整数,
...最后,将渲染回调连接到转换器#1的输入。
我检查所有核心音频功能的返回值(错误代码)。 另外,连接每个节点后,我在图上调用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
; 它是图表更新后抛出的错误。
所以,堆栈溢出的黄金法则再次击中:
发布一个问题,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,对不对?)
链接地址: http://www.djcxy.com/p/62313.html