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 小于 Format。wBitsPerSample, (实际 PCM 数据) 的有效位在容器中左对齐。 容器中最小有效部分中未使用的位应设置为零。
示例容器以字节边界开头和结尾,值为 Format。wBitsPerSample 应始终是 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 中。
作为第二个示例,如果 nChannels 在 Format 成员中 (;请参阅 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) |