C/C++声音操作系统API

C/C++ Sound OS API

本文关键字:操作系统 API 声音 C++      更新时间:2023-10-16

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

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

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

我知道不使用专用图书馆可能不切实际,我也不这么认为真的不打算,但我对这个话题很好奇。所以请原谅我。

所以,对于基本图形来说,它是OpenGL和DirectX。。。但声音呢?

提前谢谢。

每个主要平台都有许多允许您使用声音的API。在Windows和Mac上,操作系统默认使用Native sound 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提供一种与设备通信的方式。