Операционные системы. Учебное пособие. Марапулец Ю.В. - 224 стр.

UptoLike

Составители: 

Кроме трансляции запросов к нужному устройству, 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).
226
     Кроме трансляции запросов к нужному устройству, 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).

                                          226