Смекни!
smekni.com

Программа воспроизведения произвольного звукового файла с использованием звукового адаптера (формат - wav) (стр. 2 из 4)

1)/2 - 1).

4. Выполнить команду 0Dlh (включить динамик).

5. Настроить DMA (режим 58h + номер канала).

6. Выполнить команду 1Ch

7. В обработчике прерывания: заполнить следующую половину буфера.

8. В обработчике прерывания: подтвердить прерывание чтением из 22Eh и

записью 20h в контроллер прерываний.

9. Подождать, пока не будут воспроизведены все данные.

10. Выполнить команду 0D3h (выключить динамик).

11. Выполнить команду 0D0h (остановить 8-битную DMA-передачу).

12. Выполнить команду 0DAh (завершить режим автоннициалиэации).

13. Выполнить команду 0D0h (остановить 8-битную DMA-передачу).

На платах, начиная с SB16, для этого режима рекомендуется пользоваться командами 0С? h.

1Fb: воспроизведение 2-битного ADPCM через DMA с автоинициализацией (SB2)

Аналог команды 1Ch, но данные хранятся в 2-битном формате ADPCM с нулевым байтом. Длина блока рассчитывается так: длина = (число байтов + 3)/4 + 1 длина блока = (длина + 1)/2 - 1

20h: прямое чтение 8-битных данных из АЦП (SB)

Команда предназначена для чтения оцифрованного звука из внешнего источника. Используется следующая процедура:

1. Выполнить команду 20h.

2. Прочитать очередной байт.

3. Подождать необходимое время и вернуться к пункту 1

Проблемы с этой командой точно такие же, как и с 10h.

24h, LO, HI: чтение 8-битного РСМ через DMA (SB)

Аналог команды 14h, но выполняет не воспроизведение, а запись звука. Последовательность действий идентична случаю с 14h, но используемый режим DMA - 44h + номер канала.

2Ch: запись 8-бнтного РСМ через DМА с автоинициализацией (SB2) Аналог команды 1Ch, но выполняет не воспроизведении, а запись звука. Последовательность действий идентична случаю с 1Ch, но используемый режим DMA - 54h + номер канала.

30h: прямое чтение MIDI (SB)

Выполняет чтение очередного MIDI-события:

1. Выполнить команду З0h.

2. Прочитать MIDI-событие (до 64 байт).

31h: чтение MIDI с прерыванием (SB)

Включает генерацию прерывания от звуковой платы при поступлении нового

MIDI-события. Для этого необходимо:

1. Установить обработчик прерывания.

2. Выполнить команду 31h.

3. В обработчике прерывания: прочитать MIDI-событие.

4. В обработчике прерывания: подтвердить прерывание чтением из 22Eh и

записью 20h в контроллер прерываний.

5. Выполнить команду 31h еще раз, чтобы отменить генерацию прерывания.

32h: прямое чтение MIDI-события с дельта временем (SB)

Выполняет чтение очередного MJDI-события и 24-битного дельта времени, то есть времени в микросекундах, наступившего после предшествующего MIDI-события. (Считываются данные в следующем порядке: младший байт времени, средний байт времени, старший байт времени, MIDI-команда.) Именно в виде последовательности MIDI-событий, перед каждым из которых указано дельта-время, и записывается музыка в MIDI-файлах.

32h: чтение MIDI-события с дельта временем с прерыванием (SB). Включает/выключает генерацию прерываний от звуковой платы аналогично команде 31h, но при чтении MIDI-события передаются вместе с дельта временами, как в команде 32h.

34h: режим прямого доступа к UART (SB2).

Отключает DSP, после чего все команды записи/чтения в его порты (используя тот же механизм проверки готовности) рассматриваются как MIDI-события. Вывести DSP из этого режима можно только с помощью полной переинициализации.

37 h: режим прямого доступа к UART с прерыванием (SB2)

Переключает порты DSP на UART аналогично команде 34h, но каждый раз, когда новое MIDI-событие готово для чтения, вызывается прерывание звуковой платы.

