当前位置:  开发笔记 > 编程语言 > 正文

从IAudioClient :: GetMixFormat解释WAVEFORMATEXTENSIBLE

如何解决《从IAudioClient::GetMixFormat解释WAVEFORMATEXTENSIBLE》经验,为你挑选了1个好方法。

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

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

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



1> Roman R...:

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;

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

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

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有