Udostępnij przez


Uwidacznianie topologii filtru

Sterownik miniportu opisuje wewnętrzną topologię filtru KS pod względem wyprowadzeń, węzłów i połączeń. Ta topologia określa ścieżki przepływu danych przez filtr, a także definiuje logiczne elementy docelowe — piny i węzły — dla żądań właściwości. Topologia wewnątrzfiltru jest logiczną reprezentacją wewnętrznej struktury urządzenia sprzętowego, które stanowi część filtru. Sterownik miniportu opisuje tę topologię za pomocą statycznych tablic przetyczek, węzłów i deskryptorów połączeń.

  • Piny są określane w statycznej tablicy struktur PCPIN_DESCRIPTOR. Każdy pin ma identyfikator, który jest jego numerem porządkowym w tablicy.

  • Węzły są określane w statycznej tablicy struktur PCNODE_DESCRIPTOR. Każdy węzeł ma identyfikator, który jest jego numerem porządkowym w tablicy.

  • Połączenia (pin-to-pin, pin-to-node lub node-to-node) są ustalone w statycznej tablicy struktur PCCONNECTION_DESCRIPTOR.

Sterownik miniportu uwidacznia te trzy tablice w strukturze PCFILTER_DESCRIPTOR, która generuje dane wyjściowe z metody IMiniport::GetDescription.

przykład

Poniższy przykład kodu określa wewnętrzną topologię prostego filtra KS, który ma jeden pin wejściowy i jeden pin wyjściowy. Filtr zawiera jeden węzeł, który jest kontrolką na poziomie woluminu.

#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 }
};

Na poniższej ilustracji przedstawiono topologię filtru opisanego w poprzednim przykładowym kodzie.

Diagram ilustrujący prostą topologię filtru z jednym wyprowadzeniem wejściowym, jednym wyprowadzeniem wyjściowym i węzłem sterowania poziomem głośności.

Ten filtr jest prostym przykładem filtru topologii , który sterownik adaptera tworzy przez powiązanie swojego obiektu IMiniportTopology z obiektem IPortTopology, tworzonym przez sterownik systemu PortCls. Wyprowadzenia wejściowe (ujścia) i wyjściowe (źródłowe) filtru są nazwane KSPIN_WAVEOUT_SRC i KSPIN_SPEAKERS_DST. Oba wyprowadzenia przenoszą sygnały analogowe. Mikser API uwidacznia połączenia z tymi wyprowadzeniami jako linie miksera źródłowego i docelowego (odpowiednio MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT i MIXERLINE_COMPONENTTYPE_DST_SPEAKERS).

W poniższej tabeli przedstawiono możliwe źródło nieporozumień podczas omawiania mapowania wyprowadzeń KS na linie miksera.

Nazwa pinezki Terminologia interfejsu API miksera Terminologia filtru KS

KSPIN_WAVEOUT_SRC

Źródłowa linia miksera

Kołek zatopieniowy

KSPIN_SPEAKERS_DST

Linia miksera docelowego

Numer PIN źródła

Należy pamiętać, że KSPIN_WAVEOUT_SRC jest linią miksera źródłowego, a KSPIN_SPEAKERS_DST jest numerem PIN źródłowym. Aby uzyskać więcej informacji, zobacz omówienie terminologii KS i miksującej linii w Tłumaczenie topologii przesyłania strumieniowego jądra do interfejsu API miksera audio.

Należy również zauważyć, że nazwa "KSPIN_WAVEOUT_SRC" zawiera element "WAVEOUT" nie dlatego, że pin przenosi cyfrowe dane w formacie falowym, ale dlatego, że przenosi sygnał analogowy generowany przez filtr falowy, który jest filtrem typu WaveCyclic lub WavePci. Filtr fali reprezentuje część sprzętu karty audio, która konwertuje strumień falowy na sygnał analogowy. Pin KSPIN_SPEAKERS_DST wyprowadza sygnał analogowy, który napędza zestaw głośników.

Filtr zawiera jeden węzeł, KSNODE_WAVEOUT_VOLUME, który interfejs API miksera reprezentuje jako kontrolkę głośności (MIXERCONTROL_CONTROLTYPE_VOLUME). Typ węzła KS dla kontrolki woluminu to KSNODETYPE_VOLUME. Wszystkie węzły tego typu obsługują właściwość KSPROPERTY_AUDIO_VOLUMELEVEL, której klient filtru używa do kontrolowania poziomu woluminu.

Węzeł woluminu ma dwa "logiczne" wyprowadzenia, które są numerowane 0 i 1. Dwa połączenia określone przez tablicę MiniportConnections są reprezentowane na rysunku przez kreskowane strzałki wskazujące kierunek przepływu danych. Każde połączenie jest opisane przez jeden z dwóch elementów w tablicy.

Wyprowadzenia KSPIN_WAVEOUT_SRC i KSPIN_SPEAKERS_DST są wyprowadzeniami mostkowymi, co oznacza, że reprezentują one stałe połączenia w adapterze. W poprzednim przykładowym kodzie dwa deskryptory pinów w tablicy MiniportPins określają kierunek przepływu IRP jako KSPIN_COMMUNICATION_NONE, co jest odpowiednie, ponieważ piny mostka nie wysyłają ani nie odbierają IRP. Dwa deskryptory pinów odnoszą się również do tablicy PinDataRangePointersBridge, która jest zdefiniowana następująco:

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]
};

Tablica PinDataRangePointersBridge określa zakres danych dla kołka mostka, który przenosi analogowy sygnał dźwiękowy. Aby uzyskać więcej informacji, zajrzyj do omówienia kołków mostka w Grafy filtrów audio.

Aby zapoznać się z przykładem bardziej złożonej topologii, zobacz Filtry topologii.