38h: MIDI прямая запись MIDI (SB).

Посылает одно MIDI-событие.

40 h, ТС: установить временную константу (SB)

Устанавливает частоту оцифровки, используя однобайтную константу, рассчитываемую следующим образом:

ТС = 256 - (1000000 / (число_каналов * частота)), где число_каналов - 1 для моно и 2 для стерео.

41h, LO, HI: установить частоту оцифровки (SB16)

Аналогично 40h, но указывается истинное значение частоты (сначала младший, потом старший байты). Число каналов определяется автоматически. Реальная частота тем не менее округляется до ближайшего возможного значения ТС.

45h: продолжить остановленное 8-битное воспроизведение через DMA (SB16) Продолжает остановленное командой 0DAh воспроизведение 8-битного звука через DMA с автоинициализацией.

47h: продолжить остановленное 16-битное воспроизведение через DMA (SB16). Продолжает остановленное командой 0D9h воспроизведение 16-битного звука через DMA с автоинициализацией.

48h, LO, HI: установить размер буфера DMA (SB2)

Устанавливает число байтов минус один для следующей команды передачи через DMA (сначала младший байт, затем старший).

74h, LO, HI: прямое воспроизведение 4-битного ADPCM через DMA (SB).

Аналог 16h, но используется 4-битный вариант формата Creative ADPCM.

75h, LO, HI: прямое воспроизведение 4-битного ADPCM через DMA с новым нулевым байтом (SB).

Аналог 17h, но используется 4-битный вариант формата Creative ADPCM.

76h, LO, HI: прямое воспроизведение 2, 6-битного ADPCM через DMA (SB).

Аналог 16h, но используется 2, 6-битный вариант формата Creative ADPCM.

77h, LO, HI: прямое воспроизведение 2, 6-битного ADPCM через DMA с новым нулевым байтом (SB).

Аналог 17h, но используется 2, 6-битный вариант формата Creative ADPCM.

7Dh: воспроизведение 4-битного ADPCM через DMA с автоинициализацией (SB2).

Аналог lFh, но используется 4-битный вариант формата Creative ADPCM.

7Fh: воспроизведение 2, 6:битного ADPCM через DMA с авто инициализацией (SB2).

Аналог 1Fh, но используется 2, 6-битный вариант формата Creative ADPCM.

80h, LO, HI: заглушить DSP (SB)

Вывести указанное число байтов тишины с текущей частотой оцифровки.

0B?h/0C?h MODE, LO, HI: обобщенный интерфейс к DSP (SB16)

Команды 0B?h используются для 16-битных операций, команды 0C?h – для 8-битных. Младшие четыре бита определяют режим:

бит 0: всегда 0

бит 1: используется FIFO

бит 2: используется автоинициализация DMA

бит 3: направление передачи (0 - воспроизведение, 1 - оцифровка)

Аргументы этой команды - режим, младший байт длины, старший байт длины (перед указанной командой не требуется устанавливать размер DMA-буфера специально)

В байте режима определены всего два бита (остальные должны быть равны нулю):

бит 4: данные рассматриваются как числа со знаком

бит 5: режим стерео

Длина во всех случаях равна числу байтов минус один для 8-битных операций и числу слов минус один для 16-битных.

0D0h: остановить 8-битную DMA-операцию (SB)

Останавливает простую (без автоинициализации) 8-битиую DMA-операцию.

0D1h: включить динамик (SB)

Разрешает работу выхода на динамик (колонки и т. д.).

После сброса DSP этот канал выключен.

0D3h: выключить динамик (SB)

Отключает выход на динамик (колонки и т.д.).

0D4h: продолжить 8-битную DMA-операцию (SB) Продолжает DM А-операцию, остановленную командой 0D0h.

0D5h: остановить 16-битную DMA-операцию (SB)

Останавливает простую (без автоинициалнзаци и) 16-битную DMA-операцию.

0D6h: продолжить 16-битную DMA-операцию (SB).

Продолжает DMA-операцию, остановленную командой 0D5h.

