ハードウェア アクセラレータによるキャプチャ効果を公開

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 を示します。

ピン ID パラメーター名 Value 意味

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 配列は、次の図に示すフィルター トポロジを定義します。

Diagram illustrating the internal topology of an AEC filter with AEC and NS nodes.

上の図は、フィルター内の各接続を、データ フローの方向を指す破線の矢印で表しています。 図では、合計 5 つの接続が表示されています。 各接続は、コード例の AecConnections 配列の 5 つの要素のいずれかに対応しています。