Устройство звуковой платы Sound Blaster — КиберПедия 

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Устройство звуковой платы Sound Blaster

2020-03-31 147
Устройство звуковой платы Sound Blaster 0.00 из 5.00 0 оценок
Заказать работу

Российской Федерации.

Брянский государственный технический университет.

 

Кафедра информатики и программного обеспечения.

 

 

Курсовая работа

по дисциплине

 «Организация ЭВМ»

на тему:

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

 

                                                                              Студент:

                                                                                      Изотов И.Н.

 

                                                                 Группа:

                                                                   06ПО3(с)

 

                                                                               Преподаватель:

                                                                                                 Статутов А.Г.   

 

 

Брянск 2007

Содержание

Стр.

Введение--------------------------------------------------------------------------------------- 3

Устройство звуковой платы Sound Blaster--------------------------------------------- 4

Программирование DSP-------------------------------------------------------------------- 5

Команды DSP--------------------------------------------------------------------------------- 7

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

Описание функции Open_file------------------------------------------------------------- 17

Алгоритм и блок-схема-------------------------------------------------------------------- 18

Компиляция---------------------------------------------------------------------------------- 19

Код исходной программы(начало)----------------------------------------------------- 20

Заключение---------------------------------------------------------------------------------- 25

Литература----------------------------------------------------------------------------------- 26

Введение

Программирование современных звуковых плат - весьма сложное занятие. В качестве примера рассмотрим одну часто применяемую операцию – воспроизведение оцифрованного звука. Для вывода звука через звуковую плату может использоваться один из трех режимов: пряной вывод (команда 10h), когда программа должна сама с нужной частотой посылать отдельные байты из оцифрованного звука в DSP; простой DMA-режим, когда выводится блок данных, после чего вызывается прерывания; и DMA с автоинициализацией, когда данные выводятся непрерывно и после вызова каждого блока вызывается прерывание. Именно в этом порядке увеличивается качество воспроизводимого звука. В первом случаи качество звука будет очень плохим, поэтому будем реализовывать второй случай, благодаря чему мы сможем указать точную скорость оцифровки звука и выводить 16-битный звук. Данная программа работает только на звуковых платах Sound Blaster.

 

Устройство звуковой платы Sound Blaster

 

Звуковые платы совместимые с теми или иными моделями Sound Blaster, выглядят как четыре независимых устройства:

1) DSP (Digital Signal Processor) - устройство, позволяющее выводить и счи­тывать оцифрованный звук;

2)  Микшер (Mixer) - система регуляторов громкости для всех каналов платы;

3) DFM (Frequency Modulation) или AdLib (по названию первой звуковой пла­ты) - устройство, позволяющее синтезировать звук из синусоидальных и треугольных волн. Слова типа OPL2 или OPL3 в описании платы - это и есть номера версии используемого FM-синтезатора;

4)  MIDI (Music Instrumental Digital Interface) - стандартный интерфейс пере­дачи данных в музыкальной аппаратуре. Но в нашем случае рассматривает­ся GMIDI (обобщенный MIDI) - более качественная система генерации му­зыки, в которой используются не искусственные синусоидальные сигналы, а образцы звучания различных инструментов. К сожалению, качество этих образцов в большинстве дешевых плат оставляет желать лучшего.

Номера портов ввода-вывода, предоставляющих доступ ко всем этим устрой­ствам, отсчитываются от базового порта, обычно равного 220h, но допускаются также конфигурации с 210h, 230h, 240h, 250h, 260h и 280h. Кроме того, интерфейс - GMIDI использует другую серию портов, которая может начинаться как с 300h, так и с 330h. В описаниях портов мы будем считать, что базовыми являются 220U и 300h. Область портов интерфейса с AdLib начинается с 388h.

Существует большое число модификаций плат Sound Blaster, отличающихся, помимо всего прочего, набором поддерживаемых команд и портов ввода-вывода. После названия каждой команды или порта мы будем указывать сокращенное название платы, начиная с которой эта команда или порт поддерживается:

