Фабрики контактов
Фабрики контактов звукового фильтра описывают все контакты, которые фильтр может создать. Как упоминалось ранее, драйвер аудио минипорта хранит сведения о закреплениях в массиве PCPIN_DESCRIPTOR структур. Каждая структура определяет фабрику контактов, а фабрика контактов определяется ее индексом в массиве. Этот индекс часто называют идентификатором закрепления.
Структура PCPIN_DESCRIPTOR содержит таблицу автоматизации и структуру KSPIN_DESCRIPTOR .
Структура KSPIN_DESCRIPTOR содержит следующие сведения о контактах в фабрике контактов:
Относительное направление потока данных относительно фильтра
Относительное направление потока обмена данными относительно фильтра (во всех текущих версиях Windows фильтры KS используют irP для связи.)
Категория закрепления
Понятное имя
Возможности экземпляра
Возможности форматирования данных
Члены структуры Category и Name указывают категорию контактов и понятное имя фабрики контактов. Для каждой фабрики контактов в фильтре драйвер мини-порта задает сочетание идентификаторов GUID Category и Name , которые вместе однозначно идентифицируют фабрику контактов. Если две или более фабрики контактов используют одно и то же значение Категории , каждая фабрика контактов имеет значение Name , которое отличает его от других. Если только одна фабрика контактов имеет определенное значение Категории , этого значения достаточно для идентификации фабрики контактов, а для параметра Name этой фабрики контактов можно задать значение NULL. Пример кода см. в разделе Предоставление топологии фильтра. Сведения о категориях закрепления см. в разделе Свойство категории закрепления.
Фабрика контактов задает диапазон поддерживаемых форматов данных в виде массива расширенных структур KSDATARANGE :
Фабрика контактов, которая поддерживает диапазон форматов данных волны или DirectSound для входного или выходного потока, задает массив KSDATARANGE_AUDIO структур.
Фабрика контактов, поддерживающая диапазон форматов данных MIDI или DirectMusic для входного или выходного потока, задает массив KSDATARANGE_MUSIC структур.
KSDATARANGE_AUDIO и KSDATARANGE_MUSIC являются расширенными версиями KSDATARANGE. Примеры обоих типов диапазонов данных см. в разделах Форматы аудиоданных и Диапазоны данных.
Перед подключением контакта приемника на одном фильтре к источнику в другом фильтре построитель графов (например, системный драйвер SysAudio) может искать совместимый формат в диапазонах данных. Построитель графов обычно вызывает обработчик пересечения данных фильтра, который позволяет фильтру выбрать совместимый формат.
Фильтр может иметь несколько фабрик контактов, а фабрика контактов может поддерживать несколько экземпляров контактов.
Наличие нескольких фабрик контактов в фильтре полезно для различения отдельных путей к данным для различных типов данных, проходящих через фильтр. Например, одна фабрика контактов может поддерживать потоки данных PCM, а другая — потоки AC-3.
Один фильтр может одновременно поддерживать отрисовку и запись потоков. Пути отрисовки и записи имеют отдельные наборы фабрик фильтров.
Наличие нескольких экземпляров контактов на фабрике контактов приемника часто подразумевает смешивание. В этом случае фильтр содержит узел SUM (KSNODETYPE_SUM).
Как и фильтры, контакты являются объектами ядра и идентифицируются дескрипторами ядра. Дескриптор экземпляра закрепления создается путем вызова KsCreatePin. В качестве объекта ядра можно указать контакт в качестве целевого объекта IRP. Клиент драйвера указывает дескриптор закрепления при отправке запроса IOCTL к закреплению.
При создании графа фильтра звука SysAudio связывает один фильтр с другим, подключая свои контакты. Исходный контакт из одного фильтра можно подключить к контакту приемника другого фильтра. Данные и irP из исходного контакта передаются в контакт приемника через это подключение. Чтобы установить подключение, построитель графов (обычно SysAudio) сначала создает исходный контакт, вызывая KsCreatePin , а затем создает контакт приемника, снова вызвав KsCreatePin . Однако во втором вызове клиент указывает, что новый контакт приемника должен быть подключен к исходному контакту, созданному в первом вызове.