我正在学习Windows Core Audio API。使用此whos
示例,我发现Rendering a Stream返回的模糊IAudioClient::GetMixFormat看起来像这样:
Format
wFormatTag = WAVE_FORMAT_EXTENSIBLE (65534)
nChannels = 2
nSamplesPerSec = 48000
nAvgBytesPerSec = 384000
nBlockAlign = 8
wBitsPerSample = 32
cbSize = 22
Samples // this is a union
wValidBitsPerSample = 32
wSamplesPerBlock = 32
wReserved = 32
由于Format.cbSize
是22,这是整个结构;没有SubFormat
GUID来提供有关样本的更多信息。这看起来很奇怪,因为格式标记是WAVE_FORMAT_EXTENSIBLE
,我认为这意味着你必须依靠Subformat
GUID来确定实际的格式。
我可以看到有两个32位采样通道。如何确定这些样本是整数还是浮点值?
[WAVEFORMATEXTENSIBLE标记显然适用于Apple API。 Windows Core Audio是否有不同的标签?]
答案 0 :(得分:5)
22是WAVEFORMATEX
数据后面的其他数据的大小:
CBSIZE
附加到
WAVEFORMATEX
结构末尾的额外格式信息的大小(以字节为单位)。非PCM格式可以使用此信息来存储wFormatTag
的额外属性。如果wFormatTag
不需要额外信息,则必须将此成员设置为0.对于WAVE_FORMAT_PCM
格式(仅WAVE_FORMAT_PCM
格式),将忽略此成员。 当此结构包含在WAVEFORMATEXTENSIBLE
结构中时,此值必须至少为22 。
如果您查看WAVEFORMATEXTENSIBLE
的定义,则会以WAVEFORMATEX
开头,然后在其后面包含额外数据:
typedef struct {
WAVEFORMATEX Format;
union {
WORD wValidBitsPerSample;
WORD wSamplesPerBlock;
WORD wReserved;
} Samples;
DWORD dwChannelMask;
GUID SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
WAVEFORMATEX
数据后至少22个字节。
SubFormat
字段包含您要查找的格式值。