다음을 통해 공유


필터 토폴로지 노출

미니포트 드라이버는 핀, 노드 및 연결 측면에서 KS 필터의 내부 토폴로지를 설명합니다. 이 토폴로지 필터를 통해 데이터 흐름 경로를 지정하고 속성 요청에 대한 논리적 대상(핀 및 노드)도 정의합니다. 필터 내 토폴로지는 필터의 기반이 되는 하드웨어 디바이스의 내부 구조를 논리적으로 표현한 것입니다. 미니포트 드라이버는 핀, 노드 및 연결 설명자의 정적 배열을 사용하여 이 토폴로지를 설명합니다.

  • 핀은 PCPIN_DESCRIPTOR 구조체의 정적 배열에 지정됩니다. 각 핀에는 배열의 서수인 ID가 있습니다.

  • 노드는 PCNODE_DESCRIPTOR 구조체의 정적 배열에 지정됩니다. 각 노드에는 배열의 서수인 ID가 있습니다.

  • 연결(핀-핀, 노드 간 또는 노드 간)은 PCCONNECTION_DESCRIPTOR 구조의 정적 배열에 지정됩니다.

미니포트 드라이버는 IMiniport::GetDescription 메서드에서 출력하는 PCFILTER_DESCRIPTOR 구조에서 이러한 세 배열을 노출합니다.

예제

다음 코드 예제에서는 입력 핀 1개와 출력 핀 1개를 포함하는 간단한 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 개체를 PortCls 시스템 드라이버가 만드는 IPortTopology 개체에 바인딩하여 어댑터 드라이버가 형성하는 토폴로지 필터의 간단한 예입니다. 필터의 입력(싱크) 및 출력(원본) 핀의 이름은 KSPIN_WAVEOUT_SRC KSPIN_SPEAKERS_DST. 두 핀 모두 아날로그 신호를 전달합니다. 믹서 API는 이러한 핀에 대한 연결을 각각 원본 및 대상 믹서 라인(MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT 및 MIXERLINE_COMPONENTTYPE_DST_SPEAKERS)으로 노출합니다.

다음 표에서는 KS 핀을 믹서 라인에 매핑하는 방법을 설명할 때 발생할 수 있는 혼동의 원인을 보여 줍니다.

고정 이름 Mixer API 용어 KS 필터 용어

KSPIN_WAVEOUT_SRC

소스 믹서 선

싱크 핀

KSPIN_SPEAKERS_DST

대상 믹서 선

원본 핀

KSPIN_WAVEOUT_SRC 소스 믹서 선이며 KSPIN_SPEAKERS_DST 원본 핀입니다. 자세한 내용은 커널 스트리밍 토폴로지에서 오디오 믹서 API 변환으로 KS 및 믹서 라인 용어에 대한 설명을 참조하세요.

또한 "KSPIN_WAVEOUT_SRC"라는 이름은 핀이 웨이브 형식의 디지털 데이터를 전달하기 때문이 아니라 WaveCyclic 또는 WavePci 형식의 필터인 웨이브 필터에 의해 생성된 아날로그 신호를 전달하기 때문에 "WAVEOUT"을 포함합니다. 웨이브 필터는 웨이브 스트림을 아날로그 신호로 변환하는 오디오 어댑터 하드웨어의 부분을 나타냅니다. 핀 KSPIN_SPEAKERS_DST 스피커 세트를 구동하는 아날로그 신호를 출력합니다.

필터에는 믹서 API가 볼륨 제어(MIXERCONTROL_CONTROLTYPE_VOLUME)로 나타내는 단일 노드 KSNODE_WAVEOUT_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 배열은 아날로그 오디오 신호를 전달하는 브리지 핀의 데이터 범위를 정의합니다. 자세한 내용은 오디오 필터 그래프의 브리지 핀에 대한 설명을 참조하세요.

더 복잡한 토폴로지의 예는 토폴로지 필터를 참조하세요.