Поделиться через


Фабрики контактов

Фабрики контактов звукового фильтра описывают все контакты, которые фильтр может создать. Как упоминалось ранее, драйвер аудио минипорта хранит сведения о закреплениях в массиве 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 . Однако во втором вызове клиент указывает, что новый контакт приемника должен быть подключен к исходному контакту, созданному в первом вызове.