2016-01-01 19 views
2

我正在爲我的iphone創建一個玩具合成器項目,我可以在這裏拖動我的手指以及基於x座標的x &的頻率和音量變化。它的作品非常漂亮,聽起來很棒,甚至根據聲音的音調和音調改變顏色。雅虎。但是我現在試圖爲這個聲音添加效果,並且我已經達到了某種混亂。添加一個效果音頻單元到我目前的設置

目前,我沒有使用AUGraph。我更簡單地調用remoteIO單元併爲其分配一個呈現回調函數,在該函數中,我將其連續的樣本值流形成一個正弦波。而且我聽到了一個清晰的440.00hz正弦波發揮出我的iphone6 +,這是非常好的。

但是,如果我想在此添加混響作爲第二個組件,我不知道該怎麼做,因爲輸出單元不是音頻硬件之前的「最後」單元?如何設置另一個名爲reverbUnit的音頻單元並將其連接到我當前的remoteiO?它甚至沒有意義。這裏需要3個單位。第一個產生正弦波,第二個產生混響濾波器,第三個產生硬件。

我錯過了什麼?我可以通過自己使用遙控器來處理混響嗎?

回答

2

是的,最好的方法是使用圖形。

RemoteIO輸入實際上是一種拉式架構(不是推式)。渲染回調是您提供輸入樣本的位置(sin wav數據)。它會每X毫秒回調一次,並要求您將樣本複製到。所以它會提取你的數據。您不會構建緩衝區,並根據您的條款「推」到音頻系統中。相反,你需要複製它,因爲它需要更多的數據(拉)。

所以,如果你想添加更多的音頻單元,你需要將它們連接到一個圖形。 remoteIO單元將是鏈中的最後一個單元。混響單元將被添加在遠程IO之前。因此,它應該是這樣的:

[混響] - [RemoteIO(輸出要素)]

你的混響輸出變爲遠程IO輸入。當遠程IO需要採樣時,它從混響單元中拉出。圖表連接負責將拉動傳遞給混響單元的遠程IO。這會自動觸發您的混響單元的回調。所以你現在需要在混響輸入回調中寫你的樣品。

這裏發生了什麼:

  1. 硬件說給我一些樣品。
  2. 它調用你的遠程IO渲染 回調。
  3. 你的遠程IO調用你的混響輸入回調 (通過圖形連接)
  4. 你混響輸入 回調提供樣品。

該圖表使它很好,因爲您可以將某些東西「連接」在一起,並在信號鏈中添加/刪除東西。它只是不斷拉動整個鏈條,並最終爲鏈中的第一個單位提供數據。

如果你以前從未做過圖表,一定要絕對檢查每個單步的返回代碼。

所有這些功能有錯誤代碼返回OSStatus

AUGraphOpen, AUGraphNodeInfo, AUGraphConnectNodeInput, AUGraphInitialize, AudioUnitSetProperty, AUGraphStart, etc. 

後您初始化圖形,則可以使用CAShow(_audioGraph)顯示到控制檯,並得到這樣的一些輸出:

Member Nodes: 
node 1: 'auou' 'rioc' 'appl', instance 0x7a141060 O I 
node 2: 'aumx' 'mcmx' 'appl', instance 0x7a021810 O I 
node 3: 'aufx' 'rvb2' 'appl', instance 0x7a0a84a0 O I 
node 4: 'aufc' 'splt' 'appl', instance 0x7a025b90 O I 
node 5: 'aufc' 'conv' 'appl', instance 0x7a24b9e0 O I 
node 6: 'augn' 'afpl' 'appl', instance 0x7a22a220 O 
Connections: 
node 2 bus 0 => node 3 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved] 
node 3 bus 0 => node 1 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved] 
node 4 bus 0 => node 2 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved] 
node 5 bus 0 => node 4 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved] 
Input Callbacks: 
{0x6ccf0, 0x7a13da00} => node 5 bus 0 [2 ch, 44100 Hz] 
CurrentState: 
mLastUpdateError=0, eventsToProcess=F, isInitialized=T, isRunning=F 
+1

謝謝。實際上,在查看我的圖形構造函數一小時後,我意識到我不需要第三個單元向混響單元提供數據流,而是需要兩個單元和一個迴響函數。所以我想這張圖不僅會初始化音頻單元,而且當您建立連接時,它會在幕後創建並分配回調過程? –

+0

實際上,「節點」是連接的。我的措辭可能會更好一些。 AUGraphConnectNodeInput是將兩個節點連接在一起的東西。 是的 - 一旦您正確連接所有節點,AUGraphInitialize將初始化單位。 – jaybers

+0

這不就是語義嗎?節點已連接,音頻單元已連接。最終結果是一個單位從之前的數據中提取數據等等。 –