Fru*_*oul 2 c c++ linux windows audio
我有一个关于声音的问题。我之前在我的项目中使用过像 OpenAL 这样的声音库。我需要的是了解这些库使用的底层操作系统 API。即使每个库都提供了一种根据格式操作输入文件的简单方法,但非常基本的“原始字节到字节,发送到驱动程序”功能也必须存在。
我的意思是,这些库肯定必须有一个默认的 api(一个用于 Windows,另一个用于 Linux)。我不认为他们直接使用每个声卡的驱动程序,因此操作系统必须以某种方式发挥作用。我对么?
现在,我知道 DirectX 支持声音(虽然我从未使用过),但是 Windows 上默认情况下没有安装 DirectX,所以我想它不算数,而且我不知道 Linux 上会发生什么,我想了解两者。
我知道不使用专用库可能是不切实际的,而且我并不是真的不想这样做,但我对这个主题很好奇。所以请纵容我吧。
那么,对于基本图形来说,它是 OpenGL 和 DirectX...但是声音呢?
先感谢您。
每个主要平台都有许多允许您处理声音的 API,在 Windows 和 Mac 上,操作系统默认使用本机声音 Api,以及其他非标准或已弃用的 API。
看一下这里的图表,它对主要平台上的许多主要声音 API 进行了有用的细分。
除了具有本机声音 API 的每个平台之外,还有许多跨平台 API 封装了每个本机 API 的工作方式,以便允许您编写便携式音频软件。
例如:PortAudio ,这是一个众所周知的 C 语言 API,还有RtAudio,它是一个用于声音的 C++ API,但在我看来,它有点旧的 C++ 风格(不利用 C++11 后的功能) )。
我目前正在开发自己的更现代的 C++11 音频 API,可以在此处找到。目前,我的 API 是 PortAudio 的一个薄包装,允许您以更现代的 C++ 方式处理音频。
请记住,您选择的库还取决于您打算进行的音频工作类型。我上面列出的所有库都处理实时音频处理,但不处理音频文件。如果您想要处理音频文件,您可以使用libsndfile,这是一个流行的开源声音文件操作 API。
从你的问题的上下文来看,听起来你主要是在游戏开发相关的上下文中处理声音。值得一提的是,到目前为止,我建议的大多数库的处理声音的级别都比简单地调用一个函数来播放声音文件要低得多。
尝试回答 OpenAl 如何与操作系统交互的问题最好还是阅读 OpenAL 文档。
我还建议研究基本的数字音频理论以及数字信号处理。网上有许多关于这两个主题的免费资源。
编辑:
关于音频 API 的工作方式... 一般的音频 API 都是在程序员和声卡之间的几个抽象层上工作的。通常,程序员会获得一个存储为值数组的音频数据缓冲区。程序员将请求系统用于播放的一组特定参数(采样率、缓冲区大小、通道数)。程序员将处理音频数据并将输出缓冲区移交给 API,而 API 最终会将缓冲区数据移交给专门为安装的声卡编写的设备驱动程序。该声卡的驱动程序将基于驱动程序所针对的平台指定的接口来实现。这就是为什么当您在计算机上安装新声卡时,可能需要为其安装驱动程序,通过安装驱动程序,您为操作系统级 api 提供了一种与设备通信的方式。
(还有很多事情无法轻易解释,我确信我错过了这个过程中的一些步骤。但我希望这应该是一个足够好的解释来开始)