如何在不使用任何外部库的情况下在 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/