公开筛选器拓扑
微型端口驱动程序会在引脚、节点和连接方面描述 KS 筛选器的内部拓扑。 此拓扑通过筛选器指定数据流路径,并定义属性请求的逻辑目标(引脚和节点)。 筛选器内部拓扑是构成筛选器基础的硬件设备内部结构的逻辑表示形式。 微型端口驱动程序使用引脚、节点和连接描述符的静态数组描述此拓扑。
引脚在 PCPIN_DESCRIPTOR 结构的静态数组中指定。 每个引脚都有一个 ID,该 ID 是这个引脚在数组中的序号。
引脚在 PCNODE_DESCRIPTOR 结构的静态数组中指定。 每个节点都有一个 ID,该 ID 是这个引脚在数组中的序号。
连接(引脚到引脚、引脚到节点或节点到节点)在 PCCONNECTION_DESCRIPTOR 结构的静态数组中指定。
微型端口驱动程序在从 IMiniport::GetDescription 方法输出的 PCFILTER_DESCRIPTOR 结构中公开这三个数组。
示例
下面的代码示例指定具有一个输入引脚和一个输出引脚的简单 KS 筛选器的内部拓扑。 该筛选器包含单个节点,该节点是音量级控件。
#define KSPIN_WAVEOUT_SRC 0
#define KSPIN_SPEAKERS_DST 1
PCPIN_DESCRIPTOR
MiniportPins[] =
{
{ // Pin 0 -- KSPIN_WAVEOUT_SRC
0,0,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersBridge), // DataRangesCount
PinDataRangePointersBridge, // DataRanges
KSPIN_DATAFLOW_IN, // DataFlow
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_LEGACY_AUDIO_CONNECTOR, // Category
NULL, // Name
0 // Reserved
}
},
{ // Pin 1 -- KSPIN_SPEAKERS_DST
0,0,0, // InstanceCount
NULL, // AutomationTable
{ // KsPinDescriptor
0, // InterfacesCount
NULL, // Interfaces
0, // MediumsCount
NULL, // Mediums
SIZEOF_ARRAY(PinDataRangePointersBridge), // DataRangesCount
PinDataRangePointersBridge, // DataRanges
KSPIN_DATAFLOW_OUT, // DataFlow
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_SPEAKER, // Category
&KSAUDFNAME_VOLUME_CONTROL, // Name (This name shows up as the
// playback panel name in SndVol32)
0 // Reserved
}
}
};
#define KSNODE_WAVEOUT_VOLUME 0
PCNODE_DESCRIPTOR TopologyNodes[] =
{
{ // KSNODE_WAVEOUT_VOLUME
0, // Flags
&AutomationVolume, // AutomationTable
&KSNODETYPE_VOLUME, // Type
&KSAUDFNAME_WAVE_VOLUME // Name
}
};
PCCONNECTION_DESCRIPTOR MiniportConnections[] =
{ //FromNode---------------FromPin------------ToNode-----------------ToPin
{ PCFILTER_NODE, KSPIN_WAVEOUT_SRC, KSNODE_WAVEOUT_VOLUME, 1 },
{ KSNODE_WAVEOUT_VOLUME, 0, PCFILTER_NODE, KSPIN_SPEAKERS_DST }
};
下图显示了上述示例代码描述的筛选器的拓扑。
此筛选器是拓扑筛选器的简单示例,适配器驱动程序通过将其 IMiniportTopology 对象绑定到 PortCls 系统驱动程序创建的 IPortTopology 对象而形成该筛选器。 筛选器的输入(接收器)和输出(源)引脚命名为 KSPIN_WAVEOUT_SRC 和 KSPIN_SPEAKERS_DST。 两个引脚都承载模拟信号。 混音器 API 分别将这些引脚的连接公开为源和目标混音器线(MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT 和 MIXERLINE_COMPONENTTYPE_DST_SPEAKERS)。
下表说明了在讨论 KS 引脚到混音器线的映射时可能产生混淆的根源。
引脚名称 | 混音器 API 术语 | KS 筛选器术语 |
---|---|---|
KSPIN_WAVEOUT_SRC |
源混音器线 |
接收器引脚 |
KSPIN_SPEAKERS_DST |
目标混音器线 |
源引脚 |
请注意,KSPIN_WAVEOUT_SRC 是源混音器线,KSPIN_SPEAKERS_DST 是源引脚。 有关详细信息,请参阅从内核流式处理拓扑到音频混音器 API 的转换中关于 KS 和混音器线术语的讨论。
另请注意,名称“KSPIN_WAVEOUT_SRC”包含“WAVEOUT”不是因为引脚承载波次格式的数字数据,而是因为它承载由波形筛选器(这是 WaveCyclic 或 WavePci 类型的筛选器)生成的模拟信号。 波形筛选器表示将波次流转换为模拟信号的音频适配器硬件的一部分。 引脚 KSPIN_SPEAKERS_DST 会输出驱动一组扬声器的模拟信号。
筛选器包含单个节点 KSNODE_WAVEOUT_VOLUME,混音器 API 将该节点表示为音量控件 (MIXERCONTROL_CONTROLTYPE_VOLUME)。 音量控件的 KS 节点类型为 KSNODETYPE_VOLUME。 此类型的所有节点都支持 KSPROPERTY_AUDIO_VOLUMELEVEL 属性,筛选器的客户端使用该属性来控制音量级别。
音量节点有两个“逻辑”引脚,编号为 0 和 1。 微型端口连接数组指定的两个连接在图中以指向数据流方向的虚线箭头表示。 每个连接由数组中的两个元素之一描述。
KSPIN_WAVEOUT_SRC 和 KSPIN_SPEAKERS_DST 引脚都是桥接引脚,这意味着它们表示适配器中的硬接线连接。 在前面的示例代码中,MiniportPins 数组中的两个引脚描述符都将其 IRP 流方向指定为 KSPIN_COMMUNICATION_NONE,这是合适的,因为桥接引脚既不发送也不接收 IRP。 这两个引脚描述符还引用 PinDataRangePointersBridge 数组,该数组的定义如下:
static KSDATARANGE PinDataRangesBridge[] =
{
{
sizeof(KSDATARANGE),
0, 0, 0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
}
};
static PKSDATARANGE PinDataRangePointersBridge[] =
{
&PinDataRangesBridge[0]
};
PinDataRangePointersBridge 数组定义了承载模拟音频信号的桥接引脚的数据范围。 有关详细信息,请参阅音频筛选器图中桥接引脚的讨论。
有关更复杂拓扑的示例,请参阅拓扑筛选器。