【发布时间】:2012-04-28 10:08:03
【问题描述】:
我想编写一些本机 C/C++ 代码,这些代码获取一些未压缩的 PCM 音频数据,并通过我在 Ubuntu Linux 12.04 上的扬声器播放出来。你能告诉我安装了哪些不同的默认音频 API/库吗?它们的底层架构是什么?它们如何与内核交互? (系统调用)
(我听说过不同的术语,如 ALSA、PulseAudio、OSS 等,但我并不清楚它们的作用以及它们如何组合在一起。)
【问题讨论】:
我想编写一些本机 C/C++ 代码,这些代码获取一些未压缩的 PCM 音频数据,并通过我在 Ubuntu Linux 12.04 上的扬声器播放出来。你能告诉我安装了哪些不同的默认音频 API/库吗?它们的底层架构是什么?它们如何与内核交互? (系统调用)
(我听说过不同的术语,如 ALSA、PulseAudio、OSS 等,但我并不清楚它们的作用以及它们如何组合在一起。)
【问题讨论】:
在 Linux 上,您有 LOTS 的 Linux 音频 API 可供选择。 Here is a graph I made a few years ago demonstrating the relationships among the various Linux audio APIs.
但是,如果您只针对 Ubuntu Linux 并使用 C/C++,并且不需要太花哨的东西(只需获取原始 PCM 数据并将其推送到扬声器),我建议您使用 PulseAudio 并坚持“简单”的 API。 A trivial example can be found here。这是获得概念验证工作阻力最小的途径。
【讨论】:
简单来说,ALSA 为 Linux 中的音频提供了低级基础架构,而 Pulse 提供了更高(更适合桌面)级别。就大多数主流 Linux 发行版(包括 Ubuntu)而言,OSS 已经过时了。
您询问系统调用。您不会通过系统调用在 Linux 中使用音频。如果你选择直接使用 ALSA(对于简单的音频播放来说不是一个好主意),你会使用它的用户空间库 libasound2(甚至 OSS 也会通过 /dev/ 文件而不是系统调用来使用)。
如果您只针对现代 Linux 发行版,请考虑使用 Pulse API。如果您想要更灵活地了解您的目标发行版和跨平台支持的潜力,您可以尝试一个抽象出操作系统特定音频 API 的库 - 例如,PortAudio (http://www.portaudio.com /)。
如果您从未做过任何音频开发,您可能会发现像 PortAudio 这样的库比直接寻址 PulseAudio 更容易使用。
【讨论】: