Я пытаюсь подать звуковой сигнал, но я просто не могу. Я уже попробовал:
#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 ++ для изучения низкоуровневого программирования звука)
И я хотел бы иметь возможность контролировать частоту и продолжительность.
Если вы не вошли в систему с консоли, 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");
}
}
Это зависит от того, какой эмулятор терминала вы используете. Konsole KDE, например, не поддерживает звуковой сигнал с зуммером на всех AFAICT. Сначала проверьте, что echo -e \\a
работает в вашей оболочке. Если это не так, ваш код C ++ тоже не будет работать. Ты можешь использовать xterm
— это поддерживает это.
Но даже в xterm
это может не сработать, если у вас нет pcspkr
(или же snd_pcsp
) модуль ядра загружен. Это часто тот случай, когда дистрибутивы заносят в черный список по умолчанию. В этом случае ваша ставка ищет терминал, который использует звуковую карту для подачи звуковых сигналов, а не зуммер динамика АКА.
Вы пробовали системный вызов в вашем приложении?
система («echo -e ‘\ a'»);
Вы спрашиваете о «низкоуровневом звуковом генерировании». Как правило, самый низкий уровень генерации звукового сигнала включает создание формы волны и передачу ее на аудиоустройство в соответствующем формате. Конечно, тогда он исходит от вашей звуковой карты, а не от динамика компьютера. Лучший совет, который я могу дать, — прочитать API-интерфейсы, связанные с импульсным звуком, alsa или даже звуковыми драйверами ядра. В прошлый раз, когда я играл с этим (~ 1996), это в основном означало выделение массива сэмплов, а затем вычисление значений для помещения туда, которые аппроксимировали синусоидальную волну с соответствующей частотой и амплитудой, а затем записывали этот буфер в устройство вывода. Возможно, даже были некоторые звонки ioctl
установить параметры на устройстве (частота дискретизации, стерео или моно, битрейт и т. д.). Если ваше аудиоустройство поддерживает миди-команды, может быть проще отправить их в какой-либо форме, которая ближе к «воспроизведению этих нот в течение длительного времени с использованием этого инструмента».
Вы можете найти эти статьи полезными: