ハードウェア アクセラレータによるキャプチャ効果を公開
Windows XP 以降では、WDM オーディオ フレームワークは、DirectSound を介して公開されるオーディオ キャプチャ効果のハードウェア アクセラレーションをサポートしています。 これらの効果には、音響エコー キャンセル (AEC) とノイズ抑制 (NS) が含まれます。 DirectSoundCapture アプリケーションでハードウェア アクセラレーションが有効になっている AEC と NS を使用する方法については、Microsoft Windows SDK のドキュメントを参照してください。
ミニポート ドライバーでは、基になるデバイスの機能に応じて、これらの効果の任意のサブセットのハードウェア アクセラレーションを公開することができます。 AEC および NS 効果に対するハードウェアの機能を公開するには、ドライバーが実装する AEC フィルターの各ピンが次の要件を満たしている必要があります。
ピンは、グラフに組み込まれる各ハードウェア効果を表すために、ノード チェーンに個々のノードを含める必要があります。 AEC および NS 効果の KS ノード タイプは、次の GUID で指定されます。 KSNODETYPE_ACOUSTIC_ECHO_CANCELKSNODETYPE_NOI Standard Edition_SUPPRESS
ピンの AEC ノードと NS ノードは、KSPROPSETID_General プロパティ セットをサポートし、KSPROPERTY_GENERAL_COMPONENTID プロパティについてクエリが実行されたときに製造元に関する情報を提供する必要があります。
ピンの AEC ノードと NS ノードは、KSPROPSETID_TopologyNode プロパティ セットと次の 2 つのプロパティをサポートする必要があります。
KSPROPERTY_TOPOLOGYNODE_ENABLE は効果を有効にします。
KSPROPERTY_TOPOLOGYNODE_RESET は、効果を既定の状態にリセットします。
ピン上の AEC ノードと NS ノードは、KSPROPSETID_Audio プロパティ セットの次のプロパティをサポートする必要があります。 KSPROPERTY_AUDIO_CPU_RESOURCESKSPROPERTY_AUDIO_ALGORITHM_INSTANCE
ピンは、KSPROPSETID_Audio プロパティ セットの次のプロパティをサポートする必要があります。 KSPROPERTY_AUDIO_POSITIONKSPROPERTY_AUDIO_LATENCY
ピンは、そのデータ範囲機能を公開する必要があります (「ピンのデータ範囲と交差のプロパティ」を参照)。
ハードウェアアクセラレーションが有効になっている 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 を示します。
ピン 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 配列は、次の図に示すフィルター トポロジを定義します。
上の図は、フィルター内の各接続を、データ フローの方向を指す破線の矢印で表しています。 図では、合計 5 つの接続が表示されています。 各接続は、コード例の AecConnections 配列の 5 つの要素のいずれかに対応しています。