2010-06-25 300 views
5

我一直在玩蘋果的aurioTouch演示,這是他們的音頻單元教程的示例代碼。此應用程序允許從麥克風同時輸入/輸出。給演講者。它還呈現麥克風輸入聲音的立體畫面。iOS:Audio Unit RemoteIO AudioBuffer操作(即來自麥克風的聲音效果)

在這個低級別過程的真正高級別中,示例代碼定義了一個AudioComponent(在本例中爲允許同時輸入/輸出的RemoteIO),並且此音頻單元有一個回調回調。在回調中,他們根據麥克風的AudioBuffer聲音數據進行一些音頻過濾(DC拒絕濾波器)和立體顯示的可視化。

我的最終目標是根據麥克風的輸入創建自己的定製聲音失真音頻單元。我認爲基於音頻單元教程的正確方法是製作第二個音頻單元,並將它們連接到音頻處理圖表。但是,我讀過iOS不允許您註冊自己的自定義音頻單元。我的問題是:

  1. 我可以做的AudioBufferList直接操縱,我從remoteIO音頻單元呈現回調訪問(因爲他們似乎已經在做這一點,並在其上應用的音頻過濾器)和在那裏創建自己的自定義聲音失真?
  2. 我試過將AudioBufferList數據分配給一個常量(我從一個樣本運行和AudioBufferList記錄中看到它存在一個值),但它似乎什麼都不做。

回答

4

您的第一個問題的答案是肯定的。這通常是如何完成的。

我相信你需要直接操縱指針中的數據,而不是重新分配。你可能想看看openframeworks中處理分配緩衝區並將它們傳遞給回調函數的代碼:https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxiPhone/src/sound/ofxiPhoneSoundStream.mm

還有其他的代碼可以查看,nick collins有一個基本的應用程序可以讓聲音關閉麥克風和揚聲器,惠斯特處理之間:http://www.cogs.susx.ac.uk/users/nc81/code.html。他還有一些代碼,可以從iPod軌道中獲取可能對您有用的樣本緩衝區。

+1

任何尋找github鏈接的人,現在該代碼已移至: https://github.com/openframeworks/openFrameworks/blob/master/addons/ofxiPhone/src/sound/ofxiPhoneSoundStream.mm – 2013-02-14 07:16:24

1

的確,您無法將自己的自定義AudioUnits添加到iPhone。

它的工作方式是這樣的:揚聲器通過系統驅動數據的拉鍊。您已經完成了向ioUnit添加呈現回調。

回調運行每當揚聲器(總線#0)是餓了,這是你的工作,以填補因爲許多樣品中,因爲它已經要求,在揚聲器提供了緩衝。所提供緩衝區的大小爲2的冪,儘可能接近您在配置AudioSession時指定的首選IO緩衝區持續時間。

做到這一點的最簡單的方法就是把你給予的AudioBufferList並把它傳遞給AudioUnitRender的麥克風(總線#1)。您在渲染()緩衝區填滿後,但回調返回之前,你可以操縱數據你喜歡的任何方式。例如,AurioTouch將其調零以使其靜音。

要記住的重要一點是,揚聲器會從它通過你的實際數據緩衝區中讀取。它不會查看AudioBufferList描述符並檢查是否指向另一個databuffer。如果您開始更改您提供的AudioBufferList,則會遇到問題。充其量,你會被忽略。最糟糕的是,你會遇到內存管理問題。

如果您不想被限制爲只能在ioData緩衝區中工作,那麼您可以使用您自己的AudioBufferList,以任意大小的任意方式進行分配,然後讓麥克風將Render()放入該中。然後,只要最終將結果複製到回調提供的緩衝區(即ioData-> mBuffers [0] .mData,就像調用回調時那樣),您就可以完成所有您喜歡的操作。

相關問題