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


Фильтры топологии

Фильтр топологии представляет часть цепи на звуковом адаптере карта, которая обрабатывает взаимодействия между различными волновым и MIDI-потоками, управляемыми на карта. Эта схема выполняет смешивание потоков отрисовки и мультиплексирование потоков захвата.

Фильтр топологии предоставляет контакты моста (см. раздел Графы фильтра аудио), которые представляют физические подключения аудиоадаптера к внешним устройствам. Эти подключения обычно несут аналоговые выходные сигналы, которые управляют динамиками и аналоговыми входными сигналами с микрофонов. Мостовые контакты фильтра топологии могут также представлять аналоговые разъемы linein и lineout и, возможно, даже цифровые входные и выходные соединители.

Термин "фильтр топологии" в каком-то смысле является неправильным. Несмотря на свое название, фильтр топологии является лишь одним из нескольких типов аудиофильтров, которые предоставляют их внутреннюю топологию или макет. Хотя фильтр топологии содержит ключевые топологические функции, он не обязательно содержит всю топологию адаптера. Волновой и MIDI-фильтры имеют собственные топологии. Например, минимальный фильтр WaveCyclic или WavePci (см. раздел Фильтры волны) может предоставлять топологию, состоящую из двух контактов и DAC (цифровой преобразователь на аналоговый) или ADC (аналого-цифровой преобразователь) в зависимости от того, выполняет ли базовое устройство отрисовку или запись звука.

Фильтр топологии реализуется в виде пары порт/минипорт. Фабрика фильтров топологии создает фильтр топологии следующим образом:

  • Он создает экземпляр объекта драйвера мини-порта топологии.

  • Он создает экземпляр объекта драйвера порта топологии, вызывая PcNewPort со значением GUID CLSID_PortTopology.

  • Он вызывает метод IPort::Init драйвера порта для привязки драйвера мини-порта к драйверу порта.

Этот процесс иллюстрируется в примере кода в разделе Создание дочерних компонентов.

Порт топологии и драйверы мини-порта взаимодействуют друг с другом через соответствующие интерфейсы IPortTopology и IMiniportTopology . Эти интерфейсы относительно просты по сравнению с интерфейсами для драйверов волнового и MIDI-портов и мини-портов, так как фильтрам топологии не нужно явно управлять потоками, проходящими через их контакты. Контакты фильтра топологии представляют собой жесткие подключения в оборудовании адаптера. Физическое соединение, лежащее в основе контакта фильтра топологии, обычно несет аналоговый звуковой сигнал, но может нести цифровой аудиопоток в зависимости от реализации оборудования.

В отличие от интерфейсов IMiniportWaveCyclic, IMiniportWavePci, IMiniportMidi и IMiniportDMus , интерфейс IMiniportTopology не имеет метода NewStream .

Большая часть функциональных возможностей фильтра топологии обеспечивается обработчиками его свойств. Фильтр топологии в основном предназначен для предоставления сведений о топологии системного драйвера SysAudio и приложений, использующих API микшера Microsoft Windows Multimedia. Обработчики свойств в фильтре топологии предоставляют доступ к различным элементам управления (таким как громкость, выравнивание и реверберации), которые обычно предлагают аудиоадаптеры. С помощью запросов свойств API микшера может перечислять узлы управления в оборудовании адаптера, обнаруживать подключения между узлами, а также запрашивать и задавать параметры управления узлов. Приложение SndVol32 (см. SysTray и SndVol32) использует API-интерфейс микшера для обнаружения отдельных потокового тома адаптера и элементов управления отключением звука.

При создании графа фильтра SysAudio запрашивает фильтр топологии для свойств KSPROPERTY_PIN_PHYSICALCONNECTION на своих контактах, чтобы определить, какой волновой, MIDI или DirectMusic фильтр контакт подключен к какой закрепления фильтра топологии.

В отличие от фильтра волны, MIDI или DirectMusic фильтр топологии не создает экземпляры контактов. Таким образом, для обработки запросов свойств закрепления фильтра топологии недоступны объекты закрепления. Фильтр топологии сам обрабатывает все запросы, касающиеся физических подключений на своих контактах. Дополнительные сведения см. в разделе KSPROPSETID_Pin.

