可扩展 Wave-Format 描述符

下图显示了波形音频流的数据格式描述符。

用于音频流的波形格式描述符的图解。

如图所示, KSDATAFORMAT 结构后面的附加格式信息量因数据格式而异。

音频系统通过多种方式使用这种类型的格式描述符:

  • 如上图所示的格式描述符作为对微型端口驱动程序 的 NewStream 方法的调用参数传递(例如,请参阅 IMiniportWaveCyclic::NewStream)。

  • IMiniport::D ataRangeIntersection 方法的 ResultantFormat 参数指向一个缓冲区,该方法将写入格式描述符,如上图所示。

  • KSPROPERTY_PIN_DATAINTERSECTION 获取属性请求检索一个格式描述符,类似于前图所示的格式描述符。

  • KSPROPERTY_PIN_PROPOSEDATAFORMAT 设置属性请求接受如上图所示的格式描述符。

  • KsCreatePin 函数的 Connect 调用参数使用类似的格式。 此参数指向缓冲区开头的 KSPIN_CONNECT 结构,该结构还包含格式描述符。 紧接在 KSPIN_CONNECT 结构之后的格式描述符以 KSDATAFORMAT 结构为开头,如上图所示。

KSDATAFORMAT 结构后面的格式信息应该是 WAVEFORMATEXTENSIBLE 结构。 WAVEFORMATEXTENSIBLE 是 WAVEFORMATEX 的扩展版本,可以描述比 WAVEFORMATEX 更广泛的格式。

WAVEFORMAT 已过时,并且不受 Microsoft Windows 任何版本中的 WDM 音频子系统支持。 PCMWAVEFORMAT 结构是 WAVEFORMAT 结构的一个扩展版本,也已过时。

四个波形格式结构---WAVEAT、PCMWAVEFORMAT、WAVEATEX 和WAVEATEXTENSIBLE-全部以相同的五个成员开头,从 wFormatTag 开始。 上图显示了叠加在一起的这四个结构,以突出显示相同结构的各个部分。

WAVEFORMATEXTENSIBLE 通过添加三个成员变量(从 Samples.wValidBitsPerSample 开始)来扩展 WAVEFORMATEX。 (示例 是一个联合体,其中的另一个成员 wValidSamplesPerBlock 被用于某些压缩格式,而替代了 wValidBitsPerSample。)wFormatTag 成员紧接在缓冲区中 KSDATAFORMAT 结构的末尾,指定了接下来的 KSDATAFORMAT 格式信息的类型。

与 WAVEFORMATEX 不同,WAVEFORMATEXTENSIBLE 可以执行以下作:

  1. 分别指定每个样本的位数和样本容器的大小。 例如,可以将 20 位样本左对齐存储在三字节容器中。 WAVEFORMATEX无法区分每个样本的数据位数与样本容器大小,因此无法明确描述这种格式。

  2. 将特定扬声器位置分配给多声道流中的音频通道。 WAVEFORMATEX 缺乏此功能,并且只能充分支持单声道和(双声道)立体声流。

旧版 WAVEFORMATEX 的使用

任何 WAVEFORMATEX 描述的格式也可以由 WAVEFORMATEXTENSIBLE 描述。 有关将 WAVEFORMATEX 结构转换为 WAVEFORMATEXTENSIBLE 的信息,请参阅 在格式标记和子格式 GUID 之间转换

WAVEFORMATEX 足以描述样本大小为 8 位或 16 位的格式,但要充分描述样本精度大于 16 位的格式,WAVEFORMATEXTENSIBLE 是必需的。 这里是两个示例:

  • 采样精度为 24 位的流可以使用 32 位容器大小进行高效处理,但可以转换为使用 24 位容器来提高存储效率,而不会丢失数据。

  • 在处理具有 24 位样本数据的流时,仅支持 20 位精度的呈现设备可以使用抖动来改善其输出信号的保真度。 抖动处理需要额外的处理时间,但如果原始流的精度仅为 20 位,则这种额外的处理是没有必要的。

在这两个示例中,只有在已知样本精度和容器大小时,才能在处理和存储效率之间进行正确的权衡,从而保留信号质量。

如果一个简单的格式可以通过WAVEFORMATEX或WAVEFORMATEXTENSIBLE结构明确描述,那么音频驱动程序可以选择其中任一个结构来描述该格式。 但是,音频驱动程序通常使用 WAVEFORMATEX 来指定具有 8 位或 16 位样本的单声道和(双声道)立体声 PCM 格式,并且某些较旧的应用程序可能希望所有音频驱动程序都使用 WAVEFORMATEX 来指定这些格式。

如果驱动程序支持可以明确指定为WAVEFORMATEX或WAVEFORMATEXTENSIBLE结构的音频格式,则无论客户端应用程序或组件使用哪种结构来指定格式,驱动程序都应识别该格式。 例如,如果音频设备支持 44.1-kHz、16 位立体声 PCM 格式,微型端口驱动程序的 KSPROPERTY_PIN_PROPOSEDATAFORMAT 属性处理程序及其 NewStream 方法的实现应接受该格式,无论该格式是指定为 WAVEFORMATEX 还是 WAVEFORMATEXTENSIBLE 结构。

为了简化格式数据的处理,驱动程序通常使用 WAVEFORMATEXTENSIBLE 结构在内部表示格式。 此方法可能需要将输入的 WAVEFORMATEX 结构转换为内部的 WAVEFORMATEXTENSIBLE 表示,或将内部的 WAVEFORMATEXTENSIBLE 表示转换为输出的 WAVEFORMATEX 结构。

在 WAVEFORMATEXTENSIBLE 中, dwBitsPerSample 是容器大小, wValidBitsPerSample 是每个样本的有效数据位数。 容器在内存中始终是字节对齐的,并且容器大小必须指定为 8 字节的倍数。