- SB- Sound Blaster 1.0;

 - SB2 - Sound Blaster 2.0;

- SBPro - Sound Blaster Pro;

- SBPro2 - Sound Blaster Pro2;

- SB16 - Sound Blaster 16;

- ASP - Sound Blaster 16 ASP;

- AWE - Sound Blaster AWE32.

 

Программирование DSP

Цифровой процессор - наиболее важная часть звуковой платы. Именно с его помощью осуществляется вывод обычного оцифрованного звука, так же как и за­пись звука из внешнего источника в файл. Для своей работы, помимо описывае­мых в этом разделе портов, DSP использует прерывания и контроллер прямого доступа к памяти DMA. Программирование DMA мы рассмотрим далее. DSP обслуживается при помощи следующих портов:

226 h для записи: сброс DSP (SB)

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

Процедура сброса осуществляется следующим образом:

1. В порт 226h записывается число 1 (начало инициализации).

2. Выдерживается пауза как минимум 3,3 мкс.

3.   В порт 226h записывается число 0 (конец инициализации).

4. Выдерживается пауза максимум 100 мкс. В течение паузы можно выполнять чтение порта 22Eh. Когда в считываемом числе будет установлен бит 7 (дан­ные готовы), можно сразу переходить к пункту 5. В противном случае имеет смысл повторить процедуру, используя другой базовый порт.

5. Выполняется чтение из порта 22Ah. Если считанное число равно 0AAh - DSP был успешно инициализирован. В противном случае допускается вернуться к пункту 4, но по истечении 100 мкс после записи в 226h можно будет с уверен­ностью сказать, что DSP с базовым адресом 220h не существует или не работает.

22 Ah для чтения: чтение данных из DSP (SB)

Чтение из этого порта используется для передачи всех возможных данных от DSP программам. Процедура чтения состоит из двух шагов;

1. Выполнять цикл чтения порта 22Eh, пока бит 7 считываемого байта не ока­жется равным единице.

2. Выполнить чтение из порта 22Ah.

22 C Н для записи: запись данных и команд DSP (начиная с SB)

Этот единственный порт используется для передачи всего множества команд DSP и для пересылки в него данных (аргументов команд). Процедура записи:

1. Выполнять цикл чтения порта 22Ch, пока бит 7 считываемого байта не ока­жется равным нулю.

2. Выполнить запись в порт 22Ch.

22 Ch для чтения: готовность DSP для приема команды (SB)

Если при чтении из этого порта бит 7 сброшен в ноль - DSP готов к приему оче­редного байта в порт 22Ch на запись. Значение остальных битов не определено.

22 Eh для чтения: готовность DSP для посылки данных (начиная с SB)

Если при чтении из этого порта бит 7 установлен в единицу - DSP готов к пере­даче через порт 22Ah очередного байта.

22 Eh для чтения (тот же порт!): подтверждение обработки 8-битного прерыва­ния (SB)

Обработчик прерывания, сгенерированного звуковой платой по окончании 8-битной операции, обязательно должен выполнить одно чтение из этого порта перед завершением (помимо обычной процедуры посылки сигнала EOI в соответ­ствующий контроллер прерываний).

22 Fh для чтения: подтверждение обработки 16-битного прерывания (SB16)

Обработчик прерывания, сгенерированного звуковой платой по окончании 16-битной операции, обязательно должен выполнить одно чтение из этого пор­та перед завершением (помимо обычной процедуры посылки сигнала ЕОI в со­ответствующий контроллер прерываний).

Теперь рассмотрим команды DSP. Все они пересылаются в звуковую плату че­рез порт 22Ch, как описано выше. После команды могут следовать аргументы которые передаются таким же образом (включая ожидание готовности к приему команды).

Команды DSP

04 h: состояние DSP (устаревшая) (SB2 - SBPro2)

Возвращает информацию о текущей операции DSP:

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

бит 1: стерео АЦП включен

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

бит 3: происходит прямое воспроизведение 8-битного РСМ

