|
1
|
1 #pragma once
|
|
|
2
|
|
|
3 struct fb2k_wfx {
|
|
|
4 audio_chunk::spec_t spec;
|
|
|
5 bool bFloat;
|
|
|
6 unsigned bps;
|
|
|
7 void parse( const WAVEFORMATEX * wfx ) {
|
|
|
8 spec.sampleRate = wfx->nSamplesPerSec;
|
|
|
9 spec.chanCount = wfx->nChannels;
|
|
|
10 spec.chanMask = audio_chunk::g_guess_channel_config( spec.chanCount );
|
|
|
11 bps = wfx->wBitsPerSample;
|
|
|
12 switch( wfx->wFormatTag ) {
|
|
|
13 case WAVE_FORMAT_PCM:
|
|
|
14 bFloat = false; break;
|
|
|
15 case WAVE_FORMAT_IEEE_FLOAT:
|
|
|
16 bFloat = true; break;
|
|
|
17 case WAVE_FORMAT_EXTENSIBLE:
|
|
|
18 {
|
|
|
19 auto wfxe = (const WAVEFORMATEXTENSIBLE*) wfx;
|
|
|
20 auto newMask = audio_chunk::g_channel_config_from_wfx( wfxe->dwChannelMask );
|
|
|
21 if ( audio_chunk::g_count_channels(newMask) == spec.chanCount ) {
|
|
|
22 spec.chanMask = newMask;
|
|
|
23 }
|
|
|
24 if ( wfxe->SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT ) {
|
|
|
25 bFloat = true;
|
|
|
26 } else if ( wfxe->SubFormat == KSDATAFORMAT_SUBTYPE_PCM ) {
|
|
|
27 bFloat = false;
|
|
|
28 } else {
|
|
|
29 throw exception_io_data();
|
|
|
30 }
|
|
|
31 }
|
|
|
32 break;
|
|
|
33 default:
|
|
|
34 throw exception_io_data();
|
|
|
35 }
|
|
|
36
|
|
|
37 }
|
|
|
38 }; |