Как использовать динамик ПК в Linux? - PullRequest
12 голосов
/ 15 декабря 2010

Как использовать динамик ПК в Linux для программирования на C / C ++? Могу ли я контролировать время звукового сигнала и частоту?

Ответы [ 5 ]

9 голосов
/ 15 декабря 2010

Взято из здесь :

#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;
}
4 голосов
/ 15 декабря 2010

Да, откройте консольное устройство (например, / dev / console или / dev / tty0), затем введите для него ioctl KIOCSOUND, как описано на справочной странице console_ioctl (4).

Это противнои для Linux, но я думаю, что он отвечает на ваш вопрос.


РЕДАКТИРОВАТЬ: Невероятно, но в ядре есть драйвер для динамика для ALSA, который обеспечивает воспроизведение цифрового звука через динамик ПК.Его качество звука будет плохим, и он будет использовать много процессора, хотя:)

3 голосов
/ 15 декабря 2010

Если вы действительно хотите это сделать, проверьте исходный код команды звукового сигнала: http://www.johnath.com/beep/beep.c

2 голосов
/ 15 декабря 2010

Предположительно, если в чипсете все еще есть эквивалент 8253, подключенный к чему-то, приближающемуся к динамику, вы можете получить к нему доступ в соответствии с регистрационными данными или древними руководствами ПК (я рад признать, что у меня больше нет этой информации ) либо из модуля ядра, либо после вызова ioperm () от имени пользователя root.

Был также когда-то "аналоговый" звуковой драйвер PWM для динамика ПК. Я считаю, что это был первый раз, когда я собрал ядро. Это было за несколько дней до модулей ядра или, по крайней мере, до того, как они стали популярными дистрибутивами.

0 голосов
/ 25 марта 2019

В моем случае, используя 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

Иэто может быть выполнено следующим образом:

. / beep

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...