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


Волновые фильтры

Волновые фильтры представляют устройства, которые отрисовывают и (или) захватывают цифровые звуковые данные в формате волн. Приложения обычно получают доступ к возможностям этих устройств через API DirectSound или функции Microsoft Windows multimedia waveOutXxx и waveInXxx . Сведения о волновых форматах, которые могут поддерживать аудиодрайверы WDM, см. в разделах WAVEFORMATEX и WAVEFORMATEXTENSIBLE.

Фильтр волновой отрисовки получает в качестве входных данных волновой цифровой звуковой поток и выводит либо аналоговый звуковой сигнал (в набор динамиков или внешний микшер) либо цифровой аудиопоток (например, в соединитель S/PDIF).

Фильтр захвата волн получает в качестве входных данных либо аналоговый звуковой сигнал (от микрофона или входного разъема), либо цифровой поток (например, от соединителя S/PDIF). Тот же фильтр выводит поток волны, содержащий цифровые аудиоданные.

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

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

Системный драйвер PortCls (Portcls.sys) реализует три драйвера волнового порта: WaveRT, WavePci и WaveCyclic.

Три типа волнового фильтра работают следующим образом:

  • Фильтр WaveRT выделяет буфер для волновых данных и делает этот буфер напрямую доступным для клиента пользовательского режима. Буфер может состоять из непрерывных или несмежных блоков памяти в зависимости от аппаратных возможностей волнового устройства. Клиент обращается к буферу в виде непрерывного блока виртуальной памяти. Буфер является циклическим. Это означает, что, когда указатель устройства для чтения (для отрисовки) или записи (для записи) достигает конца буфера, он автоматически переносится в начало буфера.

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

  • Фильтр WaveCyclic выделяет буфер, состоящий из одного непрерывного блока памяти, для использования в качестве выходного (для отрисовки) или входного (для захвата) буфера. Этот буфер является циклическим. Так как буфер недоступен клиенту напрямую, драйвер должен копировать данные между циклическим буфером драйвера и буфером пользовательского режима клиента.

WaveRT предпочтительнее, чем WavePci и WaveCyclic. WavePci и WaveCyclic использовались с более ранними версиями Windows.

Фильтр WaveRT может представлять звуковое устройство, которое находится в системной шине, например PCI или PCI Express. Основное преимущество фильтра WaveRT по сравнению с фильтром WaveCyclic или WavePci заключается в том, что фильтр WaveRT позволяет клиенту пользовательского режима обмениваться звуковыми данными непосредственно со звуковым оборудованием. Напротив, фильтры WaveCyclic и WavePci требуют периодического программного вмешательства драйвера, что увеличивает задержку аудиопотока. Кроме того, звуковые устройства как с возможностями точечной и сборной DMA, так и без него можно представить в виде фильтров WaveRT. Дополнительные сведения см. в техническом документе A Wave Port Driver for Real-Time Audio Streaming .

Фильтры WaveRT

Фильтр WaveRT реализуется в виде пары драйверов порта и минипорта. В Windows Vista и более поздних версиях фабрика фильтров WaveRT создает фильтр WaveRT следующим образом:

  • Он создает экземпляр объекта драйвера miniport WaveRT.

  • Он создает экземпляр объекта драйвера порта WaveRT, вызывая PcNewPort со значением GUID CLSID_PortWaveRT.

  • Он вызывает метод IPort::Init драйвера порта для привязки драйвера мини-порта к драйверу порта.

Этот процесс иллюстрируется в примере кода в разделе Создание дочерних компонентов. Драйверы портов и мини-портов взаимодействуют друг с другом через интерфейсы IPortWaveRT и IMiniportWaveRT .

Дополнительные сведения см. в техническом документе A Wave Port Driver for Real-Time Audio Streaming .

Сведения о предыдущих версиях Windows

Волновая циклическая информация для предыдущих версий Windows

Фильтр WaveCyclic может представлять звуковое устройство, подключающееся к системной шине, например ISA, PCI, PCI Express или PCMCIA. Как следует из названия "WavePci", фильтр WavePci обычно представляет собой устройство, которое подключается к шине PCI, хотя, в принципе, устройство WavePci может вместо этого подключиться к шине ISA, например. В отличие от более простых устройств, поддерживаемых WaveCyclic, устройство, поддерживаемое WavePci, должно иметь возможности DMA точечной и сборной. Звуковое устройство, которое находится на шине PCI, но не имеет точечной и сборной DMA, может быть представлено как фильтр WaveCyclic, но не как фильтр WavePci.

Сведения о WavePci для предыдущих версий Windows

Устройство WavePci может выполнять передачу точечной и сборной DMA в буферы или из буферов, которые могут находиться на произвольных адресах памяти и начинаются и заканчиваются произвольными байтовыми выравниваниями. В отличие от этого, оборудование DMA для устройства WaveCyclic требует только возможности перемещения данных в один буфер или из нее, выделенный драйвером мини-порта устройства. Драйвер miniport WaveCyclic может свободно выделять циклический буфер, который соответствует ограниченным возможностям своего канала DMA. Например, для канала DMA для типичного устройства WaveCyclic может потребоваться буфер, удовлетворяющий следующим ограничениям:

  • Буфер находится в определенной области физического адресного пространства.

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

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

