+ p_sys->fmt.audio.i_blockalign = GetWLE( &p_wf->nBlockAlign );
+ p_sys->fmt.i_bitrate = GetDWLE( &p_wf->nAvgBytesPerSec ) * 8;
+ p_sys->fmt.audio.i_bitspersample = GetWLE( &p_wf->wBitsPerSample );
+ if( i_size >= sizeof(WAVEFORMATEX) )
+ p_sys->fmt.i_extra = __MIN( GetWLE( &p_wf->cbSize ), i_size - sizeof(WAVEFORMATEX) );
+ i_extended = 0;
+
+ /* Handle new WAVE_FORMAT_EXTENSIBLE wav files */
+ /* see the following link for more information:
+ * http://www.microsoft.com/whdc/device/audio/multichaud.mspx#EFAA */
+ if( GetWLE( &p_wf->wFormatTag ) == WAVE_FORMAT_EXTENSIBLE &&
+ i_size >= sizeof( WAVEFORMATEXTENSIBLE ) &&
+ ( p_sys->fmt.i_extra + sizeof( WAVEFORMATEX )
+ >= sizeof( WAVEFORMATEXTENSIBLE ) ) )
+ {
+ unsigned i, i_channel_mask;
+ GUID guid_subformat;
+
+ guid_subformat = p_wf_ext->SubFormat;
+ guid_subformat.Data1 = GetDWLE( &p_wf_ext->SubFormat.Data1 );
+ guid_subformat.Data2 = GetWLE( &p_wf_ext->SubFormat.Data2 );
+ guid_subformat.Data3 = GetWLE( &p_wf_ext->SubFormat.Data3 );
+
+ sf_tag_to_fourcc( &guid_subformat, &p_sys->fmt.i_codec, &psz_name );
+
+ i_extended = sizeof( WAVEFORMATEXTENSIBLE ) - sizeof( WAVEFORMATEX );
+ p_sys->fmt.i_extra -= i_extended;
+
+ i_channel_mask = GetDWLE( &p_wf_ext->dwChannelMask );
+ if( i_channel_mask )
+ {
+ for( i = 0; i < sizeof(pi_channels_src)/sizeof(uint32_t); i++ )
+ {
+ if( i_channel_mask & pi_channels_src[i] )
+ p_sys->i_channel_mask |= pi_channels_in[i];
+ }
+
+ if( p_sys->fmt.i_codec == VLC_FOURCC('a','r','a','w') ||
+ p_sys->fmt.i_codec == VLC_FOURCC('p','c','m',' ') ||
+ p_sys->fmt.i_codec == VLC_FOURCC('a','f','l','t') )
+
+ p_sys->b_chan_reorder =
+ aout_CheckChannelReorder( pi_channels_in, pi_channels_out,
+ p_sys->i_channel_mask,
+ p_sys->fmt.audio.i_channels,
+ p_sys->pi_chan_table );
+
+ msg_Dbg( p_demux, "channel mask: %x, reordering: %i",
+ p_sys->i_channel_mask, (int)p_sys->b_chan_reorder );
+ }
+ p_sys->fmt.audio.i_physical_channels =
+ p_sys->fmt.audio.i_original_channels =
+ p_sys->i_channel_mask;
+ }