Как и другие типы звуковых фильтров, фильтр топологии использует массив PCCONNECTION_DESCRIPTOR структур для описания внутренней топологии. Драйвер мини-порта предоставляет этот массив в PCFILTER_DESCRIPTOR структуре, которую он выводит из метода IMiniport::GetDescription . Массив задает топологию в виде списка соединений между узлами и контактами фильтра топологии (см. раздел Узлы и подключения). Системный драйвер WDMAud преобразует эти подключения и узлы в линии микшера и элементы управления, которые API микшера предоставляет приложениям. Как описано в разделе Аудиофильтры, входной контакт на фильтре KS сопоставляется с линией микшера SRC, а выходной контакт на фильтре сопоставляется с линией микшера DST.

Типичный аудиоадаптер может воспроизводить волны и MIDI-файлы через динамик, а также может захватывать звуковые сигналы с микрофона и синтезатора MIDI. Приведенный ниже пример кода содержит массив PCCONNECTION_DESCRIPTOR для фильтра топологии, который предоставляет следующие возможности:

    // topology pins
    enum
    {
        KSPIN_TOPO_WAVEOUT_SRC = 0,
        KSPIN_TOPO_SYNTHOUT_SRC,
        KSPIN_TOPO_SYNTHIN_SRC,
        KSPIN_TOPO_MIC_SRC,
        KSPIN_TOPO_LINEOUT_DST,
        KSPIN_TOPO_WAVEIN_DST
    };
 
    // topology nodes
    enum
    {
        KSNODE_TOPO_WAVEOUT_VOLUME = 0,
        KSNODE_TOPO_WAVEOUT_MUTE,
        KSNODE_TOPO_SYNTHOUT_VOLUME,
        KSNODE_TOPO_SYNTHOUT_MUTE,
        KSNODE_TOPO_MIC_VOLUME,
        KSNODE_TOPO_SYNTHIN_VOLUME,
        KSNODE_TOPO_LINEOUT_MIX,
        KSNODE_TOPO_LINEOUT_VOLUME,
        KSNODE_TOPO_WAVEIN_MUX
    };
 
    static PCCONNECTION_DESCRIPTOR MiniportConnections[] =
    {
       // FromNode---------------------FromPin------------------ToNode-----------------------ToPin
 
        { PCFILTER_NODE,               KSPIN_TOPO_WAVEOUT_SRC,  KSNODE_TOPO_WAVEOUT_VOLUME,  1 },
        { KSNODE_TOPO_WAVEOUT_VOLUME,  0,                       KSNODE_TOPO_WAVEOUT_MUTE,    1 },
        { KSNODE_TOPO_WAVEOUT_MUTE,    0,                       KSNODE_TOPO_LINEOUT_MIX,     1 },
 
        { PCFILTER_NODE,               KSPIN_TOPO_SYNTHOUT_SRC, KSNODE_TOPO_SYNTHOUT_VOLUME, 1 },
        { KSNODE_TOPO_SYNTHOUT_VOLUME, 0,                       KSNODE_TOPO_SYNTHOUT_MUTE,   1 },
        { KSNODE_TOPO_SYNTHOUT_MUTE,   0,                       KSNODE_TOPO_LINEOUT_MIX,     2 },
 
        { PCFILTER_NODE,               KSPIN_TOPO_SYNTHIN_SRC,  KSNODE_TOPO_SYNTHIN_VOLUME,  1 },
        { KSNODE_TOPO_SYNTHIN_VOLUME,  0,                       KSNODE_TOPO_WAVEIN_MUX,      1 },
 
        { PCFILTER_NODE,               KSPIN_TOPO_MIC_SRC,      KSNODE_TOPO_MIC_VOLUME,      1 },
        { KSNODE_TOPO_MIC_VOLUME,      0,                       KSNODE_TOPO_WAVEIN_MUX,      2 },
 
        { KSNODE_TOPO_LINEOUT_MIX,     0,                       KSNODE_TOPO_LINEOUT_VOLUME,  1 },
        { KSNODE_TOPO_LINEOUT_VOLUME,  0,                 PCFILTER_NODE,  KSPIN_TOPO_LINEOUT_DST },
 
        { KSNODE_TOPO_WAVEIN_MUX,      0,                 PCFILTER_NODE,  KSPIN_TOPO_WAVEIN_DST }
    };

Константная PCFILTER_NODE в предыдущем примере кода является пустым идентификатором узла и определена в файле заголовка Portcls.h. Описание того, как эта константа используется для отличия внешних контактов на фильтре от логических контактов на узле, см. в разделе PCCONNECTION_DESCRIPTOR.