В обмен на такую простоту, однако, устройство WaveCyclic должно полагаться на программное копирование данных в циклический буфер или из него, в то время как устройство WavePci полагается на возможности точечной и сборной своего оборудования DMA, чтобы избежать такого копирования. IrP, которые доставляют звуковые данные волны на устройство отрисовки или извлекают данные с устройства захвата, сопровождаются буферами данных, и каждый из этих буферов содержит часть аудиопотока, который обрабатывается или захватывается. Устройство WavePci может получить доступ к этим буферам непосредственно через подсистему DMA точечной и сборной данных, тогда как устройство WaveCyclic требует копирования данных в циклический буфер из IRP или наоборот.

Фильтры WavePci

Примечание. Сведения WavePci для предыдущих версий Windows

Фильтр WavePci реализуется в виде пары драйверов порта и минипорта. Фабрика фильтров WavePci создает фильтр WavePci следующим образом:

  • Он создает экземпляр объекта драйвера miniport WavePci.

  • Он создает экземпляр объекта драйвера порта WavePci, вызывая PcNewPort со значением GUID CLSID_PortWavePci.

  • Он вызывает метод IPort::Init драйвера порта для привязки драйвера мини-порта к драйверу порта.

Этот процесс иллюстрируется в примере кода в разделе Создание дочерних компонентов. Драйверы портов и мини-портов взаимодействуют друг с другом через интерфейсы IPortWavePci и IMiniportWavePci .

Дополнительные сведения см. в разделе Проблемы реализации для устройств WavePci.

Волновой циклический фильтр

Примечание

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

Примечание. Волновая циклическая информация для предыдущих версий Windows

Фильтр WaveCyclic реализуется в виде пары драйверов порт/минипорт. Фабрика фильтров WaveCyclic создает фильтр WaveCyclic следующим образом:

  • Он создает экземпляр объекта драйвера miniport WaveCyclic.

  • Он создает экземпляр объекта драйвера порта WaveCyclic, вызывая PcNewPort со значением GUID CLSID_PortWaveCyclic.

  • Он вызывает метод IPort::Init драйвера порта для привязки драйвера мини-порта к драйверу порта.

Этот процесс иллюстрируется в примере кода в разделе Создание дочерних компонентов. Драйверы портов и мини-портов взаимодействуют друг с другом через интерфейсы IPortWaveCyclic и IMiniportWaveCyclic .

Циклический буфер фильтра WaveCyclic всегда состоит из непрерывного блока виртуальной памяти. Реализация драйвера порта метода IDmaChannel::AllocateBuffer всегда выделяет буфер, который является непрерывным как в физическом, так и в виртуальном адресном пространстве. Если, как упоминалось ранее, подсистема DMA устройства WaveCyclic накладывает дополнительные ограничения на буферную память, драйвер мини-порта может реализовать собственный метод выделения буфера для удовлетворения этих ограничений.

Драйвер miniport WaveCyclic, запрашивающий большой буфер (например, восемь физически смежных страниц памяти), должен быть подготовлен к тому, чтобы довольствоваться меньшим размером буфера, если операционная система отклоняет исходный запрос. Иногда звуковое устройство может быть выгружено и перезагружено для перераспределения системных ресурсов (см. статью Остановка устройства для перераспределения ресурсов).

Устройство WaveCyclic со встроенным оборудованием DMA для шины называется устройством master. Кроме того, устройство WaveCyclic может быть подчиненным устройством без встроенных возможностей оборудования DMA. Подчиненное устройство должно полагаться на системный контроллер DMA для выполнения всех необходимых передач данных. Дополнительные сведения о master и подчиненных устройствах см. в разделах IDmaChannel и IDmaChannelSlave.

Драйвер miniport WaveCyclic может реализовать собственный объект канала DMA вместо использования объекта DMA-канала по умолчанию, который создается одним из методов NewXxxDmaChannel драйвера порта:

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

Пользовательская реализация IDmaChannel драйвера адаптера может выполнять пользовательскую обработку данных в соответствии со специальными аппаратными ограничениями. Например, функции Windows Multimedia используют волновые форматы, в которых 16-разрядные образцы всегда являются подписанными значениями, но оборудование для отрисовки звука может быть разработано для использования 16-разрядных значений без знака. В этом случае пользовательский метод IDmaChannel::CopyTo драйвера может быть записан для преобразования подписанных исходных значений в неподписанные целевые значения, необходимые оборудованию. Хотя этот метод может быть полезен для решения недостатков проектирования оборудования, он также может нести значительные затраты на программное обеспечение.

Пример драйвера, реализующего собственный объект канала DMA, см. в примере аудиоадаптера Sb16 в более ранних версиях WDK. Если константная OVERRIDE_DMA_CHANNEL определена как ИСТИНА, операторы условной компиляции в исходном коде позволяют реализовать собственный объект IDmaChannel , который драйвер использует вместо объекта IDmaChannel по умолчанию из вызова IPortWaveCyclic::NewXxxDmaChannel.