бит 4: происходит воспроизведение 2-битного ADPCM через DMA

бит 5: происходит воспроизведение 2,6-битного ADPCM через DMA

бит 6: происходит воспроизведение 4-битного ADPCM через DMA

бит 7: происходит воспроизведение 8-битного РСМ через DMA

10 h, NN: прямое воспроизведение 8-бйтного звука (SB)

Выводит очередной байт (NN) из несжатого 8-битного оцифрованного звука на воспроизведение. При использовании этого способа воспроизведения сама про­грамма должна заботиться о том, чтобы новые данные всегда были наготове (то есть не считывать их с диска в ходе работы) и чтобы байты пересылались в DSP с необходимой частотой. (В этом режиме поддерживаются частоты до 23 кГц.) Процедура вывода проста:

1.    Вывести в DSP команду 10h и очередной байт из оцифровки.

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

Чтобы выполнять пересылку байтов с заданной частотой, обычно перепрог­раммируют системный таймер. Но из-за ограничений по качеству звука и высокой ресурсоемкости такой способ вос­произведения практически не используется.

14 h, LO, HI: прямое воспроизведение 8-битного РСМ через DMA (SB). Начинает процесс воспроизведения данных, на которые настроен соответствую­щий канал DMA:

1. Установить обработчик прерывания от звуковой платы (и разрешить его в контроллере прерываний).

2. Выполнить команду 40h или другим образом установить частоту оцифровки.

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

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

5.  Выполнить команду 14h. Аргументы LO и HI - это младший и старший бай­ты длины проигрываемого участка минус один.

6. Из обработчика прерывания подтвердить его чтением порта 22Е h и посылкой байта 20h в соответствующий контроллер прерываний.

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

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

16 h, LO, HI: прямое воспроизведение 2-битного ADPCM через DMA (SB). Начинает процесс воспроизведения данных аналогично команде 14h, но они долж­ны храниться в сжатом формате Creative ADPCM 2 bit. Длина, указываемая в каче­стве аргументов этой команды, равна (число_6айтов + 2)/4. В качестве нулевого байта в процедуре распаковки ADPCM используется значение, которое применя­лось последней командой 17h. В остальном процедура воспроизведения аналогич­на команде 1 Ah.

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

То же самое, что и 16h, но первый байт из данных будет рассматриваться как ну­левой байт для процедуры распаковки ADPCM.

1 Ch: воспроизведение 8-битного PСМ через DMA с автоинициализацией (SB2) Начинает режим воспроизведения с автоинициализацией - лучший из режимов, предлагаемых звуковыми платами. В этом режиме DSP воспроизводит в цикле содержимое указанного участка памяти, мгновенно возвращаясь на начало, пока он не будет остановлен командой 0DAh или новой командой воспроизведения через DMA. Весь секрет заключается в том, что плата генерирует прерывание не только при достижении конца блока, но и при достижении его середины. Таким образом, пока DSP проигрывает вторую половину буфера, мы можем прочитать следующие несколько килобайтов в первую половину, не останавливая воспроиз­ведение ни на миг:

1. Установить обработчик прерывания звуковой платы и разрешить его в

контроллере прерываний.

2.   Выполнить команду 40h или другим образом установить частоту оцифровки.

3.   Выполнить команду 48h (установить размер DMA-буфера - (число байтов +    

          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.  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 B? h /0 C? 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-битных.                                                                              

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0 E 1 h: определение номера версии 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 данной платы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

Компиляция

Для компиляции будем использовать компилятор и линковщик Tasm и Tlink соответственно:

     tasm /m wavdma.asm

     tlink /t /x wavdma.obj

 

Заключение

 

С момента рождения языка Assembler прошло много времени, появились новые языки и в особенности языки высокого уровня. И казалось бы что такой неудобный, грамосткий, трудно отлаживаемый язык Assembler исчезнет на всегда. Но время показало обратное – он до сих пор пользуется большой популярностью. Ведь благодаря ему можно написать высоко скоростной код, использующий полностью возможности операционной системы, взаимодействовать с внешними устройствами на уровне портов и многое другое. Программирование современных звуковых плат – весьма сложное занятие, требующее уверенное владение языком. В данной работе я попытался описать и показать методы работы со звуковой картой.

 

 

Литература

 

1) Assembler для DOS, Windows и UNIX. – Зубков С.В. ”ДМК” Москва 2000г.

2) Искусство программирования на Ассемблере. – Голубь Н.Г. ”DiaSoft” 2002г.

