如何在linux中使用PC扬声器进行c / c ++编程? 我能控制嘟嘟声时间和频率吗?
答案 0 :(得分:9)
取自here:
#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;
}
答案 1 :(得分:4)
是,打开控制台设备(例如/ dev / console或/ dev / tty0),然后向其发出KIOCSOUND ioctl,如console_ioctl(4)手册页中所述。
这很糟糕,特定于Linux,但我认为它可以回答你的问题。
答案 2 :(得分:3)
如果确实想要这样做,请查看beep命令的源代码: http://www.johnath.com/beep/beep.c
答案 3 :(得分:2)
据推测,如果芯片组中仍然有8253等效物连接到接近扬声器的东西,你可以根据数据表寄存器或古老的PC指南来访问它(我放心地承认我不再有这个信息在我脑海中)来自内核模块或以root身份调用ioperm()之后。
曾经有一个用于PC扬声器的内核PWM“模拟”音频驱动器。我相信这是我第一次编译内核。这是在内核模块之前的几天,或者至少在它们进入流行版之前。
答案 4 :(得分:0)
在我使用Ubuntu 16.04的情况下,“ ioctl”功能不起作用。
因此,最后,以下代码在不安装任何其他库的情况下运行良好。
/* This outputs a tone to the speaker */
#include <alsa/asoundlib.h>
#include <math.h>
#define RATE 44100 // PCM rate [Hz]
#define FREQ 440 // Tone frequence [Hz]
#define DURATION 5 // Tone duration [s]
void info_format(snd_pcm_format_t format);
int main(void)
{
snd_pcm_t *handle;
unsigned char buffer[RATE * DURATION];
for (int i = 0; i < sizeof(buffer); i++)
{
buffer[i] = 0xFF * sin(2 * M_PI * FREQ * i / RATE);
}
snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0 /* blocked mode */);
snd_pcm_set_params(handle, SND_PCM_FORMAT_U8, SND_PCM_ACCESS_RW_INTERLEAVED, 1 /* channels */, RATE /* rate [Hz] */, 1 /* soft resample */, 500000 /* latency [us] */);
snd_pcm_writei(handle, buffer, sizeof(buffer));
snd_pcm_close(handle);
return 0;
}
如果代码的文件名为'beep.c',则可以按以下方式进行编译:
gcc beep.c -lasound -lm -o beep
它可以如下执行:
./哔哔声