如何在linux中使用PC扬声器?

时间:2010-12-15 06:03:40

标签: c++ linux audio

如何在linux中使用PC扬声器进行c / c ++编程? 我能控制嘟嘟声时间和频率吗?

5 个答案:

答案 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,但我认为它可以回答你的问题。


编辑:不可思议的是,内核中有一个用于ALSA的PC扬声器驱动程序,可以在PC扬声器中播放数字声音。它的音质很差,但它会使用大量的CPU:)

答案 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

它可以如下执行:

  

./哔哔声