数据交集

在音频筛选器图中,仅当两个引脚支持音频流的通用格式时,该流才能从一个筛选器的源引脚流到另一个筛选器的接收器引脚。 同样,客户端可以将音频流发送到筛选器上的接收器引脚,或者仅当客户端和引脚支持通用流格式时,才从筛选器上的源引脚接收音频流。 音频筛选器使用一种称为数据交集(数据范围交集的简称)技术来标识两个引脚或客户端和引脚通用的流格式。

例如,在 Windows Server 2003、Windows XP、Windows 2000 和 Windows Me/98 中,SysAudio 系统驱动程序使用数据交集技术通过连接支持兼容音频数据格式的筛选器引脚对来构造音频筛选器图。

引脚工厂将每个引脚支持的格式集指定为数据范围数组,其中每个数据范围都是 KSDATARANGE_AUDIO 类型的结构。 数据范围指定常规格式类型,可以为 KSDATAFORMAT_WAVEFORMATEXKSDATAFORMAT_DSOUND。 此外,数据范围指定以下每个参数的值范围:

  • 每个样本的位数

  • 采样频率

  • 声道数

KSDATARANGE_AUDIO 结构同时指定每样本位数和采样频率范围的最小值和最大值,但只指定声道数范围的最大值。 最小声道数隐式为一个。

为两个引脚协商通用数据格式的工作包括查找两个相交的数据范围,从每个引脚各查找一个。 一对数据范围在以下情况下相交:

  • 它们支持同一常规波形格式(KSDATAFORMAT_WAVEFORMATEX 或 KSDATAFORMAT_DSOUND)。

  • 它们的每样本位数范围重叠。

  • 其采样频率范围重叠。

如前所述,KSDATAFORMAT_AUDIO 结构暗指引脚支持的声道数下限始终为一个的硬件模型。 根据此模型,任何两个引脚的声道数范围应始终重叠,因为两个引脚至少支持一个声道。 显然,声道数大于一个的硬件适配器不符合此模型,但适配器驱动程序可以包含专有数据交集处理程序来处理此类问题(请参阅专有数据交集处理程序中的示例)。

在找到两个引脚的一对相交数据范围后,处理程序会从交集区域选择一种通用数据格式,如下所示:

  • 从两个每样本位数范围重叠的区域中选择每样本位数。

  • 从两个采样频率范围重叠的区域中选择采样频率。

  • 从两个声道数范围重叠的区域中选择道道数。

例如,当为音频端口驱动程序的接收器引脚和另一个筛选器(通常是 KMixer 系统驱动程序)的源引脚协商通用格式时,SysAudio 会首先获取源引脚的数据范围数组。 然后,SysAudio 将 KSPROPERTY_PIN_DATAINTERSECTION 请求发送到接收器引脚,并在此请求中包含源引脚的数据范围数组。 内核流式处理层截获请求,并从第一个元素开始以迭代方式为源引脚数据范围数组中的每个连续元素调用端口驱动程序的数据交集处理程序一次,直到处理程序成功查找到数据交集。

SysAudio 每次调用端口驱动程序的数据交集处理程序时,处理程序会首先从微型端口驱动程序获取接收器引脚的数据范围数组。 然后,它会从第一个元素开始循环访问该数组,直到它成功找到接收器引脚数据范围和当前源引脚数据范围之间的交集。 处理程序会选择位于交集内的通用格式,并将此格式输出给调用方。

在迭代的每个步骤中,端口驱动程序会使用两个数据范围(两个引脚中的每个各一个)调用微型端口驱动程序的专有数据交集处理程序。 如果在任何步骤中,专有处理程序拒绝处理两个数据范围之间的数据交集检查,端口驱动程序的数据交集处理程序将改为执行检查。

总之,在源引脚数据范围与接收器引脚数据范围之间搜索交集是一个迭代过程:

  • 在外部循环中,内核流式处理层从第一个数组元素开始循环访问源引脚的数据范围数组中的连续元素。

  • 在内部循环中,端口驱动程序从第一个数组元素开始循环访问接收器引脚的数据范围数组中的连续元素。

搜索在找到第一个数据交集时停止。 此过程往往会将元素放置在每个引脚的数据范围数组的开头。 为引脚指定数据范围数组时,适配器驱动程序应通过将首选格式的数据范围放置在数组开头来对数组元素进行排序。