2017-01-26 1028 views
1

我正在学习Windows核心音频API。使用这种Rendering a Stream例子,我发现IAudioClient::GetMixFormat返回一个暧昧WAVEFORMATEXTENSIBLE,看起来像这样:从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位采样通道。我怎样才能确定这些样本是整数还是浮点值?

[标签显然是Apple API的标签。是否有适用于Windows核心音频不同的标签]

回答

4

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

+0

D'oh!感谢您的澄清。 –