我正在学习 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

由于Format.cbSize是22,这是整个结构;没有 SubFormat GUID 来提供有关样本的更多信息。这看起来很奇怪,因为格式标记是 WAVE_FORMAT_EXTENSIBLE ,我认为这意味着您必须依赖 Subformat GUID 来确定实际格式。

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

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

最佳答案

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



如果您查看 WAVEFORMATEXTENSIBLE 的定义,它以 WAVEFORMATEX 开头,然后包含额外的数据:

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

这是 WAVEFORMATEX 数据之后的最少 22 个字节。
SubFormat 字段包含您要查找的格式值。

关于c++ - 从 IAudioClient::GetMixFormat 解释 WAVEFORMATEXTENSIBLE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41876857/

10-11 18:38