ГЛАВА 9. ТЕХНОЛОГИИ ОБРАБОТКИ МУЛЬТИМЕДИА




 

§ 9.1.Обзормультимедийныхустройств Windows

 

В операционной системе Windows поддержка технологии мультимедиа обеспечи-

вает возможность работы с разнообразными периферийными аудио- и видеоустройства-

ми. При этом реализуется интеграция множества различных форматов данных в единой

системной среде. Средства мультимедиа можно условно разделить на три составные

части: аппаратные аудио- и видеоустройства, драйверы этих устройств и обобщенные

API-функции, которые переводят программные инструкции в команды для драйверов

соответствующих устройств [12].

Мультимедийные операции связаны с интенсивными потоками данных, они накла-

дывают высокие требования на производительность центрального процессора и на его

возможность быстро обрабатывать большие объемы информации. Для обеспечения эф-

фективной работы мультимедийные устройства должны поддерживать определенные

стандартные функции и протоколы.

Чтобы обеспечить быстрое внедрение мультимедийных систем, Microsoft в со-

трудничестве с другими разработчиками аппаратного и программного обеспечения раз-

работали спецификации Multimedia PC, которые устанавливают минимальные требова-

ния к таким системам. Аппаратным и программным продуктам, совместимым с этим

стандартом, присваивается торговая марка МРС. Например, проигрыватель компакт-

дисков должен передавать данные со скоростью не менее 150 Кб в секунду, используя

при этом не более 40 процентов ресурсов центрального процессора. Среднее время по-

иска информации для такого устройства не должно превышать 1 секунды.

Типы мультимедийных устройств, которые поддерживает ОС Windows представ-

лены в таблице 9.1.

Таблица 9.1


Тип устройства

animation

cdaudio

dat

digitalvideo

 

mmovie

other

overlay

scanner

sequencer

videodisc

waveaudio


Описание

Устройство воспроизведения анимации

Проигрыватель музыкальных компакт-дисков

Цифровой магнитофон

Устройство воспроизведения цифрового видео в окне (не средства-

ми GDI)

Анимационные файлы

Неопределенное MCI-устройство

Оверлейное устройство (воспроизводит аналоговое видео в окне)

Сканер изображений

MIDI-синтезатор

Проигрыватель лазерных дисков

Устройство воспроизведения оцифрованных звуков (звуковая кар-

та)


 

Windows содержит набор драйверов, обеспечивающих поддержку различных аппа-

ратных устройств и форматов данных. В недалеком прошлом эти устройства были не-

доступны большинству пользователей персональных компьютеров. Кроме драйверов

устройств подсистема мультимедиа включает драйверы видеоадаптеров высокого раз-

решения, утилиты Sound Recorder (Звукозапись) и Media Player (Универсальный проиг-

рыватель), а также несколько утилит в панели управления, предназначенных для ин-

сталляции устройств и настройки мультимедийной среды.

Помимо аппаратного обеспечения и драйверов, подсистема мультимедиа включает

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

 



 

 

программ. Так, существует единый набор команд для воспроизведения аудиофайлов с

помощью любой звуковой карты. В ОС Windows функции, предназначенные для выпол-

нения мультимедийных операций, находятся в библиотеке WinMM.DLL. Соответствен-

но, подсистема Win32, предназначенная для интерпретации и выполнения мультиме-

дийных команд, называется WinMM. Следует отметить, что приложение, использующее

команды WinMM, должно содержать файл Mmsystem.H и иметь связь с библиотекой

Winmm.LIB. (В среде Windows 3.1 мультимедийные функции находятся в файле Mmsys-

tem.DLL). Таким образом, при переносе приложения из Windows 3.1 в более современ-

ные ОС семейства Windows необходимо убедится в том, что в МАК-файле вместо

Mmsystem.LIB включен файл Winmm.LIB.

Операционная система обеспечивает четыре различных способа управления муль-

тимедийными операциями: два набора команд высокого уровня, один набор команд низ-

кого уровня и набор команд для ввода/вывода файлов.

