无法将转换器音频单元连接至混响效果

我正试图重塑一个看起来像这样的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

    上一篇: Can't connect converter Audio Unit to Reverb Effect

    下一篇: Reverb2 and kAudioUnitType