3) Ассемблер для Windows. – Пирогов В.Ю. 2002г.

4) Windows Assembly Language and Systems Programming.- Barry Kauler.  (перевод).

5) Секреты системного программирования в Windows 98. - Мэтт Питрек.  К., 1996

6) Сайт www.wasm.ru.  

Российской Федерации.

Брянский государственный технический университет.

 

Кафедра информатики и программного обеспечения.

 

 

Курсовая работа

по дисциплине

 «Организация ЭВМ»

на тему:

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

 

                                                                              Студент:

                                                                                      Изотов И.Н.

 

                                                                 Группа:

                                                                   06ПО3(с)

 

                                                                               Преподаватель:

                                                                                                 Статутов А.Г.   

 

 

Брянск 2007

Содержание

Стр.

Введение--------------------------------------------------------------------------------------- 3

Устройство звуковой платы Sound Blaster--------------------------------------------- 4

Программирование DSP-------------------------------------------------------------------- 5

Команды DSP--------------------------------------------------------------------------------- 7

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

Описание функции Open_file------------------------------------------------------------- 17

Алгоритм и блок-схема-------------------------------------------------------------------- 18

Компиляция---------------------------------------------------------------------------------- 19

Код исходной программы(начало)----------------------------------------------------- 20

Заключение---------------------------------------------------------------------------------- 25

Литература----------------------------------------------------------------------------------- 26

Введение

Программирование современных звуковых плат - весьма сложное занятие. В качестве примера рассмотрим одну часто применяемую операцию – воспроизведение оцифрованного звука. Для вывода звука через звуковую плату может использоваться один из трех режимов: пряной вывод (команда 10h), когда программа должна сама с нужной частотой посылать отдельные байты из оцифрованного звука в DSP; простой DMA-режим, когда выводится блок данных, после чего вызывается прерывания; и DMA с автоинициализацией, когда данные выводятся непрерывно и после вызова каждого блока вызывается прерывание. Именно в этом порядке увеличивается качество воспроизводимого звука. В первом случаи качество звука будет очень плохим, поэтому будем реализовывать второй случай, благодаря чему мы сможем указать точную скорость оцифровки звука и выводить 16-битный звук. Данная программа работает только на звуковых платах Sound Blaster.

 

Устройство звуковой платы Sound Blaster

 

Звуковые платы совместимые с теми или иными моделями Sound Blaster, выглядят как четыре независимых устройства:

1) DSP (Digital Signal Processor) - устройство, позволяющее выводить и счи­тывать оцифрованный звук;

2)  Микшер (Mixer) - система регуляторов громкости для всех каналов платы;

3) DFM (Frequency Modulation) или AdLib (по названию первой звуковой пла­ты) - устройство, позволяющее синтезировать звук из синусоидальных и треугольных волн. Слова типа OPL2 или OPL3 в описании платы - это и есть номера версии используемого FM-синтезатора;

4)  MIDI (Music Instrumental Digital Interface) - стандартный интерфейс пере­дачи данных в музыкальной аппаратуре. Но в нашем случае рассматривает­ся GMIDI (обобщенный MIDI) - более качественная система генерации му­зыки, в которой используются не искусственные синусоидальные сигналы, а образцы звучания различных инструментов. К сожалению, качество этих образцов в большинстве дешевых плат оставляет желать лучшего.