Команды высокого и низкого уровней управляют одними и теми же мультимедий-

ными устройствами. Первые удобнее в использовании, но вторые являются более мощ-

ными. Кроме того, поскольку все высокоуровневые команды реализованы с помощью

функций низкого уровня, лучшего быстродействия можно достичь при непосредствен-

ном выполнении низкоуровневых команд.

Команды низкого уровня взаимодействуют непосредственно с драйверами физиче-

ских устройств. Команды высокого уровня взаимодействуют с драйверами логических

устройств. В Windows есть три логических мультимедийных устройства:

MIDI-синтезатор, проигрыватель компакт-дисков и проигрыватель аудиофайлов. Эти

устройства преобразуют высокоуровневые команды в обращения к функциям низкого

уровня, адресованные конкретным физическим устройствам. API высокого уровня,

сформированный драйверами логических устройств, называется MCI (Media Control In-

terface - интерфейс управления средой). MCI-команды избавляют программиста от необ-

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

однако за счет некоторого уменьшения гибкости.

Мультимедийные команды низкого уровня необходимы только в специализиро-

ванных программах. Функции высокого уровня позволяют воспроизводить MIDI-файлы,

видеоклипы, воспроизводить записи с лазерных и компакт-дисков, а также записывать и

воспроизводить звуковые файлы.

MCI поддерживает два параллельных набора функций: интерфейс команд и интер-

фейс сообщений. Командные строки и управляющие сообщения служат для выполнения

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

написании пользовательских командных сценариев управления устройствами. Функция

mciSendCommand() посылает управляющие сообщения, например MCI_OPEN или

MCI_PLAY. Аналогичная функция mciSendString() посылает соответствующие строки,

например open c:\sounds\harp.wav или play waveaudio to 500.

Четвертый набор MCI-команд обеспечивает чтение и запись мультимедийных

файлов. Мультимедийные команды ввода/вывода (MMIO - Multimedia I/O) воспринима-

ют стандартный формат организации файлов - RIFF (он будет рассмотрен ниже), а также

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

сивных потоков данных.

Поскольку синхронизация играет очень большую роль при выполнении мультиме-

дийных операций, в частности при воспроизведении MIDI-файлов и координации рабо-

ты различных устройств, осуществляющих одновременную обработку данных, подсис-

тема WinMM поддерживает усовершенствованные функции таймера. Мультимедийный

таймер не посылает сообщения WM_TIMER. Его работа основана на прерываниях. Цен-

тральный процессор регулярно получает сигналы прерываний от микросхемы таймера, а

 


 

 

мультимедийный таймер во время этих прерываний активизирует функции обратного

вызова, содержащиеся в вашей программе.

Сигналы таймера прерываний являются значительно более регулярными по срав-

нению с сообщениями, поскольку при их использовании не тратится время на ожидание,

когда освободится очередь сообщений приложения. Кроме того, точность мультимедий-

ного таймера составляет 10 миллисекунд (для процессоров MIPS) или 16 миллисекунд

(для процессоров Intel), а наименьший возможный интервал между вызовами функции

SetTimer() составляет приблизительно 55 миллисекунд, причем даже такой интервал не

всегда гарантирован из-за задержек в очереди сообщений. Временное разрешение тай-

мера варьируется от системы к системе. Определить конкретное значение разрешения

можно с помощью функции timeGetDevCaps(). Рассмотрим белее подробно поддержку

систем анимации и звука в WinAPI [12].

Анимация. Подсистема WinMM поддерживает воспроизведение анимации. От-

крыв устройство mmovie, можно запускать через него анимационные файлы. Функции

работы с анимацией не связаны с GDI. Устройство mmovie во многом аналогично ау-

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

деоклипов читает данные из RIFF-файла, содержащего блоки данных в формате RMMP.

Поддерживаются такие анимационные эффекты, как персонажи, сцены, кисти,

смена кадров и палитры, звуковое сопровождение, а также многое другое. Открытие

устройства mmovie осуществляется с помощью сообщения MCI_OPEN, воспроизведение

