取自这里:
#include <sys/ioctl.h>
#include <unistd.h>
#include <linux/kd.h>
int main(void)
{
int freq[] = { /* C D E F G A B C */
523, 587, 659, 698, 784, 880, 988, 1046 };
int i;
for (i=0; i<8; i++)
{
ioctl(STDOUT_FILENO, KIOCSOUND, 1193180/freq[i]);
usleep(500000);
}
ioctl(STDOUT_FILENO, KIOCSOUND, 0); /*Stop silly sound*/
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是的,打开控制台设备(例如 /dev/console 或 /dev/tty0),然后向其发出 KIOCSOUND ioctl,如 console_ioctl(4) 手册页中所述。
它很恶心并且是 Linux 特有的,但我认为它回答了你的问题。
编辑:令人难以置信的是,ALSA 内核中有一个 PC 扬声器驱动程序,它可以让您在 PC 扬声器中播放数字声音。它的音质会很差,而且会占用大量 CPU :)
据推测,如果芯片组中仍然有一个与类似扬声器连接的 8253 等效器件,您可以根据数据表寄存器或古老的 PC 指南访问它(我很欣慰地承认我脑子里不再有这些信息)内核模块或以 root 身份调用 ioperm() 之后。
曾几何时,还有一个用于 PC 扬声器的内核 PWM“模拟”音频驱动程序。我相信那是我第一次编译内核。那是在内核模块出现之前,或者至少在它们进入流行发行版之前。