Номера портов ввода-вывода, предоставляющих доступ ко всем этим устрой­ствам, отсчитываются от базового порта, обычно равного 220h, но допускаются также конфигурации с 210h, 230h, 240h, 250h, 260h и 280h. Кроме того, интерфейс - GMIDI использует другую серию портов, которая может начинаться как с 300h, так и с 330h. В описаниях портов мы будем считать, что базовыми являются 220U и 300h. Область портов интерфейса с AdLib начинается с 388h.

Существует большое число модификаций плат Sound Blaster, отличающихся, помимо всего прочего, набором поддерживаемых команд и портов ввода-вывода. После названия каждой команды или порта мы будем указывать сокращенное название платы, начиная с которой эта команда или порт поддерживается:

- SB- Sound Blaster 1.0;

 - SB2 - Sound Blaster 2.0;

- SBPro - Sound Blaster Pro;

- SBPro2 - Sound Blaster Pro2;

- SB16 - Sound Blaster 16;

- ASP - Sound Blaster 16 ASP;

- AWE - Sound Blaster AWE32.

 

Программирование DSP

Цифровой процессор - наиболее важная часть звуковой платы. Именно с его помощью осуществляется вывод обычного оцифрованного звука, так же как и за­пись звука из внешнего источника в файл. Для своей работы, помимо описывае­мых в этом разделе портов, DSP использует прерывания и контроллер прямого доступа к памяти DMA. Программирование DMA мы рассмотрим далее. DSP обслуживается при помощи следующих портов:

226 h для записи: сброс DSP (SB)

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

Процедура сброса осуществляется следующим образом:

1. В порт 226h записывается число 1 (начало инициализации).

2. Выдерживается пауза как минимум 3,3 мкс.

3.   В порт 226h записывается число 0 (конец инициализации).

4. Выдерживается пауза максимум 100 мкс. В течение паузы можно выполнять чтение порта 22Eh. Когда в считываемом числе будет установлен бит 7 (дан­ные готовы), можно сразу переходить к пункту 5. В противном случае имеет смысл повторить процедуру, используя другой базовый порт.

5. Выполняется чтение из порта 22Ah. Если считанное число равно 0AAh - DSP был успешно инициализирован. В противном случае допускается вернуться к пункту 4, но по истечении 100 мкс после записи в 226h можно будет с уверен­ностью сказать, что DSP с базовым адресом 220h не существует или не работает.

22 Ah для чтения: чтение данных из DSP (SB)

Чтение из этого порта используется для передачи всех возможных данных от DSP программам. Процедура чтения состоит из двух шагов;

1. Выполнять цикл чтения порта 22Eh, пока бит 7 считываемого байта не ока­жется равным единице.

2. Выполнить чтение из порта 22Ah.

22 C Н для записи: запись данных и команд DSP (начиная с SB)

Этот единственный порт используется для передачи всего множества команд DSP и для пересылки в него данных (аргументов команд). Процедура записи:

1. Выполнять цикл чтения порта 22Ch, пока бит 7 считываемого байта не ока­жется равным нулю.

2. Выполнить запись в порт 22Ch.

22 Ch для чтения: готовность DSP для приема команды (SB)

Если при чтении из этого порта бит 7 сброшен в ноль - DSP готов к приему оче­редного байта в порт 22Ch на запись. Значение остальных битов не определено.

22 Eh для чтения: готовность DSP для посылки данных (начиная с SB)

Если при чтении из этого порта бит 7 установлен в единицу - DSP готов к пере­даче через порт 22Ah очередного байта.

22 Eh для чтения (тот же порт!): подтверждение обработки 8-битного прерыва­ния (SB)

Обработчик прерывания, сгенерированного звуковой платой по окончании 8-битной операции, обязательно должен выполнить одно чтение из этого порта перед завершением (помимо обычной процедуры посылки сигнала EOI в соответ­ствующий контроллер прерываний).

22 Fh для чтения: подтверждение обработки 16-битного прерывания (SB16)

Обработчик прерывания, сгенерированного звуковой платой по окончании 16-битной операции, обязательно должен выполнить одно чтение из этого пор­та перед завершением (помимо обычной процедуры посылки сигнала ЕОI в со­ответствующий контроллер прерываний).

