数据交集

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

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

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

  • 每个样本的位数

  • 示例频率

  • 通道数

KSDATARANGE_AUDIO结构指定了每个样本位数和采样频率范围的最小值和最大值,但对于通道数量范围则只指定了最大值。 最小通道数隐式为一个。

为两个接口协商通用数据格式的工作包括查找两个数据范围——每个接口有一个数据范围——这些数据范围相交的部分。 如果两个数据范围相交,则它们满足条件:

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

  • 每个样本的比特数的范围重叠。

  • 其采样频率范围重叠。

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

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

  • 每个样本的位数是从两个样本位范围重叠的部分中选择的。

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

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

例如,当为音频端口驱动程序的接收器引脚和另一个筛选器(通常是 KMixer 系统驱动程序)的源引脚协商通用格式时,SysAudio 首先获取源引脚的数据范围数组。 然后,SysAudio 将 KSPROPERTY_PIN_DATAINTERSECTION 请求发送到汇点引脚,同时包含源引脚的数据范围数组。 内核流层拦截请求,然后按顺序对源引脚的数据范围数组中的每个元素,依次迭代调用端口驱动程序的数据交集处理程序,直到处理程序成功找到一个数据交集。

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

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

总之,查找源引脚数据范围与汇流引脚数据范围之间交集的过程是一个迭代过程:

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

  • 在内部循环中,端口驱动程序从第一个数组元素开始,遍历接收插针的数据范围数组中的连续元素。

搜索一旦找到第一个数据交集就会停止。 此过程倾向于优先选择位于每个引脚数据范围数组起始部分的元素。 为引脚指定数据范围数组时,适配器驱动程序应通过将数据范围放置在首选格式的数组开头来对数组元素进行排序。