2010-01-06 50 views
15

我正在製作一個用C編寫的音頻應用程序,我需要在Windows下提供實時音頻播放。我需要決定使用哪個音頻API。我打算使用the basic waveOut API,但我想查看社區在這裏推薦的內容。Windows中低級音頻的最佳API?

我想要的代碼,只要在任何最新版本的Windows上工作,不需要安裝庫;我想要最小的延遲。

我不需要或不需要任何「效果」,我只需要忠實地播放應用程序生成的任何波形樣本。

我的理解是,Windows上的大多數專業音頻應用程序都使用ASIO,它提供了極好的低延遲,但我不想要ASIO,因爲我希望我的代碼能夠正常工作,並且大多數人沒有ASIO預編譯器,安裝在他們的電腦上。 (在以後的日子裏,我可能會回過頭來加入ASIO作爲一個選項,但我首先會選擇最通用的解決方案。)

有沒有什麼比waveOut更適合我的目的,或者那是最好的選擇?

回答

15

這取決於你正在嘗試做什麼。基本的waveOut音頻API更適合流式傳輸音頻。它可以讓你排隊幾個緩衝區並讓它們連續自動播放。但是,如果音頻播放,你想改變它,或添加一些東西,這是相對困難的。

DirectX音頻更適合基於事件的音頻。你可以同時播放幾個東西,而不必自己做混音。您可以輕鬆地添加或刪除小塊音頻,例如用戶在他的槍上扳動扳機時播放聲音。但是流式傳輸(即一個接一個地播放1個緩衝區)比較困難。

waveOut旨在方便播放恆定的音頻,如.mp3文件。 DirectX設計用於間歇性音頻,如遊戲中的反饋。

就編程難度而言,ASIO就像waveOut和DirectX中最糟糕的一樣。這並不穩定。應用程序通常不能共享音頻設備。但它使您能夠以最低延遲訪問該音頻硬件。

ASIO還爲您提供了一種在多個設備上同步播放的方法。

如果您不需要能夠更改在播放之前要播放什麼,並且您不需要同步多個設備,那麼您就不需要ASIO。

+0

和XAudio2呢? – 2010-10-25 23:02:41

+0

XAudio2旨在替代DirectSound。它在WinXP上的DirectSound之上實現。對於WinVista及更高版本,它已集成到內核音頻中。如果您打算使用DirectSound而不是Waveout,則可能比使用DirectSound更好。 – 2010-11-01 19:37:38

+1

@JohnKnoeller很抱歉爲此而nec死。你能詳細闡述一下嗎?「(XAudio2)是在WinXP上的DirectSound之上實現的。對於WinVista及其後的版本,它被集成到內核音頻中。」?我來自[這個問題](http://gamedev.stackexchange.com/questions/51450) – 2013-03-22 02:46:35

4

除了John Knoeller提及的選項之外,還有WASAPI,它比WaveOut允許低得多的延遲,但不幸的是只能從Windows Vista開始提供。

2

自己寫了一個DirectSound流應用程序後,我當然推薦它使用低延遲和易用性。此外,它還使您能夠在舊版Windows上設置更高質量的格式進行播放。

5

當我問這個問題時,我使用waveOut和waveIn API編寫了流代碼。從那時起,我發現了一個有用的庫:

PortAudio http://www.portaudio.com/

PortAudio是一個商業友好的許可證的免費軟件。如果您編寫代碼來調用PortAudio,它應該能夠使用waveOut設備,但也可以使用Windows下的ASIO設備;它可以重新編譯爲Linux,並且可以與ALSA設備一起使用;然後它可以重新編譯爲Mac,並且可以與CoreAudio設備一起使用。我還沒有測試Mac部分,但我的項目在Windows和Linux上運行良好。