公開 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 系統篩選 (Aec.sys) 所使用的順序,以實作軟體中的 AEC 和 NS 演算法。
若要啟用硬體加速,驅動程式必須依照下列順序指定硬體所實作的效果:
KSNODETYPE_ACOUSTIC_ECHO_CANCEL
請注意,只要保留相對順序,此清單就可以省略任何未實作的效果。
AEC 節點針腳指派
配接器驅動程式會使用 PCCONNECTION_DESCRIPTOR 結構的陣列來指定篩選內的連線。 每個陣列元素都會描述一個連線,可以是節點對節點、節點對釘或釘選對釘。 如需詳細資訊,請參閱 節點和連線。
若要使用PCCONNECTION_DESCRIPTOR結構,驅動程式寫入器會將「邏輯」針腳指派給節點。 這些是節點本身的「釘選」,而且只會用來指定篩選內的連線。 這與篩選上的外部針腳相反,用來連接到其他篩選準則。
下表顯示介面卡驅動程式應該指派給 AEC 節點上四個邏輯針腳的針腳識別碼。
釘選識別碼參數名稱 | 值 | 意義 |
---|---|---|
KSNODEPIN_AEC_RENDER_IN |
1 |
轉譯資料流程的接收針腳 (節點輸入) |
KSNODEPIN_AEC_RENDER_OUT |
0 |
轉譯資料流程的來源釘選 (節點輸出) |
KSNODEPIN_AEC_CAPTURE_IN |
2 |
擷取資料流程的接收針腳 (節點輸入) |
KSNODEPIN_AEC_CAPTURE_OUT |
3 |
擷取資料流程的來源釘選 (節點輸出) |
上表中的針腳識別碼定義于標頭檔 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 陣列中五個元素的其中一個。