Hardware-Accelerated 캡처 효과 노출
Windows XP 이상에서 WDM 오디오 프레임워크는 DirectSound를 통해 노출되는 오디오 캡처 효과의 하드웨어 가속을 지원합니다. 이러한 효과에는 AEC(음향 에코 취소) 및 NS(노이즈 억제)가 포함됩니다. DirectSoundCapture 애플리케이션에서 하드웨어 가속 AEC 및 NS를 사용하는 방법에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.
미니포트 드라이버는 기본 디바이스의 기능에 따라 이러한 효과의 하위 집합에 대한 하드웨어 가속을 노출할 수 있습니다. AEC 및 NS 효과에 대한 하드웨어 기능을 노출하려면 드라이버가 구현하는 AEC 필터의 각 핀이 다음 요구 사항을 충족해야 합니다.
핀은 그래프에 통합될 각 하드웨어 효과를 나타내기 위해 노드 체인에 개별 노드를 포함해야 합니다. AEC 및 NS 효과에 대한 KS 노드 형식은 GUID에 의해 지정됩니다. KSNODETYPE_ACOUSTIC_ECHO_CANCELKSNODETYPE_NOISE_SUPPRESS
핀의 AEC 및 NS 노드는 KSPROPSETID_General 속성 집합을 지원해야 하며 KSPROPERTY_GENERAL_COMPONENTID 속성에 대해 쿼리할 때 제조업체에 대한 정보를 제공해야 합니다.
핀의 AEC 및 NS 노드는 KSPROPSETID_TopologyNode 속성 집합과 두 속성을 지원해야 합니다.
KSPROPERTY_TOPOLOGYNODE_ENABLE 효과를 사용하도록 설정합니다.
KSPROPERTY_TOPOLOGYNODE_RESET 효과를 기본 상태로 다시 설정합니다.
핀의 AEC 및 NS 노드는 KSPROPSETID_Audio 속성 집합의 다음 속성을 지원해야 합니다. KSPROPERTY_AUDIO_CPU_RESOURCESKSPROPERTY_AUDIO_ALGORITHM_INSTANCE
핀은 KSPROPSETID_Audio 속성 집합의 다음 속성을 지원해야 합니다. KSPROPERTY_AUDIO_POSITIONKSPROPERTY_AUDIO_LATENCY
핀은 데이터 범위 기능을 노출해야 합니다( 핀 Data-Range 및 교차 속성 참조).
하드웨어 가속 AEC 및 NS 노드를 노출하기 위한 특정 요구 사항은 다음과 같습니다.
음향 에코 취소
PCM 미니포트 드라이버는 다음과 같은 추가 요구 사항을 충족하는 캡처 및 렌더링 스트림 모두에 대한 토폴로지 형태로 AEC에 대한 하드웨어 지원을 노출합니다.
- 핀에는 정렬된 노드 체인의 적절한 위치에 지정해야 하는 AEC 노드(KSNODETYPE_ACOUSTIC_ECHO_CANCEL)가 포함되어야 합니다(아래 참조).
노이즈 억제
PCM 미니포트 드라이버는 다음과 같은 추가 요구 사항을 충족하는 캡처 스트림에 대한 토폴로지 형태로 NS에 대한 하드웨어 지원을 노출합니다.
- 핀에는 정렬된 노드 체인의 적절한 위치에 지정해야 하는 NS 노드(KSNODETYPE_NOISE_SUPPRESS)가 포함되어야 합니다(아래 참조).
노드 체인 순서 지정
현재 DirectSound 캡처 효과 아키텍처를 사용하려면 노드를 애플리케이션에서 요청한 순서대로 지정해야 합니다. 따라서 미니포트 드라이버가 노드를 지정하는 순서는 소프트웨어에서 AEC 및 NS 알고리즘을 구현하는 AEC 시스템 필터 (Aec.sys)에서 사용하는 순서와 일치해야 합니다.
하드웨어 가속을 사용하도록 설정하려면 드라이버가 하드웨어에서 구현하는 효과를 다음 순서로 지정해야 합니다.
KSNODETYPE_ACOUSTIC_ECHO_CANCEL
이 목록은 상대 순서가 유지되는 한 구현되지 않은 모든 효과를 생략할 수 있습니다.
AEC 노드 핀 할당
어댑터 드라이버는 PCCONNECTION_DESCRIPTOR 구조체 배열을 사용하여 필터 내에서 연결을 지정합니다. 각 배열 요소는 노드 간, 노드 간 또는 핀-핀일 수 있는 하나의 연결을 설명합니다. 자세한 내용은 노드 및 연결을 참조하세요.
PCCONNECTION_DESCRIPTOR 구조를 사용하기 위해 드라이버 작성기는 노드에 "논리적" 핀을 할당합니다. 이들은 노드 자체의 "핀"이며 필터 내부의 연결을 지정하는 데만 사용됩니다. 이는 다른 필터에 연결하는 데 사용되는 필터의 외부 핀과는 대조적입니다.
다음 표에서는 어댑터 드라이버가 AEC 노드의 4개의 논리 핀에 할당해야 하는 핀 ID를 보여 줍니다.
PIN ID 매개 변수 이름 | 값 | 의미 |
---|---|---|
KSNODEPIN_AEC_RENDER_IN |
1 |
렌더링 스트림에 대한 싱크 핀(노드 입력) |
KSNODEPIN_AEC_RENDER_OUT |
0 |
렌더링 스트림에 대한 원본 핀(노드 출력) |
KSNODEPIN_AEC_CAPTURE_IN |
2 |
캡처 스트림에 대한 싱크 핀(노드 입력) |
KSNODEPIN_AEC_CAPTURE_OUT |
3 |
캡처 스트림에 대한 원본 핀(노드 출력) |
앞의 표에 있는 핀 ID는 헤더 파일 Ksmedia.h에 정의되어 있습니다.
다음 코드 예제에서는 어댑터 드라이버가 AEC 노드와 NS 노드를 모두 포함하는 AEC 필터의 내부 토폴로지를 지정하는 방법을 보여 줍니다.
// AEC Filter Topology
// Pin IDs for external pins on AEC filter
#define ID_CaptureOutPin 0 // microphone stream
#define ID_CaptureInPin 1
#define ID_RenderOutPin 2 // speaker stream
#define ID_RenderInPin 3
// Generic pin IDs for simple node with one input and one output
#define NODE_INPUT_PIN 1
#define NODE_OUTPUT_PIN 0
// Node IDs
#define NODE_ID_AEC 0 // acoustic echo cancellation
#define NODE_ID_NS 1 // noise suppression
// The array below defines the internal topology of an
// AEC filter that contains an AEC node and an NS node.
const PCCONNECTION_DESCRIPTOR AecConnections[] = {
{ PCFILTER_NODE, ID_RenderInPin, NODE_ID_AEC, KSNODEPIN_AEC_RENDER_IN },
{ NODE_ID_AEC, KSNODEPIN_AEC_RENDER_OUT, PCFILTER_NODE, ID_RenderOutPin },
{ PCFILTER_NODE, ID_CaptureInPin, NODE_ID_AEC, KSNODEPIN_AEC_CAPTURE_IN },
{ NODE_ID_AEC, KSNODEPIN_AEC_CAPTURE_OUT, NODE_ID_NS, NODE_INPUT_PIN },
{ NODE_ID_NS, NODE_OUTPUT_PIN, PCFILTER_NODE, ID_CaptureOutPin }
};
이전 코드 예제의 AecConnections 배열은 다음 그림에 표시된 필터 토폴로지를 정의합니다.
앞의 그림은 데이터 흐름 방향을 가리키는 파선 화살표를 사용하여 필터 내의 각 연결을 나타냅니다. 그림에는 총 5개의 연결이 표시됩니다. 각 연결은 코드 예제의 AecConnections 배열에 있는 5개 요소 중 하나에 해당합니다.