данных - с помощью сообщения MCI_PLAY, а закрытие устройства - с помощью сооб-

щения MCI_CLOSE. Существует также несколько дополнительных сообщений, специ-

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

позицию в файле на несколько кадров в прямом или в обратном направлении. Сообще-

ние MCI_WINDOW устанавливает и настраивает параметры окна, в котором происходит

воспроизведение клипа. Но в основном анимационные MCI-команды работают анало-

гично командам воспроизведения звуковых файлов, и вы, зная один набор команд, легко

разберетесь со вторым.

Аппаратныесредстваобработкизвука. Первоначально интерфейс со звуковыми

устройствами был введен в Windows 3.x под названием MME (MultiMedia Extension -

мультимедийное расширение). При переносе на платформу Win32 он практически не

претерпел изменений. Звуковые устройства в Windows относятся к классу

Multimedia/Audio. В данный класс первоначально входили три типа устройств: CD-DA

(Compact-Disk Digital Audio), MIDI (Musical Instrument Digital Interface) и Wave (wave-

form audio).

Первый - это формат цифровых звукозаписей на компакт-дисках, который иногда

называют Red Book (красная книга - по внешнему виду опубликованного документа, со-

держащего описание стандарта). Этот формат применяется при производстве музыкаль-

ных компакт-дисков. Каждая секунда такой записи занимает 176 Кб дискового про-

странства.

Другой, более компактный формат хранения данных представляет собой стандарт-

ный протокол взаимодействия музыкальных инструментов и компьютеров. MIDI-файлы

состоят из команд воспроизведения различных музыкальных эффектов цифровыми син-

тезаторами, занимают гораздо меньше места на диске и позволяют создать высококаче-

ственную музыку, но для их записи необходима специальная MIDI-аппаратура.

Третий формат - формат файлов звукозаписи позволяет записывать звук приемле-

мого качества без синтезатора, причем данные занимают меньше места на диске по

сравнению с форматом Red Book. Этот формат обеспечивает запись звука путем дискре-

тизации входного сигнала с определенной частотой и записи цифрового значения каж-

дой выборки.

 


 

 

В Win32 дополнительно введен тип Aux - вспомогательные звуковые устройства

(например, микшеры), при помощи которых реализуется управление параметрами звука,

регулировки, настройки и т.п. Wave–устройства предоставляют весь необходимый сер-

вис для записи и воспроизведения цифровых звуковых потоков в реальном времени с

промежуточной буферизацией данных. Каждый из типов включает устройства ввода (In)

и вывода (Out). Первые служат для записи звука от внешнего источника в приложение,

вторые - для воспроизведения звука, порожденного приложением, или извлеченного из

звукового файла, или полученного иным способом.

Типовойзвуковойадаптер содержит стереофонические АЦП и ЦАП (аналого-

цифровой и цифро-аналоговый преобразователи), микшер и управляющий цифровой

процессор, координирующий работу всех узлов адаптера. Микшер расположен в анало-

говой части адаптера. В его задачу входят: регулировка входных уровней различных ис-

точников звука - микрофона, линейного входа, компакт-диска, модема и т.п., сведение

всех источников в единый звуковой сигнал, поступающий на АЦП, а также регулировка

выходного сигнала адаптера, снимаемого с ЦАП.

В режиме записи схема АЦП через равные интервалы времени опрашивает вход-

ной сигнал и формирует последовательность мгновенных значений амплитуды, назы-

ваемых отсчетами. В зависимости от заданного режима, разрядность отсчета (sample

width) может быть разной: 8 или 16 бит - для простых адаптеров и от 18 до 24 - для

сложных и качественных. Чем больше разрядность отсчета, тем выше точность цифро-

вого представления сигнала и ниже уровень шумов и помех, вносимых АЦП при оциф-

ровке.

Частота, с которой АЦП опрашивает входной сигнал, называется частотой дискре-

тизации (sample rate). Для точного цифрового представления сигнала частота дискрети-

зации должна быть как минимум вдвое выше максимальной частоты сигнала; на практи-

