c - 如何从头开始用 C 语言播放声音 (Linux)

标签 c linux

如何在不使用任何外部库的情况下在 C 中以不同的音调播放声音?我知道 C 中有许多声音库可以让你播放声音,但我想知道的是它背后是如何工作的?您如何告诉计算机以特定音调/频率播放特定音符? 我知道在 Windows 上使用 sound() 函数是可能的,但我找不到任何关于 Linux 的文档,我找到的只是 beep() 函数(或write(1, "\a", 1)) 输出默认的终端蜂鸣声,但我不知道如何播放不同的声音。

最佳答案

Linux 内核原生音频 API 是 ALSA(高级 Linux 声音架构)。
使用 ALSA 的原始音频播放示例: https://gist.github.com/ghedo/963382/815c98d1ba0eda1b486eb9d80d9a91a81d995283
但是,ALSA 是一种低级 API,不建议由更高级别的应用程序直接使用。

适用于 GNU/Linux 的现代系统音频 API 要么是 PulseAudio(Ubuntu 上的当前默认设置),要么是更新更好的 PipeWire(Fedora 上的默认设置) ).

使用“从头开始”生成音频的 PipeWire 播放原始音频的示例:
https://docs.pipewire.org/page_tutorial4.html

如何告诉计算机以特定音调/频率播放特定音符?

声音是一种通过空气(或其他介质)传播的机械振动。它可以数字表示为一系列数值,代表给定采样率下的气压。要播放给定的音调/频率,请生成该频率的正弦波(以播放采样率)并使用您选择的声音 API 来播放它。

有关生成 440Hz 音调的示例,请参阅上面的 PipeWire 教程。

关于 PulseAudio/PipeWire:

这些库通常是操作系统的一部分,并作为系统 API 公开(因此它们不是“外部库”,如果这意味着某些库随您的程序一起提供或要求用户安装),并且它们应该由应用程序使用播放音频。

在后台,这些库通过 ALSA(或使用蓝牙等)处理音频路由、混音、回声消除、录音和播放到内核。用户和开发人员对系统音频层的所有期望。

直到最近,PulseAudio 才是事实上的通用桌面系统音频 API,许多应用程序仍在使用 PulseAudio API 在 GNU/Linux 上播放音频。 PipeWire 包括与 PulseAudio 的兼容性,因此使用 PulseAudio API 的应用程序将在可预见的 future 继续工作。
使用 PulseAudio 播放原始音频的示例: https://freedesktop.org/software/pulseaudio/doxygen/pacat-simple_8c-example.html

关于c - 如何从头开始用 C 语言播放声音 (Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71445060/

相关文章:

linux - 通过 inode 打开文件

linux - 使用 QEMU 模拟 Arietta G25 开发板

c - 为什么我的 Euler Project 代码有缺陷?

linux - 共享内存的页面缓存

c - Strrev 在 C 语言中行为异常

html - 以下的 Vim 快捷方式或插件

linux - 尾部最后修改的文件并监视 bash 中的新文件

xml - 搜索一个字符串,但搜索该字符串之前和之后的另一组字符串

c - 减少 While 循环中的时钟周期计数以提高粒度

c++ - 将字符串转换为函数