可扩展的波形格式描述符

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

Diagram illustrating a wave-format descriptor for an audio stream.

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

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

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

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

  • KSPROPERTY_PIN_DATAINTERSECTION get-property 请求会检索如上图所示的格式描述符。

  • KSPROPERTY_PIN_PROPOSEDATAFORMAT set-property 请求会接受如上图所示的格式描述符。

  • 类似的格式用于 KsCreatePin 函数的 Connect 调用参数。 此参数指向缓冲区(其中也包含格式描述符)开头的 KSPIN_CONNECT 结构。 紧跟 KSPIN_CONNECT 结构的格式描述符以如上图所示的 KSDATAFORMAT 结构开头。

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

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

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

通过添加三个成员(从 Samples.wValidBitsPerSample 开始)来扩展 WAVEFORMATEX。 (Samples 是一个联合,其另一个成员 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 位的倍数。