Общие сведения о классе port
Большинство драйверов оборудования для звуковых устройств на основе PCI и DMA основаны на библиотеке классов портов, доступной через системный драйвер PortCls (Portcls.sys). PortCls — это драйвер класса аудиопорта, который корпорация Майкрософт включает в состав операционной системы. PortCls предоставляет набор драйверов портов, которые реализуют большую часть функций фильтра универсальной потоковой передачи ядра (KS). Таким образом, PortCls упрощает задачу разработчика аудиодрайвов. Поставщик оборудования должен предоставить только набор драйверов минипорта для обработки аппаратных функций аудиоадаптера.
Хотя поставщики оборудования имеют возможность реализовать собственные фильтры KS для своих звуковых устройств, этот вариант является сложным и ненужным для обычных звуковых устройств. Вы можете разработать фильтр KS в соответствии с Stream.sys, драйвером класса Stream или Avstream.sys, драйвером класса AVStream. Но фильтр KS, основанный на Stream.sys, не может воспользоваться преимуществами улучшений, доступных только в AVStream. Дополнительные сведения о фильтрах KS и PortCl см. в разделе начало работы с драйверами звука WDM.
Внутренняя реализация PortCls может развиваться, чтобы использовать преимущества улучшения потоковой передачи ядра в последовательных выпусках Windows, сохраняя при этом совместимость с существующими драйверами.
PortCls реализован в системном файле Portcls.sys как драйвер экспорта (библиотека DLL в режиме ядра) и содержит следующие элементы:
Набор вспомогательных функций, которые могут вызываться драйвером адаптера.
Коллекция драйверов аудиопорта
Поставщик оборудования аудиоустройства отвечает за предоставление драйвера адаптера. Драйвер адаптера включает в себя код инициализации и управления драйверами минипорта (включая функцию DriverEntry ) и коллекцию аудиодрайверов минипорта .
Когда операционная система загружает драйвер адаптера, драйвер адаптера создает набор объектов драйвера miniport и предлагает системный драйвер PortCls создать соответствующий набор объектов драйвера портов. (Этот процесс иллюстрируется в примере кода в разделе Создание subdevice .) Эти драйверы портов обычно являются подмножеством драйверов, доступных в файле Portcls.sys. Каждый драйвер мини-порта привязывается к соответствующему драйверу порта из Portcls.sys, чтобы сформировать полный драйвер subdevice . Драйвер поддержи порта и минипорта является фильтром KS (см. раздел Аудиофильтры). Например, типичный драйвер адаптера может содержать три драйвера мини-порта: WaveRT, DMusUART и Топология (с интерфейсами IMiniportWaveRT, IMiniportDMus и IMiniportTopology ). Во время инициализации эти драйверы мини-портов привязаны к драйверам портов WaveRT, DMus и Топологии (с интерфейсами IPortWaveRT, IPortDMus и IPortTopology ), которые содержатся в файле Portcls.sys. Каждый из этих трех драйверов subdevice имеет вид фильтра KS. Три фильтра вместе предоставляют полную функциональность звукового адаптера.
Как правило, драйверы портов предоставляют большую часть функциональных возможностей для каждого класса аудиоподгруппы. Например, драйвер порта WaveRT выполняет большую часть работы, необходимой для потоковой передачи звуковых данных на звуковое устройство на основе DMA, в то время как драйвер мини-порта предоставляет сведения об устройстве, такие как адрес DMA и имя устройства.
Драйверы аудиоадаптера и мини-порта обычно написаны на microsoft C++ и широко используют COM-интерфейсы. Архитектура драйвера port-miniport способствует модульной конструкции. Модули записи драйверов miniport должны реализовывать свой драйвер как класс C++, производный от интерфейса IMiniport , который определен в файле заголовка Portcls.h. Инициализация оборудования выполняется во время загрузки драйвера — обычно в методе Init класса, производного от IMiniport (например, IMiniportWaveRT::Init). Дополнительные сведения о реализации COM аудиодрайверов минипорта см. в разделе COM в ядре.
На следующей схеме показана связь между портами и драйверами мини-портов, а также их положение в звуковом стеке.
На предыдущей схеме компонент KSEndpoint представляет собой системный файл, который предоставляется вместе с Windows Vista и более поздними версиями Windows. Этот компонент предоставляется в виде библиотеки DLL (Audiokse.dll). KSEndpoint абстрагирует конечную точку устройства в режиме ядра и предоставляет обработчику звука доступ к абстрактной конечной точке. Дополнительные сведения о звуковой подсистеме см. в статье Изучение обработчика звука Windows Vista.
Условные обозначения на предыдущей схеме показывают поля, представляющие компоненты драйвера, которые предоставляет поставщик. Обратите внимание, что верхний край каждого драйвера мини-порта взаимодействует с нижним краем каждого драйвера порта. Например, драйвер порта WaveRT предоставляет интерфейс IPortWaveRT драйверу miniport WaveRT, который предоставляет драйверу порта интерфейс IMiniportWaveRT . Эти интерфейсы иногда называют интерфейсами верхнего и нижнего краев .
Класс port и драйверы класса AVStream похожи тем, что они оба являются драйверами WDM и поддерживают архитектуру потоковой передачи ядра WDM. Однако драйверы класса портов отличаются от драйверов класса AVStream в областях многопроцессорной обработки и повторного ввода. Драйверы классов портов выполняют следующие действия:
Используйте трехуровневый подход, который объединяет драйвер класса, драйверы портов и драйверы мини-портов, предоставляемые поставщиком.
Имеют ограниченное количество звуковых функций, что позволяет драйверам минипорта работать ближе к звуковому оборудованию.
Разрешите связывание нескольких драйверов портов или мини-портов для определенного устройства. Эта функция обеспечивает улучшенную поддержку многофункциональных карточек.
Не поддерживайте внешние шины (например, USB). Все драйверы портов поддерживают устройства, размещенные на системных шинах (PCMCIA и PCI).
Терминология для описания аудиопортов WDM и драйверов мини-портов в некоторых отношениях отличается от терминов, используемых для других классов драйверов Windows. Эти различия описаны в терминологии звука WDM.
В этом разделе рассматриваются следующие темы: