C/C++ 声音操作系统 API [关闭]

Posted

技术标签:

【中文标题】C/C++ 声音操作系统 API [关闭]【英文标题】:C/C++ Sound OS API [closed] 【发布时间】:2017-02-02 07:10:49 【问题描述】:

我有一个关于声音的问题。 我以前在我的项目中使用过像 OpenAL 这样的声音库。 我需要的是了解这些库使用的底层操作系统 API。 即使每个库都提供了一种操作输入文件的简单方法 根据格式,非常基本的“原始字节到字节,发送到驱动程序” 函数必须存在。

我的意思是,肯定有一个默认的 api(一个用于 windows,另一个用于 Linux) 这些库使用。我不认为他们直接使用每个声音 卡的驱动程序,因此操作系统必须以某种方式发挥作用。我说的对吗?

现在,我知道 DirectX 支持声音(虽然我从未使用过),但是 DirectX默认没有安装在windows上,所以我想它不算数, 我不知道在 Linux 上会发生什么,我想知道两者。

我知道不使用专用库可能不切实际,但我不知道 真的不打算,但我对这个话题很好奇。 所以请放过我吧。

那么,对于基本图形,它是 OpenGL 和 DirectX...但是声音呢?

提前谢谢你。

【问题讨论】:

对于 Linux 来说,回答是有问题的,因为没有一个单一的声音 API。 那么在 Linux 中,库是如何与所有声卡驱动程序连接的呢?而在windows中,所有声音库都以PlaySound为基础吗? PlaySound 是一个 Windows API 函数,可让您快速轻松地播放声音。它是一种高级的播放声音的方法,它侧重于便利性而不是深度功能。见参考:msdn.microsoft.com/en-us/library/windows/desktop/… Linux:trilug.org/~crimsun/linuxaudio.png @el.pescado 该图几乎总结了 linux 音频的混乱。它似乎也缺少一些连接。 PortAudio 为 ALSA、Pulse 和 OSS 提供了专门的后端,这会给图表带来更多混乱。 【参考方案1】:

每个主要平台都有许多 API,可让您使用声音,在 Windows 和 Mac 上,有操作系统默认使用的 Native Sound Api,以及其他非标准或已弃用的 API .

看看他的图表HERE,它对跨主要平台的许多主要声音 API 进行了有用的细分。

除了每个平台都有原生声音 API 之外,还有许多跨平台 API 封装了每个原生 API 的工作方式,以便您编写便携式音频软件。

例如有:PortAudio,这是一个众所周知的 C 语言 API 还有RtAudio,它是一个用于声音的 C++ API,但在我看来它有点老 C++ 风格(不利用 C++11 后的特性)。

我目前正在开发我自己的更现代的 C++11 音频 API,可以在 HERE 找到它。目前,我的 API 是 PortAudio 的一个精简包装器,可让您以更现代的 C++ 方式处理音频。

请记住,您选择的库还取决于您打算做什么样的音频工作。我上面列出的所有库都处理实时音频处理,而不处理音频文件。如果您正在尝试处理音频文件,您可以使用libsndfile,这是一个流行的开源声音文件操作 API。

从您的问题的上下文来看,您主要是在与游戏开发相关的上下文中处理声音。值得一提的是,在我目前建议的大多数库的级别上处理声音将比简单地调用一个函数来播放声音文件要低得多。

尝试回答 OpenAl 如何与操作系统交互的问题最好还是阅读 OpenAL 文档。

我还建议研究基本的数字音频理论以及数字信号处理。有很多关于这两个主题的免费在线资源。

编辑:

关于音频 API 的工作原理……一般的音频 API 是在程序员和声卡之间的几个抽象层下工作的。通常,程序员会得到一个音频数据缓冲区,该缓冲区存储为值数组。程序员将请求系统将用于回放的一组特定参数(采样率、缓冲区大小、通道数)。程序员将处理音频数据并将输出缓冲区移交给 api,api 最终将缓冲区数据移交给专门为已安装的声卡编写的设备驱动程序。该声卡的驱动程序将根据驱动程序所针对的平台指定的接口实现。这就是为什么当您在机器上安装新声卡时,您可能需要为其安装驱动程序,通过安装驱动程序,您可以为操作系统级别的 api 提供与设备通信的方法。

(还有很多事情无法轻松解释,我确定我在这个过程中遗漏了几个步骤。但我希望这应该是一个足够好的解释来开始)

【讨论】:

非常感谢您提供如此详细的答案,这正是我所怀疑的。还有一件事,为什么(特别是对于像 windows 这样的平台)有这么多不同的 api? (WMWE、DirectSound 等)?为什么需要这么多?他们有什么区别? 对此的主要答案是其中一些是遗留 API,它们是为了向后兼容而存在的。其中一些像 ASIO 是第三方的,旨在尽可能少地处理操作系统并为您提供较低级别的功能。其中一些为您提供了不同级别的硬件抽象。我不是 Windows 声音方面的专家,所以我可能是错的。我主要处理基于 Mac 和 Linux 的系统,几乎总是使用 PortAudio 或者我最近提到的我自己的 API。

以上是关于C/C++ 声音操作系统 API [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中播放声音 [关闭]

声音分析库? [关闭]

检查系统声音是打开还是关闭

如何使用 WaveOut\waveIn Api 录制和播放声音 [关闭]

三星手机,安卓系统,怎么关闭照相机声音?

使用 Web Audio API 为声音的开头添加静音 [关闭]