Поделиться через


Компоненты Wave и DirectSound

Приложения используют сочетание компонентов пользовательского режима и режима ядра для захвата (ввода) и отрисовки (вывода) волновых потоков. Волновой поток — это цифровой аудиопоток, формат данных которого описывается структурой WAVEFORMATEX или WAVEFORMATEXTENSIBLE .

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

  • Функции Microsoft Windows Multimedia waveOutXxx и waveInXxx

  • API DirectSound и DirectSoundCapture

Поведение функций waveOutXxx и waveInXxx основано на возможностях устаревших драйверов волн и устройств. Начиная с Windows 98 , системный драйвер WDMAud преобразует вызовы этих функций в команды для аудиодрайверов WDM. Однако, эмулируя поведение старых программ и оборудования, функции waveOutXxx жертвуют трехмерными звуковыми эффектами и аппаратным ускорением, которые теперь доступны через API DirectSound. Дополнительные сведения о DirectSound и волновых функциях Windows Multimedia см. в документации по Microsoft Windows SDK.

Волновые функции DirectSound и Windows Multimedia являются клиентами системного драйвера SysAudio, который создает графы фильтра звука, обрабатывающие потоки волн и DirectSound. Построение графа прозрачно для приложений, использующих эти программные интерфейсы.

Компоненты волны

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

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

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

В левом верхнем углу рисунка приложение для отрисовки волн (или "wave-out") взаимодействует с аудиодрайверами WDM с помощью функций waveOutXxx , которые реализуются в системном компоненте WinMM в пользовательском режиме, Winmm.dll. Приложение считывает блоки волновых звуковых примеров из файла и вызывает функцию waveOutWrite для их отрисовки.

WDMAud, состоящий из компонентов пользовательского и ядра (Wdmaud.drv и Wdmaud.sys), буферизует данные волн из вызова waveOutWrite и выводит поток волны в системный драйвер KMixer, который отображается под WDMAud на рисунке.

KMixer — это системный компонент, который получает волновые потоки PCM из одного или нескольких источников и смешивает их вместе для формирования единого выходного потока, который также имеет формат волны PCM.

KMixer выводит поток волны на устройство WaveCyclic или WavePci, драйверы портов и минипортов которого отображаются под KMixer в левой части предыдущего рисунка. Драйвер мини-порта привязывается к драйверу порта, чтобы сформировать волновой фильтр, представляющий базовое устройство отрисовки звука. Типичное устройство отрисовки выводит аналоговый сигнал, который приводит в действие набор динамиков или внешний звуковой блок. Устройство отрисовки также может выводить цифровой звук через соединитель S/PDIF. Дополнительные сведения о WaveCyclic и WavePci см. в разделе Фильтры волн.

Кроме того, KMixer может передавать свой выходной поток на аудиоустройство USB, которое управляется системным драйвером класса USBAudio (не показано на рисунке), а не устройством WaveCyclic или WavePci.

Драйвер адаптера создает экземпляр драйвера порта WaveCyclic или WavePci, вызывая PcNewPort со значением GUID CLSID_PortWaveCyclic или CLSID_PortWavePci соответственно.

В правой части предыдущего рисунка показаны компоненты, необходимые для поддержки приложения, которое записывает данные волн в файл. Приложение захвата волн (или "волнообразное") взаимодействует с аудиодрайверами WDM с помощью функций waveInXxx , которые реализуются в системном компоненте WinMM.

В правом нижнем углу рисунка устройство захвата волн управляется драйверами волнового минипорта и портов. Драйверы порта и мини-порта, которые могут иметь тип WaveCyclic или WavePci, связываются друг с другом, образуя фильтр волн, представляющий устройство захвата. Это устройство обычно захватывает аналоговый сигнал с микрофона или другого источника звука и преобразует его в поток волны PCM. Устройство также может передавать цифровой аудиопоток через соединитель S/PDIF.

Драйвер волнового порта напрямую выводит поток волны в KMixer или WDMAud. Поток должен пройти через KMixer, если необходимо преобразовать частоту выборки перед получением WDMAud. Системе, выполняющей одновременную отрисовку и запись аудиопотоков, может потребоваться два экземпляра KMixer, как показано на рисунке. Обратите внимание, что SysAudio автоматически создает эти экземпляры по мере необходимости.

Кроме того, источником захватываемого потока волны может быть USB-звуковое устройство, а не устройство WaveCyclic или WavePci. В этом случае драйвер USBAudio (не показан на рисунке) передает поток в KMixer.

Независимо от того, захватывается ли поток волны USB-устройством или устройством WaveCyclic или WavePci, KMixer при необходимости выполняет преобразование частоты выборки в потоке, но не смешивается с другими потоками. KMixer выводит результирующий поток в Wdmaud.sys, половину системного драйвера WDMAud в режиме ядра. Пользовательский режим, Wdmaud.drv, выводит поток волны в программу приложения с помощью функций waveInXxx , которые реализуются в Winmm.dll. Наконец, в верхней части рисунка приложение захвата волн записывает данные волн в файл.

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

Компоненты DirectSound

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

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

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

В левом верхнем углу рисунка приложение DirectSound загружает волновые данные из файла в звуковой буфер, которым управляет системный компонент DirectSound в пользовательском режиме (Dsound.dll). Этот компонент отправляет поток волны на устройство WaveCyclic или WavePci, драйверы порта и минипорта которого отображаются в левом нижнем левом крае на рисунке. Если на устройстве доступен аппаратный микшер, поток передается непосредственно драйверу волнового порта, минуя KMixer. В противном случае поток сначала проходит через KMixer, который смешивает его с любыми другими одновременно воспроизводимыми потоками. KMixer выводит смешанный поток в драйвер порта.

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

Кроме того, поток волны можно отрисовыть с помощью USB-звукового устройства, а не устройства WaveCyclic или WavePci. В этом случае поток не может обойти KMixer; Системный драйвер класса USBAudio (не показан на рисунке) всегда передает поток в KMixer.

В правой части предыдущего рисунка показаны компоненты, поддерживающие приложение DirectSoundCapture. Приложение записывает волновые данные, получаемые от устройства захвата WaveCyclic или WavePci. Это устройство преобразует аналоговый сигнал с микрофона, например, в поток волн. Волновой порт устройства и драйверы мини-порта отображаются в правом нижнем углу рисунка. Как показано на рисунке, драйвер порта получает в качестве входных данных поток от драйвера мини-порта и выводит его либо непосредственно в компонент DirectSound пользовательского режима, Dsound.dll, либо косвенно через KMixer. Это зависит от того, доступен ли аппаратный контакт захвата на устройстве захвата.

Кроме того, источником захваченного потока волны может быть аудиоустройство USB. В этом случае поток не может обойти KMixer; Драйвер USBAudio (не показан на рисунке) всегда передает поток в KMixer.

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

В правом верхнем углу предыдущего рисунка приложение считывает данные волн из буфера DirectSoundCapture и записывает их в файл.