Каждое имя контакта в предыдущем примере кода заканчивается на "SRC" или "DST" в зависимости от того, сопоставляет ли API-интерфейс микшера контакт с исходной или конечной строкой микшера. Чтобы избежать путаницы, помните, что исходные и целевые линии микшера сопоставляются с приемником (входными) и исходными (выходными) фильтрами KS соответственно. Дополнительные сведения см. в разделе Аудиофильтры.

На следующем рисунке приведено описание фильтра топологии в массиве PCCONNECTION_DESCRIPTOR в предыдущем примере кода.

Схема, иллюстрирующая подключения фильтров топологии, описанные в массиве PCCONNECTION_DESCRIPTOR.

Фильтр топологии на рисунке имеет четыре контакта ввода (приемника) слева и два выходных (исходных) контакта справа. Пути к данным, соединяющие два верхних входных и верхних выходных контактов, объединяют два аналоговых сигнала, которые были отрисованы из потоков волны и MIDI, которые воспроизводится. Пути к данным, соединяющие два нижних входных контакта и нижний выходной контакт мультиплексируемых аналоговых сигналов, которые записываются.

Четыре входных контакта работают следующим образом:

  • Контакт KSPIN_TOPO_WAVEOUT_SRC физически подключен к выходному контакту волнового фильтра, который отрисовывает поток волны из источника, такого как WAV-файл, для получения аналогового сигнала на контакте.

  • Контакт KSPIN_TOPO_SYNTHOUT_SRC физически подключен к выходному контакту фильтра синтезатора, который может отображать, например, поток MIDI из источника, например MIDI-файла, для получения аналогового сигнала в контакте.

  • Контакт KSPIN_TOPO_SYNTHIN_SRC физически подключен к синтезатору, который создает аналоговый сигнал. (Обратите внимание, что более практичное оборудование может принимать входной поток MIDI из интерфейса MPU-401 MIDI и преобразовывать его непосредственно в формат волн, минуя фильтр топологии в целом.)

  • Контакт KSPIN_TOPO_MIC_SRC физически подключен к входной разъему, который принимает аналоговый сигнал с микрофона.

Два выходных контакта работают следующим образом:

  • Контакт KSPIN_TOPO_LINEOUT_DST физически подключен к аналоговым разъемам lineout, который обычно управляет набором динамиков.

  • Контакт KSPIN_TOPO_WAVEIN_DST физически подключен к входной точке волнового фильтра, который преобразует аналоговый сигнал в поток волн и записывает его в место назначения, например WAV-файл.

Узлы тома и отключения звука (см . KSNODETYPE_VOLUME и KSNODETYPE_MUTE) используются для управления уровнями громкости различных потоков. Узел СУММ (см . KSNODETYPE_SUM) смешивает звуковые потоки из волны и MIDI-входов. Узел MUX (см . KSNODETYPE_MUX) выбирает между двумя входными потоками.

На рисунке используется пунктирная стрелка для обозначения соединения между двумя узлами или между контактом и узлом. Стрелка указывает на направление потока данных. На схеме показаны в общей сложности 13 подключений, каждое из которых соответствует одному из 13 элементов в массиве PCCONNECTION_DESCRIPTOR в предыдущем примере кода.

В дополнение к фильтру топологии драйвер адаптера создает другие фильтры — волны, синтезатор FM, волновую таблицу и т. д., которые подключаются к контактам в фильтре топологии.

Например, волновой фильтр, физически подключенный к контакту KSPIN_TOPO_WAVEOUT_SRC фильтра топологии, содержит DAC (представленный узлом KSNODETYPE_DAC ), который преобразует данные PCM в аналоговый сигнал, который он выводит в контакт фильтра топологии. FM-синтезатор или волновой фильтр синтезатора, физически подключенный к KSPIN_TOPO_SYNTHOUT_SRC закреплению фильтра топологии, аналогичным образом преобразует данные MIDI в аналоговый сигнал, который он выводит в закрепление фильтра топологии. Фильтр топологии смешивает аналоговые сигналы от этих двух контактов и выводит смешанный сигнал в динамики.

Физические подключения фильтра топологии к другим фильтрам, представляющим другие аппаратные устройства на том же адаптере, карта должны отличаться от других типов подключений к фильтрам. Например, некоторые контакты на фильтрах Wave, MIDI и DirectMusic могут быть подключены или отключены под управлением программного обеспечения.

Во время запуска устройства драйвер адаптера регистрирует физические подключения фильтра топологии, вызывая PcRegisterPhysicalConnection один раз для каждого подключения. Драйверу порта нужны эти сведения, чтобы отвечать на запросы get-property KSPROPERTY_PIN_PHYSICALCONNECTION .