KBATEXTENSIBLE 结构 (ksmedia.h)

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

语法

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

成员

Format

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

Samples

Samples.wValidBitsPerSample

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

Samples.wSamplesPerBlock

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

Samples.wReserved

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

dwChannelMask

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

SubFormat

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

注解

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

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

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

波形图XTENSIBLE 结构的 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 成员中 (;请参阅 波形图X) 设置为 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 set-property 请求将硬件设备设置为这些扬声器配置之一。 有关设置扬声器配置的详细信息,请参阅 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 的含义类似于波形图X 结构的 wFormatTag 成员中 16 位格式标记的含义。

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

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

为了向后兼容,可由独立WAVEATEX 结构指定的任何波形格式也可以由WAVEATEXTENSIBLE 结构定义。 因此,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 之间转换”。

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

要求

   
Header ksmedia.h (包括 mmreg.h、Ksmedia.h、mmreg.h)

另请参阅

KSAUDIO_CHANNEL_CONFIG

波形