Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Фильтр топологии представляет часть цепи на карточке аудиоадаптера, которая обрабатывает взаимодействие между различными потоками волны и MIDI, управляемыми на карточке. Эта схема выполняет смешивание потоков отрисовки и мультиплексирование потоков захвата.
Фильтр топологии предоставляет мостовые контакты (см. диаграммы фильтра звука), которые отображают физические подключения адаптера звука к внешним устройствам. Эти подключения обычно несут аналоговые выходные сигналы, которые управляют динамиками и аналоговыми входными сигналами с микрофонов. У штырьков моста фильтра топологии также могут быть входные и выходные аналоговые разъемы, а также цифровые входные и выходные разъемы.
В определённом смысле, термин "фильтр топологии" является неправильным. Несмотря на свое имя, фильтр топологии является только одним из нескольких типов аудиофильтров, которые предоставляют свою внутреннюю топологию или структуру. Хотя фильтр топологии содержит ключевые функции топологии, он не обязательно содержит всю топологию адаптера. Фильтры волны и MIDI имеют собственные топологии. Например, минимальный фильтр WaveCyclic или WavePci (см. фильтры волн) может предоставлять топологию, состоящую из двух контактов и либо ЦАП (цифро-аналоговый преобразователь), либо АЦП (аналогово-цифровой преобразователь), в зависимости от того, выполняет ли базовое устройство воспроизведение или захват звука.
Фильтр топологии реализуется в виде пары порт/минипорт. Фабрика фильтров топологии создает фильтр топологии следующим образом:
Он создает экземпляр объекта драйвера топологии мини-порта.
Он создает экземпляр объекта драйвера портов топологии путем вызова PcNewPort со значением GUID CLSID_PortTopology.
Он вызывает метод IPort::Init драйвера порта для привязки драйвера мини-порта к драйверу порта.
В примере кода в Subdevice Creation показан этот процесс.
Порт топологии и драйверы мини-портов взаимодействуют друг с другом с помощью соответствующих интерфейсов IPortTopology и IMiniportTopology . Эти интерфейсы относительно просты по сравнению с теми для аудио портов и портов и минипортов MIDI, так как фильтры топологии не должны явно управлять потоками, проходящими через их контакты. Штырьки фильтра топологии представляют жестко связанные подключения в аппаратуре адаптера. Физическое подключение на контакте топологического фильтра обычно передает аналоговый звуковой сигнал, но может передавать и цифровой аудиопоток в зависимости от реализации оборудования.
В отличие от интерфейсов IMiniportWaveCyclic, IMiniportWavePci, IMiniportMidi и IMiniportDMus интерфейс IMiniportTopology не имеет метода NewStream.
Большая часть функций фильтра топологии предоставляется обработчиками свойств. Фильтр топологии существует в основном для предоставления сведений о топологии системным драйверу SysAudio и приложениям, используюющим API мультимедийного микшера Microsoft Windows. Обработчики свойств в фильтре топологии предоставляют доступ к различным элементам управления (таким как громкость, эквализация и реверберация), которые обычно предлагают звуковые адаптеры. Через запросы свойств 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 в предыдущем примере кода — это идентификатор узла NULL и определен в файле заголовка Portcls.h. Описание того, как эта константа используется для различения внешних выводов на фильтре от логических выводов на узле, см. PCCONNECTION_DESCRIPTOR.
Каждое имя пин-кода в приведенном выше примере кода заканчивается как SRC, так и "DST" в зависимости от того, сопоставляет ли API-интерфейс микшировщика пин-код с строкой исходного или целевого миксера. Чтобы избежать путаницы, помните, что линии исходного и целевого миксеров сопоставляются с входом (приёмом) и выходом (источником) закреплений фильтров KS соответственно. Дополнительные сведения см. в разделе "Фильтры звука".
Массив PCCONNECTION_DESCRIPTOR в предыдущем примере кода описывает фильтр топологии на следующем рисунке.
Фильтр топологии на рисунке имеет четыре входных (приемника) контакта слева и два выходных (источника) контакта справа. Каналы передачи данных, которые соединяют два верхних входных контакта и верхний выходной контакт, объединяют два аналоговых сигнала, созданные из потоков волны и MIDI, которые воспроизводятся обратно. Пути данных, которые соединяют нижние два входных пина и нижний выходной пин, мультиплексируют аналоговые сигналы, которые записываются.
Четыре входных пина работают следующим образом:
KSPIN_TOPO_WAVEOUT_SRC пин физически соединен с выходным пином волнового фильтра, который обрабатывает поток волны из источника, например, из .wav файла, для генерации аналогового сигнала на пине.
KSPIN_TOPO_SYNTHOUT_SRC контакт физически подключен к выходному контакту фильтра синтезатора, который может обрабатывать, например, поток MIDI из источника, такого как .mid файл, для преобразования в аналоговый сигнал на контакте.
Контакт KSPIN_TOPO_SYNTHIN_SRC подключён к синтезатору, который генерирует аналоговый сигнал. (Обратите внимание, что более практичный аппаратный дизайн может получать поток ввода MIDI из интерфейса MIDI MPU-401 и преобразовать его непосредственно в волну, полностью обходя фильтр топологии.)
Контакт KSPIN_TOPO_MIC_SRC физически подключен к входному разъему, который принимает аналоговый сигнал от микрофона.
Два выходных контакта работают так:
KSPIN_TOPO_LINEOUT_DST штырь физически подключен к аналоговому выходному разъему, который обычно используется для подключения набора динамиков.
KSPIN_TOPO_WAVEIN_DST контакт физически подключен к входному контакту волнового фильтра, который преобразует аналоговый сигнал в поток и записывает его на конечное устройство, например, в файл .wav.
Узлы громкости и отключения звука (см. KSNODETYPE_VOLUME и KSNODETYPE_MUTE) используются для управления уровнями громкости различных потоков. Узел SUM (см. KSNODETYPE_SUM) смешивает аудиопотоки из входов для волны и MIDI. Узел MUX (см. KSNODETYPE_MUX) выбирает между двумя входными потоками.
На рисунке для указания соединения между двумя узлами или между контактом и узлом используется пунктирная стрелка. Стрелка указывает направление потока данных. На схеме показаны 13 подключений, каждый из которых соответствует одному из 13 элементов в массиве PCCONNECTION_DESCRIPTOR в предыдущем примере кода.
Помимо фильтра топологии, драйвер адаптера создает другие фильтры: волновой, FM-синтезатор, волновую таблицу и т. д., которые подключаются к выводам в фильтре топологии.
Например, фильтр волн, физически подключенный к выводу KSPIN_TOPO_WAVEOUT_SRC фильтра топологии, содержит ЦАП (представленный узлом KSNODETYPE_DAC), который преобразует данные PCM в аналоговый сигнал, выводимый на вывод фильтра топологии. FM-синтезатор или синтезатор на волновых таблицах, физически подключенный к KSPIN_TOPO_SYNTHOUT_SRC фильтра топологии, аналогично преобразует данные MIDI в аналоговый сигнал, который он выводит на штырь фильтра топологии. Топологический фильтр смешивает аналоговые сигналы от этих двух контактов и выводит смешанный сигнал на динамики.
Физические подключения фильтра топологии к другим фильтрам, представляющим другие аппаратные устройства на той же карточке адаптера, должны отличаться от других типов подключений к фильтрам. Например, некоторые контакты в фильтрах Wave, MIDI и DirectMusic могут быть подключены или отключены под управлением программного обеспечения.
Во время запуска устройства драйвер адаптера регистрирует физические подключения фильтра топологии путем вызова PcRegisterPhysicalConnection один раз на подключение. Драйвер порта нуждается в этой информации, чтобы реагировать на запросы типа get-property KSPROPERTY_PIN_PHYSICALCONNECTION.