Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Волновые фильтры представляют собой устройства, обрабатывающие и/или захватывающие цифровые аудиоданные в формате волны. Приложения обычно получают доступ к возможностям этих устройств через API DirectSound или через функции Microsoft Windows мультимедиаwaveOut Xxx и 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. Дополнительные сведения см. в техническом документе "Драйвер порта волны" для Real-Time технической документации по потоковой передаче звука.
Фильтры WaveRT
Фильтр WaveRT реализуется в виде пары драйверов: портового и минипортового. В Windows Vista и более поздних версиях фабрика фильтров WaveRT создает фильтр WaveRT следующим образом:
Он создает экземпляр объекта драйвера минипорта WaveRT.
Он создает экземпляр объекта драйвера портов WaveRT путем вызова PcNewPort со значением GUID CLSID_PortWaveRT.
Он вызывает метод IPort::Init драйвера порта для привязки драйвера мини-порта к драйверу порта.
В примере кода в Subdevice Creation показан этот процесс. Драйверы портов и мини-портов взаимодействуют друг с другом через интерфейсы IPortWaveRT и IMiniportWaveRT .
Дополнительные сведения см. в техническом документе "Драйвер порта волны" для Real-Time технической документации по потоковой передаче звука.
Сведения о предыдущих версиях Windows
Информация о WaveCyclic для предыдущих версий 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 требует только возможности перемещать данные в или из единственного буфера, выделяемого мини-драйвером устройства. Драйвер минипорта 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 драйвера порта для привязки драйвера мини-порта к драйверу порта.
В примере кода в Subdevice Creation показан этот процесс. Драйверы портов и мини-портов взаимодействуют друг с другом через интерфейсы IPortWavePci и IMiniportWavePci .
Дополнительные сведения см. в разделе "Проблемы реализации для устройств WavePci".
WaveCyclic фильтры
Замечание
Корпорация Майкрософт поддерживает разнообразную и инклюзивное окружение. В этой статье содержатся ссылки на терминологию, которую руководство по стилю Майкрософт для обмена данными без предвзятости распознает как исключение. Слово или фраза в этой статье используется для согласованности, так как она в настоящее время отображается в программном обеспечении. При обновлении программного обеспечения для удаления языка эта статья будет обновлена для выравнивания.
Примечание: информация о WaveCyclic для предыдущих версий Windows
Фильтр WaveCyclic реализуется как пара драйверов порта и минипорта. Фабрика фильтров WaveCyclic создает фильтр WaveCyclic следующим образом:
Он создает экземпляр объекта драйвера Miniport WaveCyclic.
Он создает экземпляр объекта драйвера порта WaveCyclic, вызывая PcNewPort со значением GUID CLSID_PortWaveCyclic.
Он вызывает метод IPort::Init драйвера порта для привязки драйвера мини-порта к драйверу порта.
В примере кода в Subdevice Creation показан этот процесс. Драйверы портов и минипортов взаимодействуют друг с другом через интерфейсы IPortWaveCyclic и IMiniportWaveCyclic .
Циклический буфер фильтра WaveCyclic всегда состоит из непрерывного блока виртуальной памяти. Реализация метода IDmaChannel::AllocateBuffer всегда выделяет буфер, который является смежным в адресном пространстве физической и виртуальной памяти. Если, как уже упоминалось ранее, подсистема DMA устройства WaveCyclic накладывает дополнительные ограничения на буферную память, минипорт-драйвер может реализовать собственный метод выделения буферов для удовлетворения этих ограничений.
Драйвер минипорта WaveCyclic, запрашивающий большой буфер (например, восемь физически смежных страниц памяти), должен быть готов указать меньший размер буфера, если операционная система отрицает исходный запрос. Звуковое устройство иногда может быть выгружено и перезагружено для перебалансировать системные ресурсы (см. статью "Остановка устройств для перебалансовки ресурсов").
Устройство WaveCyclic со встроенным оборудованием DMA для шины называется ведущим устройством. Кроме того, устройство WaveCyclic может быть подчиненным устройством без встроенных возможностей DMA-оборудования. Подчиненное устройство должно полагаться на системный контроллер DMA для выполнения всех необходимых передач данных. Дополнительные сведения о главных и подчиненных устройствах см. в разделе IDmaChannel и IDmaChannelSlave.
Минипорт-драйвер WaveCyclic может реализовать собственный объект DMA-канала вместо использования объекта DMA-канала по умолчанию, который создается одним из методов порт-драйвера NewXxxDmaChannel.
IPortWaveCyclic::NewMasterDmaChannel
IPortWaveCyclic::NewSlaveDmaChannel
Пользовательская реализация IDmaChannel драйвера адаптера может выполнять настраиваемую обработку данных в соответствии с особыми ограничениями оборудования. Например, функции Windows Multimedia используют волновые форматы, в которых 16-разрядные образцы всегда являются подписанными значениями, но аудиоаппаратура может быть предназначена для работы с 16-разрядными значениями без знака. В этом случае пользовательский метод IDmaChannel::CopyTo драйвера можно записать для преобразования подписанных исходных значений в неподписанные конечные значения, необходимые оборудованию. Хотя этот метод может быть полезным для работы над недостатками аппаратного проектирования, он также может повлечь за собой значительные затраты на программное обеспечение.
Пример драйвера, реализующего собственный объект канала DMA, см. в примере аудиоадаптера Sb16 в более ранних версиях WDK. Если константа OVERRIDE_DMA_CHANNEL определена как TRUE, операторы условной компиляции в исходном коде позволяют реализовать собственный объект IDmaChannel, который драйвер использует вместо объекта IDmaChannel по умолчанию из вызова IPortWaveCyclic::NewXxxDmaChannel.