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

Fay*_*ure 8 c linux

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

abe*_*aud 8

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 来播放它。

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

关于 PulseAudio/PipeWire:

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

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

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