2016-12-16 139 views
1

我的應用程序(僅適用於macOS)使用低級CoreAudio功能(AudioDevice-low,而不是AudioUnit)。Mac Core AudioDeviceIOProc返回後播放的音頻輸出緩衝區?

我的問題是:在我的AudioDeviceIOProc返回或需要一個額外的週期後,輸出緩衝器是否立即播放?

讓我通過一個例子來解釋問題的來源。考慮一個輸入監控應用程序,它會對輸入做一些處理並立即回放,爲簡單起見,考慮同一設備的輸入和輸出。

我通過AudioObjectSetPropertyData設置緩衝區的大小,以480幀(10毫秒@ 48kHz的)尋址的屬性kAudioDevicePropertyBufferFrameSize。當我調用AudioDeviceIOProc時,我有10ms的輸入數據,然後在我的AudioDeviceIOProc返回之前處理並寫入輸出緩衝區。

在這一點上我需要了解(一勞永逸),其中以下兩種情況下是正確的:

  • A)10毫秒的時間需要,我只是設置輸出緩衝器之前通過可以播放
  • B)在回調返回後立即播放緩衝區。這似乎是不可能的,因爲它要求在每個週期同一時間回撥需要正好。實際上,如果我們考慮第二次調用ioproc時的處理,則處理比前一個處理花費的時間多20微秒,這會導致差不多一個樣本(0.02 * 48000/1000 samples = 0.96 samples)。

我一直認爲A)是正確答案,這將適合與經驗法則來計算監控往返延遲爲2*I/O buffersize(如這裏https://support.apple.com/en-om/HT201530解釋),但最近我一直在閱讀有關discording信息它。任何人都可以爲我解決這個問題嗎?謝謝

回答

3

coreaudiod調用您的IO Proc時,它正在填充內部緩衝區以輸出到音頻設備。由於Core Audio需要時間處理數據並可能將其與來自其他應用程序的流混合,因此輸出不會立即發生。實際上,甚至有一個屬性允許您控制準備樣本所需的IO週期的時間,kAudioDevicePropertyIOCycleUsage

一旦核心音頻有你的數據,它可能不會立即發送到設備播放。 AudioDeviceAudioStream對象都具有可配置的延遲。對於AudioStream,你可以閱讀kAudioStreamPropertyLatency

鑑於這種複雜性,AudioDeviceIOProc爲您提供了一個參數,以確定樣本何時寫入設備。看倒數第二個參數,const AudioTimeStamp* inOutputTime