ке обычно выбирается небольшой запас для компенсации погрешностей. Например, для

представления сигналов с полосой частот до 10 кГц выбирается частота около 22 кГц.

Последовательность отсчетов, сформированная АЦП, передается управляющим

процессором в основную память компьютера при помощи внепроцессорного доступа к

памяти (DMA - на шине ISA, Bus Mastering - на шине PCI). После заполнения части

(обычно половины) выделенной для обмена области памяти адаптер подает сигнал аппа-

ратного прерывания, по которому драйвер адаптера извлекает накопленные в памяти

данные и переносит их в буфер программы, которая запросила запись звука. После за-

полнения буфера программы драйвер подает ей программный сигнал, по которому про-

грамма переносит данные в нужное ей место: в другую область памяти для обработки,

на диск, отображает на экране и т.п.

При воспроизведении звука происходит обратный процесс: программа записывает

последовательность звуковых отсчетов в буфер и передает его драйверу, который по

частям переносит данные в область памяти для DMA. Управляющий процессор адаптера

последовательно извлекает из памяти отсчеты и направляет их на ЦАП, где они преоб-

разуются в обычный электрический звуковой сигнал, который, пройдя через регуляторы

микшера, попадает на выходной разъем адаптера.

Для удобства буфер обмена между процессором и звуковым адаптером делается

циклическим (кольцевым). Это означает, что пока одна сторона (адаптер или ЦП) ведет

запись первой половины буфера, другая сторона должна успеть прочитать данные из

второй половины, и наоборот. Если быстродействия ЦП или драйвера не хватает, или

нарушается правильная работа системы аппаратных прерываний, то записываемый звук

теряется, а воспроизводимый - зацикливается. Зацикливание короткого фрагмента вос-

производимого звука - типичный признак неверного выбора линии прерывания для

адаптера или неисправности в системе прерываний.

 


 

 

Взаимодействие приложения с драйвером организуется в виде взаимного обмена

потокамизвуковыхданных в реальном времени. От устройства ввода к приложению

идет непрерывный поток записанного звука, от приложения к устройству вывода - не-

прерывный поток воспроизводимого. Приложение должно успевать принимать записы-

ваемый поток и формировать воспроизводимый, иначе в звуковых потоках возникают

выпадения и помехи.

Звуковойбуфер служит для переноса потоков между приложением и звуковым

драйвером. Он представляет собой область памяти, в которой хранится небольшой

фрагмент потока длительностью в десятки-сотни миллисекунд. Звуковые буферы соз-

даются приложением и затем передаются драйверу: пустые - для устройств ввода, за-

полненные звуковыми данными - для устройств вывода. Драйвер ставит полученные

буферы в очередь в порядке поступления; воспроизведение или запись данных ведется с

начала очереди.

После завершения обработки каждого очередного буфера драйвер возвращает его

приложению. С этого момента буфер доступен для повторного использования: он может

быть заполнен новыми данными и снова передан этому же или другому звуковому уст-

ройству для постановки в очередь. Таким образом, между драйвером и приложением

происходит циклическое «вращение» буферов, в которых переносятся звуковые потоки.

Для каждого звукового буфера приложением также создается заголовок (header) –

дескриптор, в который куда заносятся параметры буфера и режимы его обработки. Об-

мен буферами между приложением и драйвером происходит в виде обмена их дескрип-

торами. Если к моменту завершения обработки буфера устройства вывода в очереди не

имеется следующего буфера, то в выходном звуковом сигнале возникает пауза, но вывод

потока не прерывается. Если программа не успевает передать драйверу очередной буфер

для устройства записи, то фрагмент сигнала теряется.

Звуковые устройства делятся на синхронные и асинхронные. Синхронному уст-

ройству для выполнения операций записи/воспроизведения требуются все ресурсы цен-

трального процессора. Драйвер такого устройства, получив очередной буфер, не воз-

вращает управления до тех пор, пока буфер не будет заполнен или проигран. В очереди

драйвера синхронного устройства может находиться только один звуковой буфер. Асин-

