Примечание: оригинальная версия этой статьи была опубликована мной на сайте habrahabr.ru под названием «Как вернуть качественный звук в Windows 7 — побитовый вывод, аппаратные эффекты (EAX и пр.)».
О звуковых подсистемах
Windows XP
Тут схема звуковой подсистемы примерно следующая:
В данном случае через интерфейс DirectSound ПО имело прямой доступ к аппаратным ресурсам звуковой карты - микширование, преобразование частоты дискретизации, различные эффекты (включая 3D позиционирование) - в общем, всё, что было необходимо, как для музыки/фильмов, так и для игр. Теперь поясню. Суть такова: все программы, заточенные под вывод на DirectSound и ничего не знающие о новом интерфейсе, подключаются к WASAPI в общем режиме (WASAPI Shared), далее происходит следующее: + базовые возможности обработки для звуковых карт не умеющих обрабатывать звук "своими силами" - принудительный ресемплинг сомнительного качества Как видно, больше всего не повезло компьютерным меломанам-аудиофилам (надеюсь, никто не обидится) и геймерам. 2. Есть и другой способ. Если ваша звуковая карта имеет родной драйвер ASIO - вам крупно повезло. ASIO функционирует совершенно отдельно от WASAPI, так что, при прослушивании музыки системные звуки не будут отключаться - потоки ASIO и WASAPI будут микшироваться самой звуковой картой. Теперь непосредственно к делу.
Конечно же, для прослушивания музыки я рекомендую foobar2000 с плагином ASIO Output или WASAPI output support - ни за что другое ручаться я не могу. Подробная настройка вывода звука через foobar2000 описана здесь.
Любителей AIMP я разочарую - WASAPI Exclusive не предполагается даже в AIMP3 beta (только Shared), а ASIO в нем пока что сильно хромает (не умеет выставлять правильное количество каналов вывода, что приводит к нехорошим результатам).
Пользователям Winamp могу предложить плагины ASIO output Plugin или даже такое: OpenAL Output - кстати, еще один способ обхода WASAPI (видно из блок-схемы).
Конечно, были свои проблемы, в частности с микшером Windows (неточная регулировка громкости, принудительная некачественная передискретизация всего и вся до 48 кГц), но они вполне легко обходились с помощью Kernel Streaming (тот самый поток, идущий мимо kmixer), а иногда даже с помощью хороших драйверов (у Creative например таковые появись только в линейке X-Fi. На аудиокартах Audigy микшер ведет себя не вполне адекватно, но, при желании, справиться с этим не сложно).
Vista, Seven
И вот, жили наши энтузиасты-звукари, горя не знали, но тут подоспела новая ОС от Microsoft, которая конечно же обязана была содержать кардинальные изменения (и не так уж важно, в какую сторону).
Таким образом, в рамках новой концепции абстракции от оборудования, Windows Vista, кроме всего прочего, получила полностью переработанную подсистему ввода/вывода звука. И конечно же, переработали её не самым лучшим образом.
Вот, какой вид она приняла в этот раз:
API — Application Programming Interface
APO — Audio Processing Object
CPT — Cross Process Transport
KST — Kernel Streaming Transport
Составляющие WASAPI (используя только ресурсы центрального процессора), выполняют все нужные (и не очень) преобразования:
Плюс к этому надо добавить возможность наложения в процессе обработки программных эффектов (алгоритмы которых заложены в драйверах звуковой карты). Например, для звуковых карт Creative X-Fi есть убогая эмуляция эффекта CMSS-3D.
Качество всех этих обработчиков, само собой, не самое высокое.
Далее всё это отправляется через Kernel Transport на звуковую карту.
Теперь давайте попытаемся объективно оценить преимущества и недостатки новой системы:
+ поддержка на входе практически любого формата аудио - многоканальное аудио с частотой дискретизации до 192 кГц и глубиной квантования до 32-bit float
+ повышенная стабильность (спорное утверждение, в принципе)
- микширование каналов без эффектов окружения (или же они очень примитивны)
- сужение динамического диапазона (особенно в режиме 16 бит)
- отсутствие доступа к аппаратному DSP, т.е. потеря всего его функционала, включая эффекты EAX в играх (в т.ч. и на картах, где EAX эмулировался программно - так как в WASAPI такого понятия даже нет нет)
- щелчки, хрипы и прочие последствия связанные с использованием ресурсов ЦП.
Люди же, не особо интересующиеся тем, что происходит со звуком на пути к звуковой карте - возможно даже получат определенное улучшение (хотя, опять же, им скорее всего всё равно - лишь бы работало)
А теперь, о том как преодолеть большинство из вышеперечисленных проблем, ибо, к великому несчастью, с выходом так любимой многими Windows 7, Microsoft никакой революции в плане звука нам не устроила.
Меломанам: точный вывод звука
1. Как я писал выше, большинство приложений для вывода звука в Windows 7 (хотят они того, или нет) используют режим WASAPI Shared. Но есть и другой режим - WASAPI Exclusive. Если руководствоваться блок-схемой, то в этом режиме отбрасывается всё, что лежит между Application Programming Interface и Kernel Streaming Transport - грубо говоря, звук идет непосредственно от приложения через интерфейс WASAPI на звуковую карту.
Но надо сделать замечание: так как в этом режиме отключен микшер WASAPI, а к микшеру звуковой карты доступа всё равно нет (ибо нет DirectSound), при использовании приложением эксклюзивного режима, воспроизведение любого другого источника через WASAPI становится невозможным.
Но, так или иначе, мы получаем побитовый вывод аудио на звуковую карту.
Вывод: если ваш драйвер ASIO не вызывает сомнений, используйте его.
Да, чуть не забыл - ASIO4ALL использовать нежелательно - как и Kernel Streaming, в этой ОС он работает очень нестабильно (судя по всему, из-за того, что другие звуки, идущие через WASAPI, периодически блокируют Kernel Transport).
Для кинолюбителей: о видеоплеерах
C видеоплеерами ситуация практически аналогичная. Нам необходимо вывести звук на карту в первозданном виде. Особенно это важно, если вы хотите выполнить преобразование многоканального звука в стерео с использованием аппаратных эффектов вроде CMSS-3D в Creative X-Fi (объемное звучание в наушниках или стерео колонках). Для этого звук должен поступить на звуковую карту в многоканальном виде. Но вот беда: WASAPI в общем режиме преобразовывает каналы до кол-ва указанного в настройках Windows. Но даже если вы укажите там, скажем, 5.1, - этот параметр синхронизируется с настройками драйвера звуковой карты, и DSP не будет преобразовывать звук - так как сигнал на входе соответствует по кол-ву каналов настройкам. Т.е. тут принцип таков: в настройках драйвера звуковой карты должна стоять реальная конфигурация подключенного устройства воспроизведения (наушники, АС), а звук на карту должен поступать не измененным.
И так, тут нам опять понадобится WASAPI Exclusive. Я бы посоветовал использовать Media Player Classic HomeCinema в связке с DirectShow фильтром ReClock (только для 32-битного MPC), который, кроме всего прочего, умеет выводить звук на WASAPI Exclusive.
Геймерам: трехмерное позиционирование, EAX
Да, введение новой звуковой подсистемы, несомненно, вызвало негодование у многих геймеров, в т.ч. у счастливых обладателей высокотехнологичных звуковых карт от Creative.
И так, для тех, кто, может быть, еще не в курсе: выход найден - OpenAL. Эта библиотека имеет доступ ко всему, что касается аппаратных эффектов трехмерного позиционирования источников звука и т.н. Environmental Audio Extension - вплоть до версии 5.0.
Кроме того, что продвинутые разработчики таких игр, как например S.T.A.L.K.E.R: Call of Pripyat построили движки своих игр на OpenAL, для остальных игр, рассчитанных на DirectSound, было разработано две программы, преобразующих вызовы DirectSound в OpenAL:
Выводы
И так, вот вроде бы мы имеем всё, чего нам так не хватало сразу после перехода с Windows XP на Windows 7. Конечно, не без лишней мороки, но, что делать - такие уж задачки подкинула нам фирма Microsoft.