WAVEFORMATEXTENSIBLE 结构 (ksmedia.h)

WAVEFORMATEXTENSIBLE 结构指定音频波流的格式。

语法

typedef struct {
  WAVEFORMATEX Format;
  union {
    WORD wValidBitsPerSample;
    WORD wSamplesPerBlock;
    WORD wReserved;
  } Samples;
  DWORD        dwChannelMask;
  GUID         SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;

成员

Format

指定流的波形数据格式。 此成员是 WAVEFORMATEX 类型的结构。 WAVEFORMATEX 的 wFormat 成员应设置为 WAVE_FORMAT_EXTENSIBLE。 WAVEFORMATEX 的 wBitsPerSample 成员明确定义为每个样本的容器大小。 示例容器始终是字节对齐的, wBitsPerSample 必须是 8 的倍数。

Samples

Samples.wValidBitsPerSample

指定样本的精度(以位为单位)。 此成员的值应小于或等于 Format 中指定的容器大小。wBitsPerSample 成员。 有关更多信息,请参见下面的“备注”部分。

Samples.wSamplesPerBlock

指定一个压缩块中包含的样本数。 此值可用于估算每个块中样本数固定的压缩格式的缓冲区需求。 如果每个压缩音频数据块包含可变数量的样本,则将此成员设置为零。 在这种情况下,必须以其他方式获取缓冲区估计和缓冲区位置信息。

Samples.wReserved

保留供操作系统内部使用。 初始化为零。

dwChannelMask

指定将多声道流中的声道分配给说话人位置。 编码与用于 KSAUDIO_CHANNEL_CONFIG 结构的 ActiveSpeakerPositions 成员的编码相同。 有关详细信息,请参阅备注部分。

SubFormat

指定子格式。 有关详细信息,请参阅备注部分。

注解

WAVEFORMATEXTENSIBLE 是 WAVEFORMATEX 结构的扩展形式。 WAVEFORMATEX 只能明确描述由 WAVEFORMATEXTENSIBLE 描述的格式的子集。 WAVEFORMATEXTENSIBLE 不受 WAVEFORMATEX 的限制,后者无法明确指定具有两个以上通道的格式,或者每个样本的有效位数不等于样本容器大小。 有关详细信息,请参阅 音频数据格式和数据范围

通常,指定样本精度的 wValidBitsPerSample 成员包含与 Format 相同的值。wBitsPerSample 成员,用于指定示例容器大小。 但是,这些值可能不同。 例如,如果波形数据源自 20 位 A/D 转换器,则 wValidBitsPerSample 应为 20,但 格式wBitsPerSample 可能是 24 或 32。 如果 wValidBitsPerSample 小于 FormatwBitsPerSample, (实际 PCM 数据) 的有效位在容器中左对齐。 容器中最小有效部分中未使用的位应设置为零。

示例容器以字节边界开头和结尾,值为 FormatwBitsPerSample 应始终是 8 的倍数。 此外, wValidBitsPerSample 的值不应超过 Format 的值。wBitsPerSample。 驱动程序应拒绝违反这些规则的波形格式。

WAVEFORMATEXTENSIBLE 结构的 dwChannelMask 成员包含一个掩码,指示多通道流中存在哪些通道。 最低有效位表示左前扬声器,下一位对应于右前扬声器,依此而行。 以下标志位在头文件 Ksmedia.h 中定义。

扬声器位置 标志位
SPEAKER_FRONT_LEFT 0x1
SPEAKER_FRONT_RIGHT 0x2
SPEAKER_FRONT_CENTER 0x4
SPEAKER_LOW_FREQUENCY 0x8
SPEAKER_BACK_LEFT 0x10
SPEAKER_BACK_RIGHT 0x20
SPEAKER_FRONT_LEFT_OF_CENTER 0x40
SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
SPEAKER_BACK_CENTER 0x100
SPEAKER_SIDE_LEFT 0x200
SPEAKER_SIDE_RIGHT 0x400
SPEAKER_TOP_CENTER 0x800
SPEAKER_TOP_FRONT_LEFT 0x1000
SPEAKER_TOP_FRONT_CENTER 0x2000
SPEAKER_TOP_FRONT_RIGHT 0x4000
SPEAKER_TOP_BACK_LEFT 0x8000
SPEAKER_TOP_BACK_CENTER 0x10000
SPEAKER_TOP_BACK_RIGHT 0x20000

dwChannelMask 中指定的通道应按上表所示的顺序存在,从顶部开始。

例如,如果仅指定左前和前中心,则左前和前中心应分别位于交错流的通道 0 和 1 中。

作为第二个示例,如果 nChannelsFormat 成员中 (;请参阅 WAVEFORMATEX) 设置为 4,dwChannelMask 设置为 0x00000033,音频通道用于播放到左前、右前、左后和右后扬声器。 通道数据应在每个块中按该顺序交错。

超出预定义的通道位置被视为保留位置。

或者,可以将通道掩码指定为以下常量之一,这些常量在 Ksmedia.h 中定义,并且是前面表示标准扬声器配置的标志的按位 ORed 组合:

KSAUDIO_SPEAKER_MONO

KSAUDIO_SPEAKER_STEREO

KSAUDIO_SPEAKER_QUAD

KSAUDIO_SPEAKER_SURROUND

KSAUDIO_SPEAKER_5POINT1

KSAUDIO_SPEAKER_7POINT1

KSAUDIO_SPEAKER_DIRECTOUT

可以通过 KSPROPERTY_AUDIO_CHANNEL_CONFIG 设置属性请求将硬件设备设置为这些扬声器配置之一。 有关设置扬声器配置的详细信息,请参阅 KSAUDIO_CHANNEL_CONFIG

通常, nChannels 中的计数等于 dwChannelMask 中设置的位数,但并不一定如此。 如果 nChannels 小于 dwChannelMask 中设置的位数,则会忽略 dwChannelMask 中最重要的 () 位。 如果 nChannels 超出了 dwChannelMask 中设置的位数,则没有相应掩码位的声道不会分配给任何物理扬声器位置。 在除 KSAUDIO_SPEAKER_DIRECTOUT 以外的任何扬声器配置中,音频接收器(如 KMixer ()都可以看到 KMixer 系统驱动程序) 只是忽略这些多余的声道,只混合具有相应掩码位的声道。

KSAUDIO_SPEAKER_DIRECTOUT表示没有扬声器的配置,在 Ksmedia.h 中定义为零。 在此配置中,音频设备将第一个通道呈现到设备上的第一个端口,将第二个通道呈现到设备上的第二个端口,依此类而行。 这允许音频创作应用程序直接输出多声道数据,而无需修改设备(如数字混音器或数字音频存储设备), (硬盘或 ADAT) 。 例如,通道 0 到 30 可能分别包含鼓、吉他、低音、语音等。 对于此类原始音频数据,说话人位置毫无意义,将说话人位置分配给输入或输出流可能会导致 KMixer 等组件通过执行不需要的格式转换进行不当干预。 如果设备无法处理原始音频流,则应拒绝将扬声器配置更改为KSAUDIO_SPEAKER_DIRECTOUT的请求。 有关详细信息,请参阅 DSSPEAKER_DIRECTOUT 扬声器配置

有关多声道配置的详细信息,请参阅音频技术网站上的多声道音频数据和 WAVE 文件白皮书。

SubFormat 成员包含指定波流的常规数据格式的 GUID。 例如,此 GUID 可能指定流包含整数 PCM 数据。 其他成员提供其他信息,例如样本大小和通道数。 SubFormat GUID 的含义类似于 WAVEFORMATEX 结构的 wFormatTag 成员中 16 位格式标记的含义。

在 Windows 98 第二版中引入 WAVEFORMATEXTENSIBLE 之前,WAVEFORMATEX 是指定波形格式的首选结构。 当时,供应商需要向 Microsoft 注册每个新波形格式,以便可以为该格式分配官方格式标记。 公共头文件 Mmreg.h 中会显示已注册格式标记的列表。

使用 WAVEFORMATEXTENSIBLE 时,不再需要注册格式。 供应商可以根据需要将 SubFormat GUID 独立分配给其新格式。 但是,Microsoft 在公共头文件 Ksmedia.h 中列出了一些更常用的 SubFormat GUID。 在定义新的 SubFormat GUID 之前,供应商应在 Ksmedia.h 中检查KSDATAFORMAT_SUBTYPE_Xxx 常量列表,以查看是否已为特定格式定义了适当的 GUID。

为了向后兼容,可由独立 WAVEFORMATEX 结构指定的任何波形格式也可以由 WAVEFORMATEXTENSIBLE 结构定义。 因此,Mmreg.h 中的每个格式标记都有相应的 SubFormat GUID。 下表显示了一些典型的格式标记及其相应的 SubFormat GUID。

格式标记 SubFormat GUID
WAVE_FORMAT_PCM KSDATAFORMAT_SUBTYPE_PCM
WAVE_FORMAT_IEEE_FLOAT KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
WAVE_FORMAT_DRM KSDATAFORMAT_SUBTYPE_DRM
WAVE_FORMAT_ALAW KSDATAFORMAT_SUBTYPE_ALAW
WAVE_FORMAT_MULAW KSDATAFORMAT_SUBTYPE_MULAW
WAVE_FORMAT_ADPCM KSDATAFORMAT_SUBTYPE_ADPCM

有关详细信息,请参阅 在格式标记和子格式 GUID 之间转换

由于 WAVEFORMATEXTENSIBLE 是 WAVEFORMATEX 的扩展版本,因此它可以描述不能由 WAVEFORMATEX 单独描述的其他格式。 供应商可以自由定义自己的 SubFormat GUID,以识别不存在波形格式标记的专有格式。

要求

要求
Header ksmedia.h (包括 Mmreg.h、Ksmedia.h、Mmreg.h)

另请参阅

KSAUDIO_CHANNEL_CONFIG

WAVEFORMATEX