我正在研究用C语言编写的音频应用程序.我需要在Windows下提供实时音频播放.我需要决定使用哪个音频API.我打算使用基本的waveOut API,但我想查看社区推荐的内容.
我希望代码能够在任何最新版本的Windows上运行,而无需安装库; 我想要最小的延迟.
我不需要或不需要任何"效果",我只需要忠实地播放应用程序生成的任何波形样本.
我的理解是,Windows上的大多数专业音频应用程序都使用ASIO,这提供了出色的低延迟,但我不想要ASIO,因为我希望我的代码能够正常工作,大多数人都没有在他们的计算机上预安装ASIO .(稍后我可以回过头来添加ASIO作为选项,但我会先找到最通用的解决方案.)
那里有什么东西比waveOut更适合我的目的,还是最好的选择呢?
这取决于你想要做什么.基本的waveOut音频API更适合流式传输音频.它允许您排队几个缓冲区并让它们连续自动播放.但是如果正在播放音频并且您想要更改它,或者添加一些内容,则相对较难.
DirectX音频更适合基于事件的音频.你可以同时玩几件事情,而不必亲自动手.您可以轻松添加或删除少量音频 - 例如当用户拉动枪上的触发器时播放声音.但是流式传输(即一个接一个地播放1个缓冲区)更难.
waveOut旨在促进播放恒定的音频,如.mp3文件.DirectX专为间歇性音频而设计,如游戏中的反馈.
就编程难度而言,ASIO就像waveOut和DirectX中最差的一样.它不是那么稳定.应用程序通常无法共享音频设备.但它为您提供了对该音频硬件的最低延迟访问.
ASIO还为您提供了一种在多个设备上同步播放的方法.
如果您不需要在播放之前更改要播放的内容,并且您不需要同步多个设备,那么您不需要ASIO.
当我问这个问题时,我使用waveOut和waveIn API编写了流代码.从那时起,我发现了一个有用的库:
PortAudio http://www.portaudio.com/
PortAudio是具有商业友好许可证的免费软件.如果您编写代码来调用PortAudio,它应该可以使用waveOut设备,也可以使用Windows下的ASIO设备; 然后可以为Linux重新编译它,并且应该与ALSA设备一起使用; 然后它可以为Mac重新编译,并且应该与CoreAudio设备一起使用.我没有测试过Mac部件,但我的项目在Windows和Linux上运行良好.