在 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),該節點必須在排序的節點鏈中正確位置指定(詳情請參閱下方)。
Node-Chain 排序
目前,DirectSound 擷取效果架構需要以應用程式要求節點的順序來指定節點。 因此,迷你埠驅動程式指定其節點的順序必須符合 AEC 系統篩選 條件所使用的順序(Aec.sys),這會在軟體中實作 AEC 和 NS 演算法。
若要啟用硬體加速,驅動程式必須依照下列順序指定硬體所實作的效果:
KSNODETYPE_ACOUSTIC_ECHO_CANCEL
請注意,只要保留相對順序,此列表就可以省略任何未實作的效果。
AEC 節點針腳指派
配接器驅動程式會使用 PCCONNECTION_DESCRIPTOR 結構的陣列來指定篩選內的連接。 每個陣列元素都會描述一個連線,可以是節點對節點、節點對接或針腳接腳。 如需詳細資訊,請參閱 節點和連線。
若要使用PCCONNECTION_DESCRIPTOR結構,驅動程式開發人員會將「邏輯」接腳指派至節點。 這些是節點本身的「接腳」,僅用於指定濾波器內部的連接。 這與濾波器上的外部針腳形成鮮明對比,這些接腳是用來連線到其他濾波器的。
下表顯示轉接器驅動程式應指派給 AEC 節點上四個邏輯針腳的針腳識別碼。
| 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 篩選的內部拓撲,其中包含 AEC 節點和 NS 節點:
// 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 陣列會定義下圖所示的篩選條件拓撲。
上圖顯示過濾器內每個連接,使用指向數據流方向的虛線箭頭。 圖中總共會出現五個連線。 每個連接都會對應至程式代碼範例中 AecConnections 陣列中五個元素的其中一個。