2012-11-23 32 views
4

這使我保持清醒:
我有一個OS X音頻應用程序,如果用戶更改設備的當前採樣率,必須作出反應。
爲此,我在'kAudioDevicePropertyNominalSampleRate'上註冊了輸入和輸出設備的回調。
因此,如果其中一個設備的採樣率發生變化,我將獲得回調,並在設備上將'AudioObjectSetPropertyData'和'kAudioDevicePropertyNominalSampleRate'設置爲選擇器。蘋果郵件列表中被提及
接下來的步驟和我跟着他們:採樣率變化後失真的聲音

  • 停止輸入AudioUnit且其由一個混頻器和輸出AudioUnit
  • uninitalize他們兩者的AUGraph。
  • 校驗爲節點計數,步驟超過它們,並使用AUGraphDisconnectNodeInput從輸出斷開混合器
  • 現在設置在輸入單元
  • 的輸出範圍和對輸入和輸出範圍的新的採樣率混合器單元上
  • 重新連接混合器節點到輸出單元
  • 更新圖形
  • 初始化輸入及圖形
  • 開始輸入和圖形

渲染和輸出回調重新開始,但現在音頻失真。我相信這是負責信號的輸入渲染回調,但我不確定。
我忘了什麼?
就我所知,採樣率不會影響緩衝區大小。
如果我以另一個採樣率開始我的應用程序,一切正常,這是導致失真信號的變化。
我在前後查看流格式(kAudioUnitProperty_StreamFormat)。除了當然會改變爲新值的採樣率之外,所有內容都保持不變。

正如我所說,我認爲這是需要改變的輸入渲染回調。我是否必須通知回調需要更多樣品?我用44k和48k檢查了回調和緩衝區大小,沒有什麼不同。

我寫了一個小測試應用程序,所以如果你想讓我提供代碼,我可以告訴你。

編輯:我錄製了失真的音頻(一個正弦),並在Audacity中查看它。
我發現,每495個樣本之後,音頻會下降17個樣本。 我想你會看到這是怎麼回事:495個樣本+17個樣本= 512個樣本。這是我的設備的緩衝區大小。
但我仍然不知道我能用這個發現做什麼。
我檢查我的輸入和輸出渲染特效和他們的RingBuffer的訪問(我使用CARingBuffer的固定版)
都存儲等沒有遺漏這裏取512幀......

回答

1

明白了!
斷開圖形後,似乎有必要告訴兩個設備新的採樣率。
我已經在回調之前完成了這個工作,但似乎必須在以後完成。