2011-07-20 88 views
2

我正在實現一個程序,用於從輸入設備讀取音頻流並使用NAudio將其發送到輸出設備。爲此,我使用WaveIn及其DataAvailable事件從輸入流中獲取數據。要寫數據,我即將使用WaveOut,這也意味着我需要使用一些IWaveProvider的實現。使用隊列來實現我的需求似乎非常簡單。除了一件事情:當隊列爲空並調用方法時會發生什麼?在文檔中我沒有發現任何關於此的信息。選項我想我有:NAudio音頻中繼器

  1. 該方法應該阻塞,直到有些數據可用。
  2. 該方法立即返回0,表示當前沒有數據可用。
  3. 用零填充緩衝區。

我想使用選項1或2,但後來我發現BufferedWaveProvider(和WaveInProvider,使用BufferedWaveProvider內部),其使用選項3.從這一點,我推斷選項3是優選的一個。

問題是,我推斷是否正確,應該使用選項3?如果我使用選項1或2會發生什麼?這甚至會工作嗎?

回答

3

當聲卡需要更多數據播放時,會調用Read方法。阻塞通常不是一個好的選擇,因爲您可能位於驅動程序內部的線程上(如帶有函數回調函數的ASIO或WaveOut),或者您可能位於GUI線程上(與帶有Windows消息回調函數的WaveOut一樣)。

從Read方法返回0表示「這是音頻數據的結尾」,因此返回0會導致播放停止。

因此,選項三是不阻止您不應阻止的線程並允許播放繼續的最佳選擇。

如果您的Read方法的使用者是例如WaveFileWriter,則選項1會沒事,(選項2可能取決於您如何確定何時停止寫入WAV文件)。

+0

感謝您的信息。 – svick