хронное устройство работает независимо от центрального процессора, обрабатывая дан-

ные в выделенной области памяти и лишь изредка (один раз в несколько десятков мил-

лисекунд) сообщая драйверу о завершении обработки очередного фрагмента потока.

Драйвер асинхронного устройства возвращает управление сразу же после получения

очередного буфера, и в его очереди может находиться сколь угодно большое количество

буферов.

Звуковые адаптеры, способные одновременно записывать и воспроизводить раз-

личные звуковые потоки, называются полнодуплексными (full duplex). Соответствую-

щие устройства ввода и вывода в Windows могут быть открыты и использованы одно-

временно, и при этом встречные потоки никак не влияют друг на друга.

Адаптеры, способные в каждый момент времени работать только в одном режиме

(либо на запись, либо на воспроизведение), называются полудуплексными (half duplex).

Из соответствующей пары устройств в Windows одновременно может быть открыто

только одно - либо устройство ввода, либо устройство вывода. При попытке открытия

второго устройства возвращается ошибка «устройство занято».

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

боты, например: только в монофоническом режиме (ряд адаптеров на микросхемах

ESS), только в восьмиразрядном режиме (большинство моделей Sound Blaster 16,

AWE32, SB 32, AWE64) и т.п. В остальных режимах такие адаптеры работают только в

полудуплексе.

 


 

 

При завершении обработки каждого буфера драйвер устанавливает в его заголовке

флаг готовности, по которому приложение может определить, что драйвер освободил

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

бом возврата буфера является уведомление (notification), при котором драйвер либо вы-

зывает заданную функцию приложения, либо активизирует событие (event), либо пере-

дает сообщение заданному окну или задаче (thread) приложения. При этом в параметрах

функции или сообщения передается также указатель заголовка буфера.

Перед тем, как быть переданным драйверу устройства, каждый звуковой буфер

должен быть подготовлен (prepared). Как правило, подготовка заключается в фиксации

буфера в памяти, так как большинство звуковых адаптеров пользуется внепроцессорны-

ми методами передачи данных, а эти методы требуют размещения буфера на одних и тех

же адресах памяти. Передача драйверу неподготовленного буфера приводит к ошибке.

При работе со звуковыми адаптерами чаще всего используется традиционный спо-

соб цифрового кодирования PCM (Pulse Code Modulation - импульсно-кодовая модуля-

ция, ИКМ). Ряд мгновенных значений звуковой амплитуды, следующих друг за другом с

частотой дискретизации, представляется рядом чисел выбранной разрядности, значения

которых пропорциональны величине амплитуды. Именно в таком виде звуковой поток

снимается с выхода АЦП или подается на вход ЦАП. Однако наряду с предельной про-

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

насколько это возможно при выбранных параметрах оцифровки. Зачастую при програм-

мировании звуковых устройств на первый план выходит задача минимизации скорости и

объема звукового потока, в то время как отдельными параметрами точности и качества

можно пренебречь. В таких случаях используются другие способы кодирования, когда

звуковая информация представляется в виде относительных изменений амплитуды

(ADPCM - adaptive differential PCM, адаптивная разностная ИКМ), мгновенных «сним-

ков» спектра (Audio MPEG) и т.п. Обрабатывать звук в PCM способен любой звуковой

адаптер. Иные способы кодирования аппаратно реализуются лишь в специализирован-

ных адаптерах.

Совокупность основных параметров потока - способа кодирования, частоты дис-

кретизации, количества каналов (стерео/моно) и разрядности отсчета - называется фор-

матомпотока (Wave Format). Желаемый формат указывается при открытии устройст-

ва; для смены формата требуется закрытие и повторное открытие устройства.

Главным параметром формата является способ кодирования, который также называется

еще признаком формата (format tag). Каждый способ кодирования порождает группу од-

нотипных форматов, различающихся лишь точностью представления, а следовательно и

качеством передачи звука.

Основные частоты дискретизации (11025, 22050 и 44100 Гц) в сочетаниях с раз-

личным количеством каналов (1 или 2) и различной разрядностью отсчета (8 или 16) при

