公开硬件加速捕获效果
在 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
引脚应公开其数据范围功能(请参阅引脚数据范围和交集属性)。
下面介绍了公开硬件加速 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 节点上的四个逻辑引脚的引脚 ID。
引脚 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 数组定义了下图所示的筛选器拓扑。
上图表示筛选器内的每个连接,其中带有一个虚线箭头,指向数据流的方向。 图中总共显示了五个连接。 每个连接对应于代码示例中 AecConnections 数组内的五个元素之一。