2017-01-26 21 views
1

私はWindows Core Audio 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ビットのサンプルが2つあることがわかります。これらのサンプルが整数か浮動小数点値かどうかをどのように判断できますか?

[タグは明らかにApple API用です。 WindowsのCore Audioのための異なるタグがある]

答えて

4

22はWAVEFORMATEXデータを以下の追加データのサイズされています?

cbSizeの

追加余分なフォーマット情報のバイト単位のサイズ、 WAVEFORMATEX構造の末尾に移動します。この情報は、wFormatTagの余分な属性を格納するために非PCM形式で使用できます。 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!説明をありがとう。 –