Программирование встроенного динамика
Встроенный динамик - это часть консоли Linux и, поэтому является символьным устройством. Как следствие, существуют запросы ioctl для манипуляций с ним. Для встроенного микрофона это такие два запроса:
1. KDMKTONE
Генерирует сигнал beep заданной длительности, используя таймер ядра. Например, ioctl(fd, KDMKTONE, (long) argument).
2. KIOCSOUND
Генерирует бесконечный beep или прерывает звучащий в настоящий момент. Например, ioctl(fd, KIOCSOUND, (int) tone).
Третий аргумент первого примера содержит значение тона в нижнем слове и сдвиг в верхнем. Тон - это не частота. Таймер 8254 материнской платы ПК заведен на 1.19 МГц и поэтому тон - это 1190000/частота. Сдвиг измеряется в шагах таймера. Оба вызова срабатывают немедленно, поэтому вы можете порождать звуковые сигналы, не блокируя программу.
KDMKTONE можно использовать для предупреждающих сигналов, поскольку вам не приходится заботиться о его прекращении.
При помощи KIOCSOUND можно проигрывать мелодии, как это демонстрируется в примере программы splay. Для остановки сигнала значение тона устанавливается в 0.