Hardware-Accelerated 캡처 효과 노출

Windows XP 이상에서 WDM 오디오 프레임워크는 DirectSound를 통해 노출되는 오디오 캡처 효과의 하드웨어 가속을 지원합니다. 이러한 효과에는 AEC(음향 에코 취소) 및 NS(노이즈 억제)가 포함됩니다. DirectSoundCapture 애플리케이션에서 하드웨어 가속 AEC 및 NS를 사용하는 방법에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.

미니포트 드라이버는 기본 디바이스의 기능에 따라 이러한 효과의 하위 집합에 대한 하드웨어 가속을 노출할 수 있습니다. AEC 및 NS 효과에 대한 하드웨어 기능을 노출하려면 드라이버가 구현하는 AEC 필터의 각 핀이 다음 요구 사항을 충족해야 합니다.

하드웨어 가속 AEC 및 NS 노드를 노출하기 위한 특정 요구 사항은 다음과 같습니다.

음향 에코 취소

PCM 미니포트 드라이버는 다음과 같은 추가 요구 사항을 충족하는 캡처 및 렌더링 스트림 모두에 대한 토폴로지 형태로 AEC에 대한 하드웨어 지원을 노출합니다.

  • 핀에는 정렬된 노드 체인의 적절한 위치에 지정해야 하는 AEC 노드(KSNODETYPE_ACOUSTIC_ECHO_CANCEL)가 포함되어야 합니다(아래 참조).

노이즈 억제

PCM 미니포트 드라이버는 다음과 같은 추가 요구 사항을 충족하는 캡처 스트림에 대한 토폴로지 형태로 NS에 대한 하드웨어 지원을 노출합니다.

  • 핀에는 정렬된 노드 체인의 적절한 위치에 지정해야 하는 NS 노드(KSNODETYPE_NOISE_SUPPRESS)가 포함되어야 합니다(아래 참조).

노드 체인 순서 지정

현재 DirectSound 캡처 효과 아키텍처를 사용하려면 노드를 애플리케이션에서 요청한 순서대로 지정해야 합니다. 따라서 미니포트 드라이버가 노드를 지정하는 순서는 소프트웨어에서 AEC 및 NS 알고리즘을 구현하는 AEC 시스템 필터 (Aec.sys)에서 사용하는 순서와 일치해야 합니다.

하드웨어 가속을 사용하도록 설정하려면 드라이버가 하드웨어에서 구현하는 효과를 다음 순서로 지정해야 합니다.

KSNODETYPE_ADC

KSNODETYPE_ACOUSTIC_ECHO_CANCEL

KSNODETYPE_NOISE_SUPPRESS

이 목록은 상대 순서가 유지되는 한 구현되지 않은 모든 효과를 생략할 수 있습니다.

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 배열은 다음 그림에 표시된 필터 토폴로지를 정의합니다.

AEC 및 NS 노드를 사용하는 AEC 필터의 내부 토폴로지를 보여 주는 다이어그램

앞의 그림은 데이터 흐름 방향을 가리키는 파선 화살표를 사용하여 필터 내의 각 연결을 나타냅니다. 그림에는 총 5개의 연결이 표시됩니다. 각 연결은 코드 예제의 AecConnections 배열에 있는 5개 요소 중 하나에 해당합니다.