Глава 6(фрагмент). Системный звуковой микшер
Системный звуковой микшер
Звуковой микшер является частью мультимедийной библиотеки Windows и описывает входные и выходные линии звуковой карты, а также органы управления размещенные на них. Библиотека размещается в двух файлах, winmm.dll и в ее шестнадцатиразрядной версии mmsystem.dll. Она связывает вызовы мультимедийного пакета API (mixerXXX) с драйвером WDMAud System Driver (wdmaud.drv). Библиотека является нижним слоем, который позволяет программисту управлять звуковым драйвером. Все остальные программные компоненты, в том числе и DirectSound, используют эту библиотеку.
Полное управление звуковым микшером обеспечивает системная программа sndvol32.exe, которая представлена иконкой громкоговорителя в "system tray", . Многие широко применяемые программы, например проигрыватель Windows Media, Winamp не предоставляют прямого управления микшером. В этом легко убедиться, одновременно запустив sndvol32.exe и проигрыватель. Например, при регулировке громкости в проигрывателе громкость, установленная в звуковом микшере не изменяется. Проигрыватель только уменьшает уровень громкости, установленный в звуковом микшере, но не управляет непосредственно микшером. Дополнительно следует отметить, что интерфейсы DirectShow, которые управляют драйверами звукового устройства, не реализуют полное управление звуковым микшером и имеют ограниченные функции.
Зачастую это приводит к неудобству при работе с программой, поскольку для регулировки громкости, кроме регулятора громкости проигрывателя Windows Media приходится вызывать sndvol32.exe для дополнительного управления громкостью и включением звука. Неопытный пользователь может вообще не знать о существовании sndvol32.exe. В этом случае, если звук будет выключен с ее помощью, он не сможет вообще ничего прослушать с проигрывателем Windows Media. Та же ситуация наблюдается и с другим популярным проигрывателем Winamp. Особенно этот недостаток проявляется, если источники звука имеют большой разброс по уровню громкости, что заставляет часто использовать регулировки звука с помощью sndvol32.exe. Например, телевизионные программы очень часто имеют большой разброс по уровню звука.
При записи звука может возникнуть другая неприятная ситуация, связанная с особенностями аппаратной реализации микшера. Практически все современные звуковые карты предоставляют два пути записи звука. Первый путь прямая запись от одного источника звука через канал мультиплексора, который производит независимое переключение источников звука. Второй канал записи образуется при использовании смесителя сигналов и подключения выхода смесителя на вход мультиплексора записи, что позволяет использовать эффекты наложения звука. Наличие двух путей прохождения сигналов может привести к появлению эха в конечном канале записи при определенном сочетании подключенных линий.
Подобные неприятности могут поставить разработчика перед выбором либо использовать совместно со своей программой системную программу sndvol32.exe, что крайне неудобно и снижает потребительские свойства разрабатываемой программы, либо внедрять в свою разработку управление звуковым микшером.
При внедрении в разработку управления системным микшером, в большинстве случаев, если только не пишется программа для специализированной обработки звука, достаточно общего управления включением и выключением сигнала, и управления громкостью в трактах записи и воспроизведения. Обычно нет необходимости обеспечивать полную функциональность микшера. Достаточно предоставить пользователю необходимые для функционирования программы регулировки звука. Остальные органы управления должны быть установлены по умолчанию или переключаться в соответствии с режимами программы таким образом, чтобы не возникало необходимости в использовании sndvol32.exe. Для этих целей желательно иметь простой в применении класс микшера, и в тоже время позволяющий наращивать его возможности без особых дополнительных усилий. Прежде чем перейти к проектированию такого класса рассмотрим общие принципы построения API, управляющего микшером.
Структурная схема микшера.
Основным элементом микшера является линия. Все линии можно разделить на две большие группы: входные линии и выходные линии. Входные линии подключаются к источнику звука с одной стороны и к выходной линии с другой стороны. Выходные линии подключаются к входной линии с одной стороны и к потребителю звукового сигнала с другой стороны. Каждая линия может иметь свой набор органов управления, которые в общем случае представляют собой регуляторы различного назначения, переключатели режимов работы и один или несколько каналов прохождения сигнала.
Кроме деления на входные и выходные, все линии еще делятся по типу применения. Например, может быть выходная линия для громкоговорителя и выходная линия для наушников, входная линия для микрофона и входная линия для линейного входа. Таким образом, линия описывается и типом компонента, который подключается к ней.
Потребители звукового сигнала также разделяются на две групп: потребители, воспроизводящие звук, и потребители, записывающие звук. Следует отметить, что прямого соответствия между источниками сигнала и физическими входами звуковой карты нет.
На рисунке 1 приводится упрощенная структура микшера интегрированной звуковой карты. Такой микшер имеет обычно две выходные линии, одна предназначена для записи звука, а вторая для его воспроизведения.
Рис.6.1. Упрощенная структура микшера.
Они определены константами типов компонентов MIXERLINE_COMPONENTTYPE_DST_WAVEIN (запись) и MIXERLINE_COMPONENTTYPE_DST_SPEAKERS (воспроизведение). Эти две линии являются типовыми линиями и присутствуют во всех звуковых картах. Линия записи (…DST_WAVEIN) физически является входом аналого-цифрового преобразователя.
К линии записи подключается входная линия, обычно являющаяся мультиплексором, который может подключить к линии записи не более одной входной сигнальной линии. Таким образом, мультиплексор можно рассматривать как сложную входную линию, содержащую N переключаемых входных линий. На рисунке мультиплексор обозначен как элемент MUX.
К линии воспроизведения (…DST_SPEAKERS ) подключается смеситель (сумматор) сигналов. Часто он не представляется сложной линией как мультиплексор, а выглядит как простая совокупность входных линий, которые могут подключаться группой из N линий к выходной линии. Выход смесителя может подключаться к входу мультиплексора, образуя второй канал записи сигнала с одновременным его прослушиванием. При таком подключении появляется возможность производить запись от нескольких источников одновременно. Из всех входных линий следует отметить типовую линию, которая присуща всем звуковым картам и маркируется константой MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT. Эта линия является выходом цифро-аналогового преобразователя.
Вышеупомянутые константы определены в файле mmsystem.h. Среди них есть две константы (…UNDEFINED) для маркировки линий специфических для звуковой карты. Линии, промаркированные этими константами, изначально могут быть, как отключены, так и подключены. Часто они имеют имена, не отражающие их действительного назначения или отражающие их очень и очень условно. В качестве примера можно привести линию …SRC_WAVEOUT, которая имеет имя "Звук" и является выходом цифро-аналогового преобразователя. Слово "Звук" с позиции пользователя совершенно не отражает назначения линии. Также не ясно назначение специфической линии (…UNDEFINED) "Спереди". Можно предположить, что это подключение фронтальных громкоговорителей, точно определить это пользователь может только экспериментально. Подобные имена при проектировании класса микшера следует заменять собственными именами, более точно отражающими назначение органа управления или оставлять имена в английской транскрипции без перевода. На рисунке 1 показана экспериментально определенная цепь выключателя "Спереди". Как видно из рисунка он включен последовательно с выключателем "Звук".
Эта пара выключателей важна еще и по другой причине. Допустим, что производится запись с линейного входа звуковой карты. Для этого подключается линейный вход мультиплексора, а для прослушивания записываемого сигнала следует подключить линию "Звук" и линию "Спереди", что совершенно не очевидно для обычного пользователя. Допускаем при этом, что пользователь знает, что нужно включить линию "Главный регулятор" и сделал это. Если необходимо произвести запись с суммированием источников тогда нужно на мультиплексоре записи включить "Выход микшера звукозаписи", а на смесителе воспроизведения "Лин. вход" и например "Микрофон". При этом необходимо отключить либо линию "Звук" либо линию "Спереди" или обе сразу. В противном случае создается канал передачи сигнала записи с выхода на вход через шину PCI и образование многократного эха. Задача усложняется тем обстоятельством, что производитель не считает нужным предоставить необходимую информацию в поставляемой документации. Кроме того, каждый производитель вправе по собственному усмотрению создавать специфические линии для своего устройства и, как правило, не объясняет их назначения.
Хорошего решения для выхода из этой ситуации нет. Точнее хорошим решением является плохое решение, оставить пользователя один на один с системным микшером, но решение плохо еще и тем, что окно sndvol32.exe слишком большое и неудобное. Можно попытаться несколько исправить положение, если создать класс для управления микшером, который позволял бы разделить управление микшером по разным диалогам и создавать органы управления раздельно для каждой линии. Тогда можно было бы отсеять часть заведомо ненужных органов управления и сгруппировать необходимые в соответствии с режимами работы программы. Далее сделаем попытку создать подобный класс, а пока рассмотрим подробно средства управления микшером.
[в начало]