C++ - звуковой сигнал не работает (Linux)

Я пытаюсь подать звуковой сигнал, но я просто не могу. Я уже попробовал:

#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
    cout << '\a' << flush;
    return 0;
}

Я также пытался использовать это: http://www.johnath.com/beep/ Но просто не пищит.

(Если я бегу $ speaker-test -t sine -f 500 -l 2 2>&1 на терминале он подает звуковой сигнал, но я хотел бы подать звуковой сигнал на C++ для изучения низкоуровневого программирования звука)

И я хотел бы иметь возможность контролировать частоту и продолжительность.

4 ответа

Это зависит от того, какой эмулятор терминала вы используете. Konsole KDE, например, не поддерживает звуковой сигнал с зуммером на всех AFAICT. Сначала проверьте, что echo -e \\a работает в вашей оболочке. Если это не так, ваш код C++ тоже не будет работать. Ты можешь использовать xterm - это поддерживает это.

Но даже в xterm это может не сработать, если у вас нет pcspkr (или же snd_pcsp) модуль ядра загружен. Это часто тот случай, когда дистрибутивы заносят в черный список по умолчанию. В этом случае ваша ставка ищет терминал, который использует звуковую карту для подачи звуковых сигналов, а не зуммер динамика АКА.

Если вы не вошли в систему с консоли, cout не будет ссылаться на системную консоль. Вам нужно открыть /dev/console и отправить \a там.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
    int s = open ("/dev/console", O_WRONLY);
    if (s < 0)
        perror ("unable to open console");
    else
    {
        if (write (s, "\a", 1) != 1)
            perror ("unable to beep");
    }
}

Вы спрашиваете о "низкоуровневом генерации звука", обычно самый низкий уровень генерации звука будет включать создание формы волны и передачу ее на аудиоустройство в соответствующем формате. Конечно, тогда он исходит от вашей звуковой карты, а не от динамика компьютера. Лучший совет, который я могу дать, это прочитать API-интерфейсы, связанные с импульсным аудио, alsa или даже драйверами звука ядра. В прошлый раз, когда я играл с этим (~1996), это в основном означало выделение массива сэмплов, а затем вычисление значений для помещения туда, которые аппроксимировали синусоидальную волну с соответствующей частотой и амплитудой, а затем записывали этот буфер в устройство вывода. Возможно, даже были некоторые звонки ioctl установить параметры на устройстве (частота дискретизации, стерео или моно, битрейт и т. д.). Если ваше аудиоустройство поддерживает миди-команды, может быть проще отправить их в какой-либо форме, которая ближе к "воспроизведению этих нот в течение длительного времени с использованием этого инструмента".

Вы можете найти эти статьи полезными:

Вы пробовали системный вызов в вашем приложении?

система ("echo -e '\a'");

Другие вопросы по тегам