0D8h: определить состояние динамика (SB).

Возвращает 00h, если динамик выключен; 0FFh, если включен.

0D9h: завершить 16-битную DMA-операцию с автоинициализацией (SB16).

Эта команда завершает операцию только после окончания воспроизведения текущего блока. Для немедленного прекращения воспроизведения необходимо выполнить последовательно команды 0D3h, 0D5h, 0D9h и 0D5h.

0DAh: завершить 8-битную DMA-операцию с автоиницианизацией (SB2) Аналог 0D9h, но для 8-битных операций.

0E0h, BYTE: проверка наличия DSP на этом порту (SB2)

Любой байт, посланный как аргумент к этой команде, возвращается при чтении из DSP в виде своего побитового дополнения (DSP выполняет над ним операцию NOT).

0E1h: определение номера версии DSP (SB) Возвращает последовательно старший и младший номера версии DSP:

1.? – SB

2.0 - SB2

3.0 - SBPro

3? - SBPro2

4.0? - SB16

4.11-SB16 SCSI-2

4.12 - AWE32

0E3h: чтение Copyright DSP (SBPro2)

Возвращает ASCIZ-строку с информацией Copyright данной платы.

0E4h, BYTE: запись в тестовый регистр (SB2)

Помещает байт в специальный неиспользуемый регистр, который сохраняется даже после переинициализацию DSP.

0E8h: чтение из тестового регистра (SB2)

Возвращает байт, помещенный ранее в тестовый регистр командой 0E1h 0F0h: генерация синусоидального сигнала (SB)

Запускает DSP на воспроизведение синусоидального сигнала с частотой около 2 кГц, который можно прервать только сбросом DSP.

0F2h: запрос на прерывание в 8-битном режиме (SB)

Генерирует прерывание от звуковой карты. В качестве подтверждения от обработчика ожидается чтение из порта 22Еh.

0F3h: запрос на прерывание в 16-битном режиме (SB)

Генерирует прерывание от звуковой карты. В качестве подтверждения от обработчика ожидается чтение из порта 22Fh.

0FBh: состояние PSP (SB16) Возвращает байт состояния текущей DSP-операции:

бит 0: 8-битное воспроизведение через DMA

бит 1: 8-битное чтение через DMA

бит 2: 16-битное воспроизведение через DMA

бит 3: 16-битное чтение через DMA

бит 4: динамик включен

биты 5-6: не определены

бит 7: ТС модифицирована (может быть ноль, если предыдущая команда 40h пыталась

установить неподдерживаемую частоту)

0FCh: дополнительная информация (SB16).

Возвращает дополнительный байт состояния текущей DMA-операции:

бит 1: синхронный режим (одновременная запись и воспроизведение)

бит 2:8-битный режим с автоинициализацией

бит 4: 16-битный режим с автоинициализацией

0FDh: последняя выполненная команда (SB16).

Возвращает последнюю успешную команду DSP.

Программирование контроллера DMA

Контроллер DMA используется для обмена данными между внешними устройствами и памятью. Он нужен в работе с жесткими дисками и дисководами, звуковыми платами и другими устройствами, работающими со значительными объемами данных. Начиная с PC AT, в компьютерах присутствуют два DMA-контроллера - 8-битный (с каналами 0, 1, 2 и 3) и 16-битный (с каналами 4, 5, 6 и 7). Канал 2 используется для обмена данными с дисководами, канал 3 - для жестких дисков, канал 4 теряется при каскадировании контроллеров, а назначение остальных каналов может варьироваться.

DMA позволяет выполнить чтение или запись блока данных, начинающегося с линейного адреса, который описывается как 20-битное число для первого DMA-контроллера и как 24-битное для второго, то есть данные для 8-битного DMA должны располагаться в пределах первого мегабайта памяти, а для второго - в пределах первых 16 Мб. Старшие четыре бита для 20-битных адресов и старшие 8 бит для 24-битных адресов хранятся в регистрах страниц DMA, адресуемых через порты 80h - 8Fh: