从IAudioClient :: GetMixFormat解释WAVEFORMATEXTENSIBLE

时间:2017-01-26 15:22:50

标签: c++ winapi audio wasapi

我正在学习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是否有不同的标签?]

1 个答案:

答案 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字段包含您要查找的格式值。