這使我保持清醒:
我有一個OS X音頻應用程序,如果用戶更改設備的當前採樣率,必須作出反應。
爲此,我在'kAudioDevicePropertyNominalSampleRate'上註冊了輸入和輸出設備的回調。
因此,如果其中一個設備的採樣率發生變化,我將獲得回調,並在設備上將'AudioObjectSetPropertyData'和'kAudioDevicePropertyNominalSampleRate'設置爲選擇器。蘋果郵件列表中被提及
接下來的步驟和我跟着他們:採樣率變化後失真的聲音
- 停止輸入AudioUnit且其由一個混頻器和輸出AudioUnit
- uninitalize他們兩者的AUGraph。
- 校驗爲節點計數,步驟超過它們,並使用AUGraphDisconnectNodeInput從輸出斷開混合器
- 現在設置在輸入單元
- 的輸出範圍和對輸入和輸出範圍的新的採樣率混合器單元上
- 重新連接混合器節點到輸出單元
- 更新圖形
- 初始化輸入及圖形
- 開始輸入和圖形
渲染和輸出回調重新開始,但現在音頻失真。我相信這是負責信號的輸入渲染回調,但我不確定。
我忘了什麼?
就我所知,採樣率不會影響緩衝區大小。
如果我以另一個採樣率開始我的應用程序,一切正常,這是導致失真信號的變化。
我在前後查看流格式(kAudioUnitProperty_StreamFormat)。除了當然會改變爲新值的採樣率之外,所有內容都保持不變。
正如我所說,我認爲這是需要改變的輸入渲染回調。我是否必須通知回調需要更多樣品?我用44k和48k檢查了回調和緩衝區大小,沒有什麼不同。
我寫了一個小測試應用程序,所以如果你想讓我提供代碼,我可以告訴你。
編輯:我錄製了失真的音頻(一個正弦),並在Audacity中查看它。
我發現,每495個樣本之後,音頻會下降17個樣本。 我想你會看到這是怎麼回事:495個樣本+17個樣本= 512個樣本。這是我的設備的緩衝區大小。
但我仍然不知道我能用這個發現做什麼。
我檢查我的輸入和輸出渲染特效和他們的RingBuffer的訪問(我使用CARingBuffer的固定版)
都存儲等沒有遺漏這裏取512幀......