CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Руководство программиста для Linux
Программирование звука
ПК имеет как минимум одно звуковое устройство: встроенный микрофон (PC speaker). Вы также можете купить звуковую карту для вашего ПК, обладающую большими звуковыми возможностями (см. Linux Sound User's Guide или Sound-HOWTO для поддерживаемых звуковых карт).
7.1. Программирование встроенного динамика
Встроенный динамик - это часть консоли 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.
7.2. Программирование звуковой карты
Для вас как для программиста важно знать, что современные Linux-системы имеет встроенную звуковую карту. Один путь проверки - испытать /dev/sndstat. Если открытие /dev/sndstat закончилось неудачно и errno = ENODEV, то это означает, что ни один звуковой драйвер не активирован, и вы не получите никакой помощи от звукового драйвера ядра. Тот же результат может иметь попытка открыть /dev/dsp, если он не связан с драйвером pcsnd.
Если вы хотите повозиться со звуковыми картами на уровне железа, знайте, что комбинация вызовов outb() и inb() определит звуковую карту, которую вы ищете.
Программы, использующие звуковой драйвер, будут хорошо переноситься на другие i386 системы, поскольку некоторые умные люди решили использовать один драйвер для Linux, isc, FreeBSD и большинства других i386 архитектур. Звуковая карта - это не часть консоли Linux, но специальное устройство. Звуковая карта предлагает три основных возможности:
- цифровой образец ввода/вывода
- вывод модуляции частоты
- midi интерфейс
Каждая из возможностей имеет свой драйвер устройства. Для цифровых сэмплов это /dev/dsp, для модуляции частоты - /dev/sequencer, для midi интерфейса - /dev/midi. Звуковые установки (volume, balance, bass) контролируются через /dev/mixer интерфейс. В целях сравнения существует устройство /dev/audio, которое может отображать мю-low звуковые данные в цифровое устройство.
Вы были правы, если подумали, что нужно использовать ioctl() для работы с этими устройствами. Запросы ioctl() определены в и начинаются с SNDCTL_.
Поскольку у автора нет звуковой карты, продолжать здесь должен кто-то явно другой.