способе кодирования PCM образуют 12 типовых форматов. Частота 11025 Гц (полоса

звуковых частот примерно до 5 кГц) приблизительно соответствует качеству телефонно-

го сигнала, частота 22050 Гц (полоса до 10 кГц) - среднего радиоприемника, частота

44100 Гц (полоса до 20 кГц) - качественной звуковой аппаратуре.

Наименьшей единицей звукового потока является блок. Соответственно, размер

каждого буфера, передаваемого звуковой подсистеме, должен быть кратен размеру бло-

ка, а объем данных, возвращаемый устройством ввода, всегда будет кратен размеру бло-

ка. В PCM блоком считается набор отсчетов, передаваемых за один период частоты дис-

кретизации, а именно: один отсчет - для монофонических потоков, два - для

стереофонических, и т. д. Таким образом, блоки следуют друг за другом с частотой дис-

кретизации, а отсчеты в блоках размещаются начиная с левого (нулевого) канала. Если

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

порядке возрастания, как это принято в процессорах Intel. Восьмиразрядные отсчеты в

 

 


 

 

PCM представляются в виде беззнаковых целых чисел; за нуль сигнала принято «цен-

тральное» значение 128 (шестнадцатеричное - 80). Итак, предельной отрицательно ам-

плитуде сигнала соответствует нулевое значение отсчета, а предельной положительной -

значение FF. Для пересчета значений отсчетов в знаковую двуполярную форму в диапа-

зоне от -128 до +127 из них нужно вычитать 128 (0x80), или прибавлять то же самое

смещение, вычисляя по модулю 256, что дает такой же результат.

Отсчеты с разрядностью более восьми представляются в виде целых чисел со зна-

ком в стандартном формате Intel, за нуль сигнала принято нулевое значение отсчета.

Здесь может без каких-либо ограничений применяться обычная целая арифметика, на-

пример над типами short (16-разрядный) и long (32-разрядный). Если разрядность отсче-

та превышает 16, она может быть не кратна байту - современные звуковые адаптеры мо-

гут использовать 18-, 20- и 22-разрядные отсчеты. В таком случае отсчет выравнивается

по старшей границе трех- или четырехбайтового слова, а лишние младшие разряды за-

полняются нулями. Подобное представление позволяет работать с отсчетами любой раз-

рядности так же, как с 24- или 32-разрядными; от фактической разрядности отсчета за-

висит лишь точность полученного числа.

С момента запуска потока драйвер отслеживает текущую позицию записи или вос-

произведения, которая в любой момент может быть запрошена приложением. Точность

определения реальной позиции зависит от используемого устройства: она может указы-

вать на конкретный звуковой отсчет либо на небольшую группу отсчетов, находящуюся

в данный момент в обработке. Как правило, все адаптеры имеют скрытую небольшую

очередь между встроенным процессором и ЦАП/АЦП, так что полученная от драйвера

позиция почти всегда будет отличаться от реальной на несколько отсчетов. Драйвер от-

слеживает позицию путем подсчета количества звуковых блоков потока, переданных от

приложения к устройству или наоборот. Если приложение не успевает своевременно пе-

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

вительного времени записи или воспроизведения.

Циклическое движение буферов может быть приостановлено и затем возобновлено

с места прерывания с сохранением позиции в потоке. Поток может быть уничтожен

(сброшен) - в этом случае драйвер немедленно возвращает приложению все ждущие бу-

феры и обнуляет позицию потока. Для устройств воспроизведения один или несколько

идущих подряд буферов могут быть зациклены (looped): в этом случае драйвер последо-

вательно проигрывает их заданное количество раз, после чего возвращает приложению и

переходит к воспроизведению следующих буферов из очереди.

Звуковая подсистема Windows допускает работу с устройством нескольких про-

цессов (клиентов) одновременно. Многие современные и даже некоторые устаревшие

звуковые устройства поддерживают более одного клиента; устройство вывода (или его

драйвер) смешивает проигрываемые клиентами звуковые потоки, а устройство ввода

