2011-02-01 102 views
4

我的問題涉及AudioUnits。爲了設計用於iPhone一個voicechanging應用程序(與目標C XCODE)我使用RemoteIO audioUnit樣品從這個網站:調整AudioUnit緩衝區的長度

http://atastypixel.com/blog/using-remoteio-audio-unit/

的audioUnit緩衝區被設置爲256個樣本的長度。對於我的項目,我需要更多(約22050)。 所引用的網頁說,audioUnit緩衝區的長度可以這樣調整:

float aBufferLength = 0.005; // In seconds 
AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, 
         sizeof(aBufferLength), &aBufferLength); 

現在我的具體問題:上面的代碼是不適合提及audioUnit,因爲沒有使用AudioSession,從來沒有初始化,因此產生錯誤。 除了「kAudioSessionProperty_PreferredHardwareIOBufferDuration」之外,是否還有其他任何可調整緩衝區持續時間的可能性? 在這種情況下文檔不是很有用... 在此先感謝,盧卡斯。

+0

我在我的回覆中添加了相關代碼。 – 2011-02-01 17:22:53

回答

7

使用RemoteIO音頻單元定義和初始化AudioSession沒有問題,這就是設置所需緩衝區長度的方法。我有一些代碼正在做這件事,但它會花我幾個小時,直到我回家並可以發佈它。你可以看看蘋果的AurioTouch code-sample,或等到我稍後發佈。

反正記住兩兩件事:

  1. 緩衝區長度將改變只在設備上,所以如果你改變它,看看在模擬器上沒有差別不要感到驚訝。
  2. 你不能得到任何你想要的緩衝區長度 - 這就是爲什麼該屬性被稱爲PreferredHardwareIOBufferDuration。緩衝區大小始終是2的冪。

考慮到這一點,您是否考慮過分配自己的緩衝區並累積它直到獲得所需數量的樣本?

編輯

初始化音頻部分的代碼(應音頻單元之前去初始化):

OSStatus result; 
result = AudioSessionInitialize(NULL, NULL, NULL, NULL); 

UInt32 audioCategory = kAudioSessionCategory_PlayAndRecord; 
result = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(audioCategory), &audioCategory); 

// set preferred buffer size 
Float32 preferredBufferSize = .04; // in seconds 
result = AudioSessionSetProperty(kAudioSessionProperty_PreferredHardwareIOBufferDuration, sizeof(preferredBufferSize), &preferredBufferSize); 

// get actuall buffer size 
Float32 audioBufferSize; 
UInt32 size = sizeof (audioBufferSize); 
result = AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &audioBufferSize); 

result = AudioSessionSetActive(true); 

可以/應該在每次通話後,以尋找檢查result可能的錯誤。 您可以閱讀AudioSessionInitialize的文檔以獲得更多信息,但通過NULL所有4個參數仍然有效。例如,如果您需要建立中斷偵聽器回調,則應該更改它。

+0

感謝您的有用答案!我會立即測試併發布我的經驗。但是我很難相信緩衝區長度只會在設備上發生變化......如果一個連續的函數需要一個很長的緩衝區作爲輸入呢?這是否意味着它不會在模擬器中正常工作,但在iPhone上正常工作? – Lukas 2011-02-01 20:21:47