2010-01-06 82 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上运行良好。