토폴로지 필터
토폴로지 필터는 카드 관리되는 다양한 웨이브 및 MIDI 스트림 간의 상호 작용을 처리하는 오디오 어댑터 카드 회로 부분을 나타냅니다. 이 회로는 렌더링 스트림과 캡처 스트림의 멀티플렉싱을 혼합합니다.
토폴로지 필터는 외부 디바이스에 대한 오디오 어댑터의 물리적 연결을 나타내는 브리지 핀 ( 오디오 필터 그래프 참조)을 제공합니다. 이러한 연결은 일반적으로 마이크에서 스피커 및 아날로그 입력 신호를 구동하는 아날로그 출력 신호를 전달합니다. 토폴로지 필터의 브리지 핀은 아날로그 라인인 및 라인아웃 잭과 디지털 입력 및 출력 커넥터를 나타낼 수도 있습니다.
"토폴로지 필터"라는 용어는 어떤 의미에서 오해의 소지가 있습니다. 토폴로지 필터는 이름에도 불구하고 내부 토폴로지 또는 레이아웃을 노출하는 여러 유형의 오디오 필터 중 하나일 뿐입니다. 토폴로지 필터에는 주요 토폴로지 기능이 포함되어 있지만 어댑터의 전체 토폴로지를 반드시 포함하는 것은 아닙니다. 웨이브 및 MIDI 필터에는 자체 토폴로지가 있습니다. 예를 들어 최소 WaveCyclic 또는 WavePci 필터( 웨이브 필터 참조)는 기본 디바이스가 오디오 렌더링 또는 캡처를 수행하는지 여부에 따라 두 개의 핀과 DAC(디지털-아날로그 변환기) 또는 ADC(아날로그-디지털 변환기)로 구성된 토폴로지를 노출할 수 있습니다.
토폴로지 필터는 포트/미니포트 쌍으로 구현됩니다. 토폴로지 필터 팩터리는 다음과 같이 토폴로지 필터를 만듭니다.
토폴로지 미니포트 드라이버 개체를 인스턴스화합니다.
GUID 값이 CLSID_PortTopologyPcNewPort를 호출하여 토폴로지 포트 드라이버 개체를 인스턴스화합니다.
포트 드라이버의 IPort::Init 메서드를 호출하여 미니포트 드라이버를 포트 드라이버에 바인딩합니다.
하위 서비스 만들기의 코드 예제는 이 프로세스를 보여 줍니다.
토폴로지 포트 및 미니포트 드라이버는 해당 IPortTopology 및 IMiniportTopology 인터페이스를 통해 서로 통신합니다. 이러한 인터페이스는 웨이브 및 MIDI 포트 및 미니포트 드라이버에 비해 비교적 간단합니다. 토폴로지 필터는 핀을 통과하는 스트림을 명시적으로 관리할 필요가 없기 때문입니다. 토폴로지 필터의 핀은 어댑터 하드웨어의 하드와이어 연결을 나타냅니다. 토폴로지 필터 핀의 기본이 되는 물리적 연결은 일반적으로 아날로그 오디오 신호를 전달하지만 하드웨어 구현에 따라 디지털 오디오 스트림을 대신 전달할 수 있습니다.
IMiniportWaveCyclic, IMiniportWavePci, IMiniportMidi 및 IMiniportDMus 인터페이스와 달리 IMiniportTopology 인터페이스에는 NewStream 메서드가 없습니다.
토폴로지 필터의 대부분의 기능은 속성 처리기에서 제공됩니다. 토폴로지 필터는 주로 SysAudio 시스템 드라이버 및 Microsoft Windows 멀티미디어 믹서 API를 사용하는 애플리케이션에 토폴로지 정보를 제공하기 위해 존재합니다. 토폴로지 필터의 속성 처리기는 오디오 어댑터가 일반적으로 제공하는 다양한 컨트롤(예: 볼륨, 이퀄라이제이션 및 반향)에 대한 액세스를 제공합니다. 믹서 API는 속성 요청을 통해 어댑터 하드웨어의 컨트롤 노드를 열거하고, 노드 간의 연결을 검색하고, 노드의 제어 매개 변수를 쿼리하고 설정할 수 있습니다. SndVol32 애플리케이션( SysTray 및 SndVol32 참조)은 믹서 API를 사용하여 어댑터의 스트림별 볼륨을 검색하고 컨트롤을 음소거합니다.
필터 그래프를 빌드할 때 SysAudio는 핀의 KSPROPERTY_PIN_PHYSICALCONNECTION 속성에 대한 토폴로지 필터를 쿼리하여 어떤 파동, MIDI 또는 DirectMusic 필터 핀이 어떤 토폴로지 필터 핀에 연결되어 있는지 확인합니다.
웨이브, MIDI 또는 DirectMusic 필터와 달리 토폴로지 필터는 핀을 인스턴스화하지 않습니다. 따라서 토폴로지 필터의 핀 속성에 대한 쿼리를 처리하는 데 사용할 수 있는 핀 개체는 없습니다. 토폴로지 필터 자체는 핀의 실제 연결과 관련된 모든 쿼리를 처리합니다. 자세한 내용은 KSPROPSETID_Pin 참조하세요.
다른 유형의 오디오 필터와 마찬가지로 토폴로지 필터는 PCCONNECTION_DESCRIPTOR 구조의 배열을 사용하여 내부 토폴로지를 설명합니다. 미니포트 드라이버는 IMiniport::GetDescription 메서드에서 출력하는 PCFILTER_DESCRIPTOR 구조에서 이 배열을 노출합니다. 배열은 토폴로지를 토폴로지 필터의 노드와 핀 간의 연결 목록으로 지정 합니다(노드 및 연결 참조). WDMAud 시스템 드라이버는 이러한 연결 및 노드를 믹서 라인으로 변환하고 믹서 API가 애플리케이션에 노출하는 컨트롤을 제어합니다. 오디오 필터에서 설명한 대로 KS 필터의 입력 핀은 SRC 믹서 라인에 매핑되고 필터의 출력 핀은 DST 믹서 라인에 매핑됩니다.
일반적인 오디오 어댑터는 스피커를 통해 웨이브 및 MIDI 파일을 재생할 수 있으며 마이크와 MIDI 신시사이저에서 오디오 신호를 캡처할 수 있습니다. 아래 코드 예제에는 이러한 기능을 노출하는 토폴로지 필터에 대한 PCCONNECTION_DESCRIPTOR 배열이 포함되어 있습니다.
// topology pins
enum
{
KSPIN_TOPO_WAVEOUT_SRC = 0,
KSPIN_TOPO_SYNTHOUT_SRC,
KSPIN_TOPO_SYNTHIN_SRC,
KSPIN_TOPO_MIC_SRC,
KSPIN_TOPO_LINEOUT_DST,
KSPIN_TOPO_WAVEIN_DST
};
// topology nodes
enum
{
KSNODE_TOPO_WAVEOUT_VOLUME = 0,
KSNODE_TOPO_WAVEOUT_MUTE,
KSNODE_TOPO_SYNTHOUT_VOLUME,
KSNODE_TOPO_SYNTHOUT_MUTE,
KSNODE_TOPO_MIC_VOLUME,
KSNODE_TOPO_SYNTHIN_VOLUME,
KSNODE_TOPO_LINEOUT_MIX,
KSNODE_TOPO_LINEOUT_VOLUME,
KSNODE_TOPO_WAVEIN_MUX
};
static PCCONNECTION_DESCRIPTOR MiniportConnections[] =
{
// FromNode---------------------FromPin------------------ToNode-----------------------ToPin
{ PCFILTER_NODE, KSPIN_TOPO_WAVEOUT_SRC, KSNODE_TOPO_WAVEOUT_VOLUME, 1 },
{ KSNODE_TOPO_WAVEOUT_VOLUME, 0, KSNODE_TOPO_WAVEOUT_MUTE, 1 },
{ KSNODE_TOPO_WAVEOUT_MUTE, 0, KSNODE_TOPO_LINEOUT_MIX, 1 },
{ PCFILTER_NODE, KSPIN_TOPO_SYNTHOUT_SRC, KSNODE_TOPO_SYNTHOUT_VOLUME, 1 },
{ KSNODE_TOPO_SYNTHOUT_VOLUME, 0, KSNODE_TOPO_SYNTHOUT_MUTE, 1 },
{ KSNODE_TOPO_SYNTHOUT_MUTE, 0, KSNODE_TOPO_LINEOUT_MIX, 2 },
{ PCFILTER_NODE, KSPIN_TOPO_SYNTHIN_SRC, KSNODE_TOPO_SYNTHIN_VOLUME, 1 },
{ KSNODE_TOPO_SYNTHIN_VOLUME, 0, KSNODE_TOPO_WAVEIN_MUX, 1 },
{ PCFILTER_NODE, KSPIN_TOPO_MIC_SRC, KSNODE_TOPO_MIC_VOLUME, 1 },
{ KSNODE_TOPO_MIC_VOLUME, 0, KSNODE_TOPO_WAVEIN_MUX, 2 },
{ KSNODE_TOPO_LINEOUT_MIX, 0, KSNODE_TOPO_LINEOUT_VOLUME, 1 },
{ KSNODE_TOPO_LINEOUT_VOLUME, 0, PCFILTER_NODE, KSPIN_TOPO_LINEOUT_DST },
{ KSNODE_TOPO_WAVEIN_MUX, 0, PCFILTER_NODE, KSPIN_TOPO_WAVEIN_DST }
};
이전 코드 예제의 상수 PCFILTER_NODE null 노드 ID이며 헤더 파일 Portcls.h에 정의됩니다. 이 상수를 사용하여 필터의 외부 핀과 노드의 논리 핀을 구분하는 방법에 대한 설명은 PCCONNECTION_DESCRIPTOR.
이전 코드 예제의 각 핀 이름은 믹서 API가 핀을 원본 또는 대상 믹서 라인에 매핑하는지 여부에 따라 "SRC" 또는 "DST"로 끝납니다. 혼동을 방지하려면 원본 및 대상 믹서 선이 각각 싱크(입력) 및 원본(출력) KS 필터 핀에 매핑된다는 점을 기억하세요. 자세한 내용은 오디오 필터를 참조하세요.
이전 코드 예제의 PCCONNECTION_DESCRIPTOR 배열은 다음 그림의 토폴로지 필터에 대해 설명합니다.
그림의 토폴로지 필터는 왼쪽에 4개의 입력(싱크) 핀과 오른쪽에 두 개의 출력(원본) 핀이 있습니다. 상위 두 개의 입력 핀과 상위 출력 핀을 연결하는 데이터 경로는 재생 중인 웨이브 및 MIDI 스트림에서 렌더링된 두 개의 아날로그 신호를 혼합합니다. 하단 두 개의 입력 핀과 하단 출력 핀을 연결하는 데이터 경로는 기록되는 캡처된 아날로그 신호를 멀티플렉싱합니다.
네 개의 입력 핀은 다음과 같이 작동합니다.
KSPIN_TOPO_WAVEOUT_SRC 핀은 웨이브 필터의 출력 핀에 물리적으로 연결되어 .wav 파일과 같은 소스에서 웨이브 스트림을 렌더링하여 핀에서 아날로그 신호를 생성합니다.
KSPIN_TOPO_SYNTHOUT_SRC 핀은 신디사이저 필터의 출력 핀에 물리적으로 연결되며, 예를 들어 .mid 파일과 같은 소스에서 MIDI 스트림을 렌더링하여 핀에서 아날로그 신호를 생성할 수 있습니다.
KSPIN_TOPO_SYNTHIN_SRC 핀은 아날로그 신호를 생성하는 신시사이저에 물리적으로 연결됩니다. (보다 실용적인 하드웨어 디자인은 MPU-401 MIDI 인터페이스에서 MIDI 입력 스트림을 가져와 토폴로지 필터를 완전히 무시하고 웨이브 형식으로 직접 변환할 수 있습니다.)
KSPIN_TOPO_MIC_SRC 핀은 마이크에서 아날로그 신호를 받는 입력 잭에 물리적으로 연결됩니다.
두 개의 출력 핀은 다음과 같이 작동합니다.
KSPIN_TOPO_LINEOUT_DST 핀은 일반적으로 스피커 세트를 구동하는 아날로그 라인아웃 잭에 물리적으로 연결됩니다.
KSPIN_TOPO_WAVEIN_DST 핀은 아날로그 신호를 웨이브 스트림으로 변환하고 .wav 파일과 같은 대상에 쓰는 웨이브 필터의 입력 핀에 물리적으로 연결됩니다.
볼륨 및 음소거 노드( KSNODETYPE_VOLUME 및 KSNODETYPE_MUTE 참조)는 다양한 스트림의 볼륨 수준을 제어하는 데 사용됩니다. SUM 노드( KSNODETYPE_SUM 참조)는 웨이브 및 MIDI 입력의 오디오 스트림을 혼합합니다. MUX 노드( KSNODETYPE_MUX 참조)는 두 입력 스트림 중에서 선택합니다.
그림에서는 파선 화살표를 사용하여 두 노드 간 또는 핀과 노드 간의 연결을 나타냅니다. 화살표는 데이터 흐름 방향을 가리킵니다. 다이어그램은 총 13개의 연결을 보여 줍니다. 각 연결은 이전 코드 예제의 PCCONNECTION_DESCRIPTOR 배열에 있는 13개 요소 중 하나에 해당합니다.
어댑터 드라이버는 토폴로지 필터 외에도 토폴로지 필터의 핀에 연결하는 다른 필터(웨이브, FM 신디사이저, 웨이브 테이블 등)를 만듭니다.
예를 들어 토폴로지 필터의 KSPIN_TOPO_WAVEOUT_SRC 핀에 물리적으로 연결된 웨이브 필터에는 PCM 데이터를 토폴로지 필터의 핀으로 출력하는 아날로그 신호로 변환하는 DAC( KSNODETYPE_DAC 노드로 표시됨)가 포함되어 있습니다. 토폴로지 필터의 KSPIN_TOPO_SYNTHOUT_SRC 핀에 물리적으로 연결된 FM 신스 또는 파동 가능한 신디사이저 필터는 마찬가지로 MIDI 데이터를 토폴로지 필터의 핀으로 출력하는 아날로그 신호로 변환합니다. 토폴로지 필터는 이러한 두 핀의 아날로그 신호를 혼합하고 혼합 신호를 스피커에 출력합니다.
동일한 어댑터 카드 다른 하드웨어 디바이스를 나타내는 다른 필터에 대한 토폴로지 필터의 물리적 연결은 필터에 대한 다른 유형의 연결과 구별되어야 합니다. 예를 들어 웨이브, MIDI 및 DirectMusic 필터의 특정 핀은 소프트웨어 제어에서 연결되거나 연결이 끊어질 수 있습니다.
디바이스를 시작하는 동안 어댑터 드라이버는 연결당 한 번 PcRegisterPhysicalConnection 을 호출하여 토폴로지 필터의 물리적 연결을 등록합니다. 포트 드라이버는 KSPROPERTY_PIN_PHYSICALCONNECTION get-property 요청에 응답하기 위해 이 정보가 필요합니다.