我想编写一些本机 C/C++ 代码来获取一些未压缩的 PCM 音频数据并通过我在 Ubuntu Linux 12.04 上的扬声器播放出来。您能告诉我安装了哪些不同的默认音频 API/库吗?它们的底层架构是什么?它们如何与内核交互?(系统调用)
(我听说过不同的术语,如 ALSA、PulseAudio、OSS 等,但我并不清楚它们的作用以及它们如何组合在一起。)
在 Linux 上,您有很多Linux 音频 API 可供选择。这是我几年前制作的一张图表,展示了各种 Linux 音频 API 之间的关系。
但是,如果您只针对 Ubuntu Linux 并使用 C/C++,并且不需要任何花哨的东西(只需获取原始 PCM 数据并将其推送到扬声器),我建议您使用 PulseAudio 并坚持“简单“API。一个简单的例子可以在这里找到。这是获得概念验证工作阻力最小的途径。
简单来说,ALSA 为 Linux 中的音频提供了低级基础架构,而 Pulse 提供了更高(更适合桌面)级别。就大多数主流 Linux 发行版(包括 Ubuntu)而言,OSS 已经过时。
您询问系统调用。您不会通过系统调用在 Linux 中使用音频。如果您选择直接使用 ALSA(对于简单的音频播放来说不是一个好主意),您将使用它的用户空间库 libasound2(甚至 OSS 也将通过 /dev/ 文件而不是系统调用来使用)。
如果您只针对现代 Linux 发行版,请考虑使用 Pulse API。如果您想要更灵活地了解您的目标发行版和跨平台支持的潜力,您可以尝试一个抽象出操作系统特定音频 API 的库 - 例如,PortAudio (http://www.portaudio.com /)。
如果您从未做过任何音频开发,您可能会发现像 PortAudio 这样的库比直接寻址 PulseAudio 更容易使用。
FMOD should be great for you. It's fairly easy to integrate to any C++ project (and many more languages) and runs under Windows, Linux (32bit and 64bit), Mac, Android, PS3, Xbox, etc. Also FMOD Ex provides both a low-level API and data-driven API.
It is free to use if you are not planning on making money with your application. Otherwise you might have to pay for a license starting at about 100$.