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