Раскрытие топологии фильтра

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

Пример более сложной топологии см. в разделе "Фильтры топологии".