Фабрики фильтров
Драйвер аудиоадаптера предоставляет фабрики фильтров для управления экземплярами фильтров. Каждая фабрика фильтров может создавать экземпляры одного или нескольких фильтров KS определенного типа. Если тип фильтра инкапсулирует определенную аппаратную функцию, количество фильтров этого типа, экземпляр которых может создать фабрика, ограничено базовыми аппаратными ресурсами.
Так как фабрика фильтров управляет в значительной степени автономным блоком аппаратных функций, каждую фабрику фильтров можно рассматривать как драйвер устройства по своему усмотрению. На самом деле термин драйвер адаптера, как он используется в предыдущем абзаце, относится к коллекции связанных драйверов — фабрик фильтров , которые упаковываются вместе для управления различными аппаратными функциями на адаптере карта.
Как и в случае с любым другим драйвером модели драйвера Microsoft Windows (WDM), фабрика фильтров обрабатывает функции управления питанием и настройки. Во время установки INF-файл для драйвера регистрирует одно или несколько имен устройств фильтра (см. раздел Строки идентификации устройства). Этот процесс загружает имена в системный реестр и связывает каждую фабрику фильтров с одной или несколькими категориями фильтров KS, как описано в разделе Установка интерфейсов устройств для аудиоадаптера. Все звуковые устройства классифицируются как KSCATEGORY_AUDIO, но звуковое устройство также может быть классифицировано по дополнительным категориям, таким как KSCATEGORY_RENDER (для устройства отрисовки звука) или KSCATEGORY_CAPTURE (для устройства захвата звука). Драйвер объявляет общие возможности устройства с помощью различных категорий, в которых он регистрирует фильтр для этого устройства. Например, если системному драйверу SysAudio требуется звуковое устройство определенного типа, он ищет в реестре устройства, которые относятся к соответствующим категориям.
Операционная система использует API установки, как описано в разделе Компоненты установки устройств, для обнаружения и перечисления всех фабрик фильтрации KSCATEGORY_AUDIO в реестре. Запись реестра для каждой фабрики указывает понятное имя фабрики фильтров и имя устройства, которое представляет собой длинную строку, которую клиент передает в вызов create-file, который создает экземпляр фильтра. Этот вызов может быть выполнен в ZwCreateFile из режима ядра или в CreateFile из пользовательского режима. Фильтр является объектом в режиме ядра и определяется дескриптором ядра. Вызов create-file возвращает дескриптор экземпляра, который клиенты могут использовать для ссылки на фильтр. Клиенты пользовательского режима или фильтры вышестоящий в звуковом графе могут использовать этот дескриптор для отправки или пересылки запросов IOCTL в фильтр. Дополнительные сведения о CreateFile см. в документации по Microsoft Windows SDK.
Типичный аудиоадаптер WDM карта может находиться в шине PCI, например, и содержать несколько соединителей ввода-вывода для отрисовки или захвата волновых данных. Одно звуковое устройство на этом карта может содержать аналоговые аудиоразъемы для управления набором динамиков и кабеля lineout, а также аналоговые аудиоразъемы для приема сигналов от микрофона и кабеля linein. Аудиосистема WDM представляет устройство в качестве фильтра, а аудиоразъемы — как контакты на этом фильтре.
Фильтр для звукового устройства реализуется в виде отдельных портов и драйверов минипорта, которые связаны друг с другом, чтобы действовать в унисон:
Драйвер мини-порта содержит код для конкретного оборудования.
Драйвер порта содержит общий код, который является общим для всех фильтров определенного типа.
Поставщик записывает драйвер мини-порта, который содержит весь собственный код, необходимый фильтру для управления звуковым оборудованием. Операционная система предоставляет драйвер порта, который доступен через системный драйвер PortCls (Portcls.sys; см. раздел Драйвер адаптера класса портов и Системный драйвер PortCls). Разделение реализации фильтра на драйверы портов и минипортов упрощает задачу написания драйвера для защищаемого устройства.
Когда фабрика фильтров создает экземпляр фильтра, она сначала создает объект драйвера miniport для фильтра. Затем фабрика фильтров создает экземпляр соответствующего объекта порта и привязывает объект драйвера miniport к данному экземпляру, чтобы сформировать полнофункциональный фильтр. Этот процесс иллюстрируется в примере кода в разделе Создание subdevice . Драйверы портов и минипортов взаимодействуют друг с другом через четко определенные программные интерфейсы. Дополнительные сведения об этих интерфейсах см. в разделах Miniport Interfaces и Поддержка устройства.
Фильтр звука предоставляет структуру базового звукового устройства в виде коллекции фабрик контактов, узлов и внутренних подключений. Драйвер мини-порта объединяет эти сведения в дескриптор фильтра, который представляет собой структуру типа PCFILTER_DESCRIPTOR. Эта структура, в свою очередь, содержит отдельные дескрипторы для фабрик контактов, узлов и внутренних подключений фильтра. Эти дескрипторы являются структурами следующих типов:
Чтобы получить дескриптор фильтра из драйвера мини-порта, драйвер порта вызывает метод IMiniport::GetDescription .
Пример настройки драйвера PCFILTER_DESCRIPTOR структуры см. в примере драйвера Sysvad, который рассматривается в разделе Примеры аудиодрайверов.