Предоставление топологии фильтра
Драйвер мини-порта описывает внутреннюю топологию фильтра KS с точки зрения контактов, узлов и подключений. Эта топология задает пути потока данных через фильтр, а также определяет логические целевые объекты (контакты и узлы) для запросов свойств. Топология внутри фильтра представляет собой логическое представление внутренней структуры аппаратного устройства, лежащего в основе фильтра. Драйвер мини-порта описывает эту топологию со статическими массивами дескрипторов контактов, узлов и подключений.
Контакты указываются в статическом массиве PCPIN_DESCRIPTOR структур. Каждый контакт имеет идентификатор, который является порядком в массиве.
Узлы указываются в статическом массиве PCNODE_DESCRIPTOR структур. Каждый узел имеет идентификатор, который является порядком в массиве.
Подключения (pin-to-pin, pin-to-node или node-to-node) указываются в статическом массиве PCCONNECTION_DESCRIPTOR структур.
Драйвер мини-порта предоставляет эти три массива в PCFILTER_DESCRIPTOR структуре, которую он выводит из метода IMiniport::GetDescription .
Примере
В следующем примере кода задается внутренняя топология простого фильтра KS, который имеет один входной и один выходной контакт. Фильтр содержит один узел, который является элементом управления на уровне тома.
#define KSPIN_WAVEOUT_SRC 0
#define KSPIN_SPEAKERS_DST 1
PCPIN_DESCRIPTOR
MiniportPins[] =
{
{ // Pin 0 -- KSPIN_WAVEOUT_SRC
0,0,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersBridge), // DataRangesCount
PinDataRangePointersBridge, // DataRanges
KSPIN_DATAFLOW_IN, // DataFlow
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_LEGACY_AUDIO_CONNECTOR, // Category
NULL, // Name
0 // Reserved
}
},
{ // Pin 1 -- KSPIN_SPEAKERS_DST
0,0,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersBridge), // DataRangesCount
PinDataRangePointersBridge, // DataRanges
KSPIN_DATAFLOW_OUT, // DataFlow
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_SPEAKER, // Category
&KSAUDFNAME_VOLUME_CONTROL, // Name (This name shows up as the
// playback panel name in SndVol32)
0 // Reserved
}
}
};
#define KSNODE_WAVEOUT_VOLUME 0
PCNODE_DESCRIPTOR TopologyNodes[] =
{
{ // KSNODE_WAVEOUT_VOLUME
0, // Flags
&AutomationVolume, // AutomationTable
&KSNODETYPE_VOLUME, // Type
&KSAUDFNAME_WAVE_VOLUME // Name
}
};
PCCONNECTION_DESCRIPTOR MiniportConnections[] =
{ //FromNode---------------FromPin------------ToNode-----------------ToPin
{ PCFILTER_NODE, KSPIN_WAVEOUT_SRC, KSNODE_WAVEOUT_VOLUME, 1 },
{ KSNODE_WAVEOUT_VOLUME, 0, PCFILTER_NODE, KSPIN_SPEAKERS_DST }
};
На следующем рисунке показана топология фильтра, описанная в предыдущем примере кода.
Этот фильтр является простым примером фильтра топологии, который драйвер адаптера формирует путем привязки своего объекта IMiniportTopology к объекту IPortTopology , создаваемому системным драйвером PortCls. Контакты входных (приемников) и выходных данных (источника) фильтра называются KSPIN_WAVEOUT_SRC и KSPIN_SPEAKERS_DST. Оба контакта несут аналоговые сигналы. API микшера предоставляет подключения к этим контактам в качестве исходных и целевых линий микшера (MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT и MIXERLINE_COMPONENTTYPE_DST_SPEAKERS) соответственно.
В следующей таблице показан потенциальный источник путаницы при обсуждении сопоставления контактов KS с линиями микшера.
Имя закрепления | Терминология API Mixer | Терминология фильтра KS |
---|---|---|
KSPIN_WAVEOUT_SRC |
Линия исходного микшера |
Контакт приемника |
KSPIN_SPEAKERS_DST |
Целевая линия микшера |
Закрепление источника |
Обратите внимание, что KSPIN_WAVEOUT_SRC является линией исходного микшера, а KSPIN_SPEAKERS_DST — исходным маркером. Дополнительные сведения см. в обсуждении терминологии KS и mixer-line в разделе Топология потоковой передачи ядра в преобразование API аудиомикшера.
Также обратите внимание, что имя "KSPIN_WAVEOUT_SRC" содержит "WAVEOUT" не потому, что контакт содержит цифровые данные в волновом формате, а потому, что он несет аналоговый сигнал, создаваемый фильтром волн, который является фильтром типа WaveCyclic или WavePci. Фильтр волн представляет часть оборудования звукового адаптера, которая преобразует поток волн в аналоговый сигнал. Закрепление KSPIN_SPEAKERS_DST выводит аналоговый сигнал, который управляет набором динамиков.
Фильтр содержит один узел, KSNODE_WAVEOUT_VOLUME, который API-интерфейс микшера представляет как элемент управления громкости (MIXERCONTROL_CONTROLTYPE_VOLUME). Тип узла KS для элемента управления громкости — KSNODETYPE_VOLUME. Все узлы этого типа поддерживают свойство KSPROPERTY_AUDIO_VOLUMELEVEL , которое клиент фильтра использует для управления уровнем громкости.
Узел тома имеет два "логических" контакта, которые нумерованы 0 и 1. Два соединения, указанные массивом MiniportConnections, представлены на рисунке пунктирными стрелками, указывающими на направление потока данных. Каждое соединение описывается одним из двух элементов в массиве.
Контакты KSPIN_WAVEOUT_SRC и KSPIN_SPEAKERS_DST являются мостиками. Это означает, что они представляют собой жесткие подключения в адаптере. В предыдущем примере кода два дескриптора контактов в массиве MiniportPins указывают направление потока IRP как KSPIN_COMMUNICATION_NONE, что уместно, так как контакты моста не отправляют и не получают irP. Эти два дескриптора также ссылаются на массив PinDataRangePointersBridge, который определяется следующим образом:
static KSDATARANGE PinDataRangesBridge[] =
{
{
sizeof(KSDATARANGE),
0, 0, 0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
}
};
static PKSDATARANGE PinDataRangePointersBridge[] =
{
&PinDataRangesBridge[0]
};
Массив PinDataRangePointersBridge определяет диапазон данных для контакта моста, который несет аналоговый звуковой сигнал. Дополнительные сведения см. в описании контактов моста в графах фильтра аудио.
Пример более сложной топологии см. в разделе Фильтры топологии.