звуковой сигнал не работает (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 ++ для изучения низкоуровневого программирования звука)

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

1

Решение

Если вы не вошли в систему с консоли, 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");
}
}
2

Другие решения

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

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

2

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

система («echo -e ‘\ a'»);

0

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

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector