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


Предоставление топологии фильтра

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

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