Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Минипорт-драйвер описывает внутреннюю топологию фильтра 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 и микшера в топологии потоковой передачи ядра в перевод 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 определяет диапазон данных для штыря моста, передающего аналоговый звуковой сигнал. Для получения дополнительной информации см. обсуждение штифтов моста в графах аудиофильтров.
Пример более сложной топологии см. в разделе "Фильтры топологии".