2014-04-16 41 views
1

我想重塑一個AUGraph看起來像這樣:不能轉換音頻單元連接到混響效果

multichannel mixer -> remote I/O 

弄成這個樣子:

callback -> converter1 -> bandpass -> reverb -> converter2 -> mixer(bus 0) -> remote I/O 

圖表後已初始化並開始(即「即時」)。爲了使流格式傳播和音頻單位前來洽談每個連接的格式,我追加新創建的音頻單元順序如下:

  1. 清除所有現有連接(AUGraphClearConnections())。
  2. 重建默認連接mixer - >remote I/O
  3. 附加converter2mixer,總線#0 (converter2其輸出到混頻器相匹配:整數)
  4. 附加reverbconverter2(converter1其輸入相匹配至混響:浮動)
  5. 附加bandpassreverb(均使用浮動)
  6. 附加converter1bandpass(converter1 應該匹配其輸出到帶通:浮動)

(converter1的輸入預先設定爲整數,手動,使用AudioUnitSetProperty

...和最後,將渲染回調連接到轉換器#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;它是圖表更新後拋出的錯誤。

回答

1

因此,黃金規則的堆棧溢出再次點擊:

發帖提問,並在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) 

所以總結起來,由於某種原因,我不得不直接設置兩個流格式:我之前輸入(int)和輸出(浮點)可以連接這個轉換器。現有的多聲道混音器和新的混響濾波器之間的設置自動設置自動...(仍然有點困惑,但是再次...核心音頻,對不對?)

+0

如果有人發佈答案解釋* *進一步**發生了什麼,例如你需要做什麼以及在這種情況下你不需要做什麼,我會接受它。我仍然發現這個東西... –

+0

更新:沒有人出現,所以我接受了我自己的答案。 –

+0

保存我的一天!奇怪的是必須得到'reverbUnit'格式,而不是僅僅使用規範的格式。如果有人有一個想法爲什麼,我會感興趣。 – MonsieurDart