Теперь рассмотрим команды DSP. Все они пересылаются в звуковую плату че­рез порт 22Ch, как описано выше. После команды могут следовать аргументы которые передаются таким же образом (включая ожидание готовности к приему команды).

Команды DSP

04 h: состояние DSP (устаревшая) (SB2 - SBPro2)

Возвращает информацию о текущей операции DSP:

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

бит 1: стерео АЦП включен

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

бит 3: происходит прямое воспроизведение 8-битного РСМ

бит 4: происходит воспроизведение 2-битного ADPCM через DMA

бит 5: происходит воспроизведение 2,6-битного ADPCM через DMA

бит 6: происходит воспроизведение 4-битного ADPCM через DMA

бит 7: происходит воспроизведение 8-битного РСМ через DMA

10 h, NN: прямое воспроизведение 8-бйтного звука (SB)

Выводит очередной байт (NN) из несжатого 8-битного оцифрованного звука на воспроизведение. При использовании этого способа воспроизведения сама про­грамма должна заботиться о том, чтобы новые данные всегда были наготове (то есть не считывать их с диска в ходе работы) и чтобы байты пересылались в DSP с необходимой частотой. (В этом режиме поддерживаются частоты до 23 кГц.) Процедура вывода проста:

1.    Вывести в DSP команду 10h и очередной байт из оцифровки.

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

Чтобы выполнять пересылку байтов с заданной частотой, обычно перепрог­раммируют системный таймер. Но из-за ограничений по качеству звука и высокой ресурсоемкости такой способ вос­произведения практически не используется.

14 h, LO, HI: прямое воспроизведение 8-битного РСМ через DMA (SB). Начинает процесс воспроизведения данных, на которые настроен соответствую­щий канал DMA:

1. Установить обработчик прерывания от звуковой платы (и разрешить его в контроллере прерываний).

2. Выполнить команду 40h или другим образом установить частоту оцифровки.

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

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

5.  Выполнить команду 14h. Аргументы LO и HI - это младший и старший бай­ты длины проигрываемого участка минус один.

6. Из обработчика прерывания подтвердить его чтением порта 22Е h и посылкой байта 20h в соответствующий контроллер прерываний.

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

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

16 h, LO, HI: прямое воспроизведение 2-битного ADPCM через DMA (SB). Начинает процесс воспроизведения данных аналогично команде 14h, но они долж­ны храниться в сжатом формате Creative ADPCM 2 bit. Длина, указываемая в каче­стве аргументов этой команды, равна (число_6айтов + 2)/4. В качестве нулевого байта в процедуре распаковки ADPCM используется значение, которое применя­лось последней командой 17h. В остальном процедура воспроизведения аналогич­на команде 1 Ah.

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

То же самое, что и 16h, но первый байт из данных будет рассматриваться как ну­левой байт для процедуры распаковки ADPCM.

1 Ch: воспроизведение 8-битного PСМ через DMA с автоинициализацией (SB2) Начинает режим воспроизведения с автоинициализацией - лучший из режимов, предлагаемых звуковыми платами. В этом режиме DSP воспроизводит в цикле содержимое указанного участка памяти, мгновенно возвращаясь на начало, пока он не будет остановлен командой 0DAh или новой командой воспроизведения через DMA. Весь секрет заключается в том, что плата генерирует прерывание не только при достижении конца блока, но и при достижении его середины. Таким образом, пока DSP проигрывает вторую половину буфера, мы можем прочитать следующие несколько килобайтов в первую половину, не останавливая воспроиз­ведение ни на миг:

1. Установить обработчик прерывания звуковой платы и разрешить его в

контроллере прерываний.

2.   Выполнить команду 40h или другим образом установить частоту оцифровки.

3.   Выполнить команду 48h (установить размер DMA-буфера - (число байтов +    

          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.  

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

Аналог команды 1Ch, но данные хран<


Поделиться с друзьями:

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.25 с.