2011-09-20 154 views
1

我有一個使用核心音頻音頻單元的iPad應用程序(調諧器)。它從麥克風讀取信號並對其進行處理。它不會向揚聲器迴應聲音。麥克風和揚聲器反饋

不幸的是,在不同的時間,信號會實際反饋並從揚聲器中傳出 - 響亮而且相位不一。我沒有從麥克風與揚聲器之間建立任何聯繫 - 但它造成了麥克風以某種方式「開啓」的錯覺。它不是一個直接的信號 - 它被切碎,並要求你在發生之前發出一些大聲的噪音。

我擔心這是有關重載CPU或東西。我不認爲回調正在落後。如果我將調試語句放入回調函數中,當我關閉音頻單元時它們似乎停止了,這引起了另一個怪異現象。在某些時候,即使音頻單元已經停止,反饋也會從麥克風繼續發送到揚聲器,因此應用程序必須在不間斷的噪聲停止之前關閉並從後臺處理隊列中移除。

奇怪的是,這並不是每次都發生,並且對每個測試者都是如此,但它確實經常發生,足以引起騷動。

回答

3

如果您的RemoteIO回調過慢和/或您的應用程序崩潰並停止處理音頻回調,RemoteIO音頻緩衝區可能會被回收,這可能會導致一些舊的播放緩衝區或甚至記錄緩衝區結束在下溢音頻通道中重複或重複。測試這種方法的一種方法是在您的回調中註釋掉所有的處理代碼(和調試打印,它們也可能太慢),並查看這是否修復了您的「反饋」問題。

嘗試在RemoteIO記錄和播放回調中只執行簡單緩衝區副本和/或其他低開銷快速處理。不要在遠程回調中處理數據,而是在回調之外進行握手,安排或排隊工作。

如果您的應用程序可以以某種方式檢測到它無法跟上,它應該停止RemoteIO音頻單元(AudioOutputUnitStop)。

也可以在退出每個記錄回調之前嘗試將每個記錄緩衝區的數據歸零。據報道,這可能有助於修復一些非常舊的iPhoneOS版本中的錯誤。

+0

我覺得你撞到了頭上。我減少了處理,反饋消失了。爲了「自我」檢測我是否落後 - 我想我想看看inTimeStamp,並且知道剛剛進來的樣本數量,執行一些小算術以確保回調之間的時間不是以某種方式增長或持續時間超過它應該。我連接到總線1(麥克風),並簡單地將音頻呈現爲本地靜態緩衝區,因此我不確定是否有任何東西在這裏讓我實際上將其清零......但是,如果/當我開始使用ioData緩衝區。 –

相關問題