从IAudioClient :: GetMixFormat解释WAVEFORMATEXTENSIBLE

Adr*_*thy 3 c++ audio winapi wasapi

我正在学习Windows Core Audio API.使用这个Rendering a Stream示例,我发现IAudioClient :: GetMixFormat返回一个模糊的WAVEFORMATEXTENSIBLE,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

Format.cbSize22岁起,这就是整个结构; 没有SubFormatGUID可以提供有关样本的更多信息.这看起来很奇怪,因为格式标签是WAVE_FORMAT_EXTENSIBLE- 我认为 - 意味着您必须依靠SubformatGUID来确定实际格式.

我可以看到有两个32位采样通道.如何确定这些样本是整数还是浮点值?

[ 标签显然是用于Apple API.Windows Core Audio是否有不同的标签?]

Rom*_* R. 5

22是数据后面的附加数据的大小WAVEFORMATEX:

CBSIZE

附加到WAVEFORMATEX结构末尾的额外格式信息的大小(以字节为单位).非PCM格式可以使用此信息来存储额外的属性wFormatTag.如果不需要额外信息,则必须wFormatTag将此成员设置为0.对于WAVE_FORMAT_PCM格式(仅限WAVE_FORMAT_PCM格式),将忽略此成员.当此结构包含在WAVEFORMATEXTENSIBLE结构中时,此值必须至少为22.

如果你看一下定义WAVEFORMATEXTENSIBLE,它以a开头,WAVEFORMATEX然后包含额外的数据:

typedef struct {
  WAVEFORMATEX Format;
  union {
    WORD wValidBitsPerSample;
    WORD wSamplesPerBlock;
    WORD wReserved;
  } Samples;
  DWORD        dwChannelMask;
  GUID         SubFormat;
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
Run Code Online (Sandbox Code Playgroud)

这是WAVEFORMATEX数据之后的最少22个字节.

SubFormat字段包含您要查找的格式值.