размножает записываемый поток для всех подключенных клиентов.

Устройство, драйвер которого поддерживает не более одного клиента, не может

быть повторно открыто до тех пор, пока клиент не закроет его. При попытке повторно

открыть такое устройство звуковая подсистема возвращает сообщение об ошибке, сиг-

нализирующее о том, что устройство занято.

Для упрощения реализации основных операций со звуком Windows содержит

службу переназначения - Wave Mapper. Поскольку в ОС Windows может быть установ-

лено более одного звукового устройства, существуют понятия стандартного системного

устройства ввода и стандартного системного устройства вывода. Оба они задаются в за-

кладке Audio формы свойств мультимедиа. Приложение может запросить работу с кон-

кретным звуковым устройством либо со стандартным системным - в последнем случае

служба переназначения определяет нужное устройство.

 


 

 

Кроме трансляции запросов к нужному устройству, Wave Mapper может выпол-

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

звука.

В Win32 имеется подсистема сжатия звука (Audio Compression Manager, ACM),

при помощи которой возможно взаимное преобразование звуковых форматов - как

внутри групп, так и между ними. Наряду с простыми преобразованиями (изменением

частоты дискретизации, количества каналов или разрядности отсчета), ACM предостав-

ляет широкий набор форматов сжатия - ADPCM, a-Law, mu-Law, MSN Audio, GSM,

MPEG и т.п. Подсистема сжатия реализована в виде набора так называемых кодеков

(ACM Codec) - специальных драйверов ACM, которые непосредственно занимаются пе-

реводом звука из одного формата в другой. Сам же ACM - это диспетчер, который взаи-

модействует с приложением и по запрошенным форматам активизирует нужные кодеки,

снабжая их необходимыми параметрами. Служба ACM может использоваться как авто-

номно - через собственный отдельный интерфейс, так и автоматически - службой Wave

Mapper.

Когда приложение открывает конкретное звуковое устройство, указывая требуе-

мый формат потока, звуковая подсистема пытается связаться непосредственно с драйве-

ром устройства. Однако если устройство не поддерживает требуемый формат, а обра-

тившейся программой разрешена работа через Wave Mapper, то подсистема может

попытаться найти подходящий кодек ACM, который способен в реальном времени пре-

образовывать один из «родных» форматов устройства в формат, запрошенный приложе-

нием. Если такой кодек обнаружен, подсистема прозрачно включает его в работу между

драйвером и приложением, а приложение может считать, что выбранный формат потока

поддерживается непосредственно устройством.

Звуковая подсистема нумерует установленные устройства начиная с нуля. При ус-

тановке нового устройства или удалении существующего нумерация изменяется, поэто-

му даже во время работы программы в системе могут появиться или исчезнуть звуковые

устройства. Вместо номера звукового устройства может использоваться ключ (handle)

ранее открытого устройства; система автоматически определяет, какое именно значение

передано интерфейсной функции. Как и в случае с файлами, при открытии каждого зву-

кового устройства система возвращает его идентификатор, или ключ (handle), по кото-

рому затем происходит вся остальная работа с устройством. Формально идентификато-

ры устройств ввода и вывода имеют различные типы - HWAVEIN и HWAVEOUT,

однако оба они эквивалентны типу HWAVE, который может использоваться для созда-

ния универсальных функций, не зависящих от типа устройства. Ключи звуковых уст-

ройств не имеют ничего общего с ключами файлов, событий, окон, задач и т.п. Систем-

ные функции DuplicateHandle(), CloseHandle() и прочие к ним не применимы.

Несмотря на то, что большая часть функций интерфейса одинакова либо симмет-

рична для устройств ввода и вывода, разработчики Microsoft по непонятной причине

разделили названия функций для устройств ввода и вывода: каждая функция имеет пре-

фикс, состоящий из типа и «ориентации» устройства: midiIn, waveOut и т.п. С одной

стороны, это способствует защите от ошибок, но с другой - усложняет создание универ-

сальных функций и классов, в которых направление передачи задается параметром.

