Когда начинающий программист знакомится с возможностями компьютера, то первое, что приходит в его незасоренную еще быстрыми сортировками и базами данных голову - это нарисовать хотя бы пару разноцветных кружочков и "побибикать" встроенным динамиком. Кто-то, "набибикавшись" вволю, начинает ковырять те же базы данных или что-нибудь еще, но для тех, в ком БД пока не истребили дух авантюризма, я собираюсь в общих чертах рассказать, как "бибикает" звуковая карта, а в частности - "Sound Blaster" (далее по тексту - SB, бластер). На первый раз ограничимся моделями "SB Pro" и "SB 16".
Со звуковым сигналом вроде бы все просто и понятно (см. материал где-то на ближайших страницах), однако для того, чтобы произвести хоть какое-нибудь заметное шевеление в диффузорах динамиков программно, приходится проделывать немало работы. Рассмотрим компоненты Sound Blaster'а настолько, насколько это необходимо для понимания принципов его программирования.
Основа SB - чип по имени DSP (Digital Sound Processor - Процессор Цифрового Звука). Именно он обеспечивает запись и воспроизведение стерео- и моно-, 8- и 16-битного звука, декомпрессию ADPCM, управление частотой дискретизации и различными режимами работы с DMA (см. ниже). Он же занимается включением/выключением динамиков и линейных входа и выхода.
Микшер - он и есть микшер. Смешивает сигналы от разных входных источников, управляя громкостью и стереобалансом каждого.
FM-синтезатор (он же OPL2 или OPL3). Именно его работу слышат те "счастливчики", у кого нет аппаратного MIDI или программной wavetable, в том числе и ваш покорный слуга. Синтезатор пытается примерно передать звучание реальных музыкальных инструментов с помощью частотной модуляции, что, впрочем, ему почти не удается, но и на том, как говорится, спасибо.
Эти элементы управляются программно, что сводится к записи в порты разнообразных команд и данных. Кстати говоря, адреса портов получаются прибавлением 4-битного смещения к некоторому базовому адресу (вот он, тот самый стандартный 220h!).
Теперь из небольшого уютного SB перенесемся на заросшие пылью поля материнской платы.
Большинство программистов, да и те, кто хотя бы играл в игрушки с бластером, подозревают о существовании в ее чреве чего-то загадочного под коротким названием DMA. На самом деле это всего лишь механизм Прямого Доступа к Памяти (Direct Memory Access). Он специально создан для передачи данных между памятью машины и периферийными устройствами без участия процессора. Именно к числу таких устройств принадлежит и усердно препарируемый нами сейчас Sound Blaster.
Для общения с бластером DMA использует один из каналов, номер которого устанавливается перемычками на плате SB (именно этот номер и запрашивают setup'ы добрых DOS'овских игрушек). Начало передачи данных инициируется бластером, для чего ему посылается соответствующая команда. Как уже, видимо, догадались самые проницательные, для программирования цифрового звука нужно еще уметь программировать DMA, что в принципе несложно: в памяти выделяется область заданного размера (буфер) и DMA информируется о местоположении, размере буфера и о режиме работы с ним. Для работы с SB в основном используются два режима DMA: автоинициализация и однопроходный режим. Немного вдадимся в их тонкости.
В режиме автоинициализации DMA циклически читает одну и ту же область памяти. Таким образом, если не менять данные, то звук будет периодически повторяться. Тем привередам, кому этого недостаточно, придется постоянно переписывать в память свежие числа при получении прерывания (да-да, того самого IRQ!). В этом случае DSP программируется так, чтобы прерывание генерировалось после прочтения очередной половинки буфера. Тогда, получив IRQ, следует сразу же заполнить данными ту половину, которая только что была прочитана. Все эти "шаманские" мероприятия позволяют подготовить очередную порцию данных прежде, чем закончится чтение предыдущей, благодаря чему нет перерывов в звучании, которые, даже будучи очень короткими, заметно искажают звук.
Однопроходный режим полезен, если небольшую порцию данных нужно сыграть один раз. По завершению передачи данных DSP сразу же готова к новому программированию в любом режиме.
Теперь еще более проницательные догадались, что, кроме DMA и DSP, программировать придется еще и PIC (Programmable Interrupt Controller - Программируемый Контроллер Прерываний), с чьей помощью нужно перехватить аппаратное прерывание (IRQ), генерируемое бластером после прочтения очередной порции данных. Но это сводится всего лишь к трем-четырем записям в порты, что совсем просто.
В заключение разговоров о программировании приведу схематичную последовательность работы для получения цифрового звука из SB:
- Установить собственный обработчик аппаратного прерывания от бластера.
- Запрограммировать контроллер DMA.
- Установить частоту дискретизации в DSP.
- Запрограммировать в DSP режим работы DMA, длину одной порции данных и начало передачи.
- Обслуживать поступающие от SB прерывания: а) запрограммировать DMA и DSP на передачу следующего блока данных, если используется однопроходный режим DMA, или записать новую порцию данных в буфер DMA, если работа идет в режиме автоинициализации; б) послать в DSP сигнал подтверждения получения прерывания; в) выдать контроллеру прерываний команду "конец прерывания" (EOI); г) выйти из обработчика (IRET).
- По окончанию работы восстановить оригинальный вектор прерывания.
Ну а теперь, немного разобравшись с аппаратурой, ее работой и программированием, обратим свой пристальный взор на некоторые особенности.
Как Вам уже должно быть известно (если нет, то где-то рядом написано), звук может быть стерео и моно, 8- и 16-битный. Понятно, что стерео - лучше, чем моно и 16 бит - лучше, чем 8, откуда следует, что стерео, 16 бит гораздо лучше, чем моно, 8 бит. Однако далеко не на всех моделях SB этот принцип срабатывает. Оно-то, конечно, и лучше бы, да нельзя. Все DSP, предшествующие модели 4.х, вообще не позволяют проигрывать 16-битный звук. Даже версия 3.х, установленная в SB Pro играет только на 8 битах. (Речь идет о фирменных бластерах "Creative". Владельцы звуковых карт на чипсетах ESS могут отложить валидол в сторону.)
Пару слов о скорости передачи данных: чтобы передавать звук CD-качества, то есть стерео, 16 бит, с частотой дискретизации 44кГц, нужно готовить и пересылать данные со скоростью около 176 килобайт в секунду, а если музыка закодирована в очень популярном сейчас MPEG 1 Layer 3 (файлы *.MP3), расшифровка которого хорошо загружает процессор, то становится ясно, что владельцам старых добрых "четверок" пора приобретать Pentium, дабы наслаждаться звуком, извлекаемым из файлов этого формата.
Вот, пожалуй и все, что в рамках одной статьи можно было рассказать о программировании Sound Blaster'а. Тем, кому интересно разобраться в этой теме более детально, посоветую покопаться в Internet на фирменных сайтах производителей звуковых карт, где Вы в изобилии найдете и документацию, и примеры программ.
Андрей ВОРОШКОВ
Горячие темы