Вперед: 8 Символьная графика Оглавление: Оглавление Назад: 6 Межпроцессовые коммуникации LINUX

7 Программирование звука

ПК имеет как минимум одно звуковое устройство: встроенный динамик (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, а специальное устройство. Звуковая карта предлагает три основных возможности:

Каждая из возможностей имеет свой драйвер устройства. Для цифровых сэмплов это /dev/dsp, для модуляции частоты /dev/sequencer, для midi интерфейса /dev/midi. Звуковые установки (volume, balance, bass) контролируются через интерфейс /dev/mixer. В целях сравнения существует устройство /dev/audio, которое может читать звуковые данные SUN-law, но с преобразованием в сэмплы цифрового устройства.

Вы были правы, если подумали, что нужно использовать ioctl() для работы с этими устройствами. Запросы ioctl() определены в и начинаются с SNDCTL_.


Converted on:
Fri Mar 29 14:43:04 EST 1996