Главным недостатком звуковой подсистемы MME, реализованной в Windows 9x

является то, что подсистема и ее драйверы так и остались 16-разрядными, как и в

Windows 3.x. Из-за этого каждое обращение к звуковому драйверу из Win32–

приложения сопровождается двойной сменой режима исполнения (thunking), что приво-

дит к дополнительным временным расходам, которые могут доходить до единиц милли-

секунд. Кроме того, многие драйверы ограничивают частоту обновления кольцевого бу-

фера, через который идет обмен между компьютером и адаптером, до нескольких

десятков раз в секунду, отчего в процессе передачи звука возникает отставание (latency).

 

 


 

 

У драйверов для адаптеров ISA это отставание может достигать десятков миллисекунд,

у драйверов для адаптеров PCI оно обычно ограничивается единицами миллисекунд.

Для более оперативного вывода звука, особенно с модификацией его в реальном

времени, Microsoft разработан более новый интерфейс - DirectSound. Этот интерфейс

призван «приблизить» аппаратуру адаптера к прикладной программе и позволяет ей

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

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

DirectSound программа обращается непосредственно к 32-разрядному системному

драйверу адаптера (VxD), минуя переключения между 32- и 16-разрядным режимом ис-

полнения.

В целях эффективной работы интерфейс DirectSound должен поддерживаться сис-

темным драйвером адаптера. Для устройств, драйверы которых не поддерживают

DirectSound, Windows эмулирует новый интерфейс «поверх» обычного MME-драйвера,

но в этом случае все задержки даже возрастают из-за накладных расходов на эмуляцию.

К сожалению, Microsoft разработала спецификацию расширения DirectSound для

звуковых VxD только в части воспроизведения звука, действуя прежде всего в интересах

производителей игр. Запись звука через DirectSound до сих пор ведется путем эмуляции

поверх MME.

Следует отметить, что звуковая подсистема Windows 3.x и 9x, равно как и подсис-

тема удаленного доступа к сети (RAS), обладает низкой устойчивостью к ошибкам. Это

чаще всего проявляется в том, что при аварийном завершении программы, открывшей

звуковые устройства и работающей с ними, система не выполняет корректного закрытия

(cleanup) используемых устройств. В результате этого в ряде случаев после такого ава-

рийного завершения может потребоваться перезагрузка, а до тех пор незакрытые уст-

ройства будут недоступны другим приложениям. Кроме того, 16-разрядные подсистемы

защищены от ошибок гораздо меньше 32-разрядных, так что серьезные ошибки в звуко-

вых программах могут приводить к сбоям и «зависаниям» всей системы Windows.

В Windows NT все подсистемы сделаны изначально 32-разрядными, поэтому опи-

санных проблем там не возникает, однако задержки ввода и вывода звука по-прежнему

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

конкретного адаптера.

 

§ 9.2.Элементарные API-функциидляобработкизвука

 

Программныесредстваобработкизвука. По общепринятой договоренности фай-

лам звукозаписи присваивается расширение WAV. Для воспроизведения звука большин-

ство программ используют одну из трех простейших функций, которые лучше всего

подходят для работы с короткими WAV-файлами.

MessageBeep() - Воспроизводит системные звуки, занесенные в реестр в качестве сигна-

лов предупреждений и сигналов об ошибках.

SndPlaySound() - Воспроизводит звук непосредственно из WAV-файла или из буфера в

памяти.

PlaySound() - Новая функция Win32, которая во многом дублирует команду

sndPlaySound, но имеет два отличия: она не воспроизводит фрагменты, находящиеся в

памяти, но позволяет прослушивать звукозаписи, которые хранятся в ресурсах типа

WAVE.

Функция MessageBeep() принимает единственный параметр, указывающий один из

пяти системных звуков, сконфигурированных с помощью панели управления. Дополняя

каждый вызов функции MessageBox() функцией MessageBeep(), можно сопровождать

звуковыми сигналами все сообщения различного уровня важности. Например, если

функция MessageBox() отображает значок MB_ICONHAND, в качестве аргумента Mes-

 

 




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: