<?php
/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <info@getid3.org>               //
//  available at http://getid3.sourceforge.net                 //
//            or http://www.getid3.org                         //
/////////////////////////////////////////////////////////////////
// See readme.txt for more details                             //
/////////////////////////////////////////////////////////////////
//                                                             //
// module.audio-video.riff.php                                 //
// module for analyzing RIFF files                             //
// multiple formats supported by this module:                  //
//    Wave, AVI, AIFF/AIFC, (MP3,AC3)/RIFF, Wavpack v3, 8SVX   //
// dependencies: module.audio.mp3.php                          //
//               module.audio.ac3.php (optional)               //
//               module.audio.dts.php (optional)               //
//                                                            ///
/////////////////////////////////////////////////////////////////

getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true);

class
getid3_riff
{

    function
getid3_riff(&$fd, &$ThisFileInfo) {

        
// initialize these values to an empty array, otherwise they default to NULL
        // and you can't append array values to a NULL value
        
$ThisFileInfo['riff'] = array('raw'=>array());

        
// Shortcuts
        
$thisfile_riff             = &$ThisFileInfo['riff'];
        
$thisfile_riff_raw         = &$thisfile_riff['raw'];
        
$thisfile_audio            = &$ThisFileInfo['audio'];
        
$thisfile_video            = &$ThisFileInfo['video'];
        
$thisfile_avdataoffset     = &$ThisFileInfo['avdataoffset'];
        
$thisfile_avdataend        = &$ThisFileInfo['avdataend'];
        
$thisfile_audio_dataformat = &$thisfile_audio['dataformat'];
        
$thisfile_riff_audio       = &$thisfile_riff['audio'];
        
$thisfile_riff_video       = &$thisfile_riff['video'];


        
$Original['avdataoffset'] = $thisfile_avdataoffset;
        
$Original['avdataend']    = $thisfile_avdataend;

        
fseek($fd, $thisfile_avdataoffset, SEEK_SET);
        
$RIFFheader = fread($fd, 12);
        
$RIFFsubtype = substr($RIFFheader, 8, 4);
        switch (
substr($RIFFheader, 0, 4)) {
            case
'FORM':
                
$ThisFileInfo['fileformat']   = 'aiff';
                
$RIFFheaderSize               = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($RIFFheader, 4, 4));
                
$thisfile_riff[$RIFFsubtype]  = getid3_riff::ParseRIFF($fd, $thisfile_avdataoffset + 12, $thisfile_avdataoffset + $RIFFheaderSize, $ThisFileInfo);
                
$thisfile_riff['header_size'] = $RIFFheaderSize;
                break;

            case
'RIFF':
            case
'SDSS':  // SDSS is identical to RIFF, just renamed. Used by SmartSound QuickTracks (www.smartsound.com)
            
case 'RMP3':  // RMP3 is identical to RIFF, just renamed. Used by [unknown program] when creating RIFF-MP3s
                
if ($RIFFsubtype == 'RMP3') {
                    
// RMP3 is identical to WAVE, just renamed. Used by [unknown program] when creating RIFF-MP3s
                    
$RIFFsubtype = 'WAVE';
                }

                
$ThisFileInfo['fileformat']   = 'riff';
                
$RIFFheaderSize               = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($RIFFheader, 4, 4));
                
$thisfile_riff[$RIFFsubtype]  = getid3_riff::ParseRIFF($fd, $thisfile_avdataoffset + 12, $thisfile_avdataoffset + $RIFFheaderSize, $ThisFileInfo);
                
$thisfile_riff['header_size'] = $RIFFheaderSize;
                if (
$RIFFsubtype == 'WAVE') {
                    
$thisfile_riff_WAVE = &$thisfile_riff['WAVE'];
                }
                break;

            default:
                
$ThisFileInfo['error'][] = 'Cannot parse RIFF (this is maybe not a RIFF / WAV / AVI file?) - expecting "FORM|RIFF|SDSS|RMP3" found "'.$RIFFsubtype.'" instead';
                unset(
$ThisFileInfo['fileformat']);
                return
false;
                break;
        }

        
$streamindex = 0;
        switch (
$RIFFsubtype) {
            case
'WAVE':
                if (empty(
$thisfile_audio['bitrate_mode'])) {
                    
$thisfile_audio['bitrate_mode'] = 'cbr';
                }
                if (empty(
$thisfile_audio_dataformat)) {
                    
$thisfile_audio_dataformat = 'wav';
                }

                if (isset(
$thisfile_riff_WAVE['data'][0]['offset'])) {
                    
$thisfile_avdataoffset = $thisfile_riff_WAVE['data'][0]['offset'] + 8;
                    
$thisfile_avdataend    = $thisfile_avdataoffset + $thisfile_riff_WAVE['data'][0]['size'];
                }
                if (isset(
$thisfile_riff_WAVE['fmt '][0]['data'])) {

                    
$thisfile_riff_audio[$streamindex] = getid3_riff::RIFFparseWAVEFORMATex($thisfile_riff_WAVE['fmt '][0]['data']);
                    
$thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag'];
                    if (@
$thisfile_riff_audio[$streamindex]['bitrate'] == 0) {
                        
$ThisFileInfo['error'][] = 'Corrupt RIFF file: bitrate_audio == zero';
                        return
false;
                    }
                    
$thisfile_riff_raw['fmt '] = $thisfile_riff_audio[$streamindex]['raw'];
                    unset(
$thisfile_riff_audio[$streamindex]['raw']);
                    
$thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex];

                    
$thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]);
                    if (
substr($thisfile_audio['codec'], 0, strlen('unknown: 0x')) == 'unknown: 0x') {
                        
$ThisFileInfo['warning'][] = 'Audio codec = '.$thisfile_audio['codec'];
                    }
                    
$thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate'];

                    
$ThisFileInfo['playtime_seconds'] = (float) ((($thisfile_avdataend - $thisfile_avdataoffset) * 8) / $thisfile_audio['bitrate']);

                    
$thisfile_audio['lossless'] = false;
                    if (isset(
$thisfile_riff_WAVE['data'][0]['offset']) && isset($thisfile_riff_raw['fmt ']['wFormatTag'])) {
                        switch (
$thisfile_riff_raw['fmt ']['wFormatTag']) {

                            case
0x0001:  // PCM
                                
$thisfile_audio['lossless'] = true;
                                break;

                            case
0x2000:  // AC-3
                                
$thisfile_audio_dataformat = 'ac3';
                                break;

                            default:
                                
// do nothing
                                
break;

                        }
                    }
                    
$thisfile_audio['streams'][$streamindex]['wformattag']   = $thisfile_audio['wformattag'];
                    
$thisfile_audio['streams'][$streamindex]['bitrate_mode'] = $thisfile_audio['bitrate_mode'];
                    
$thisfile_audio['streams'][$streamindex]['lossless']     = $thisfile_audio['lossless'];
                    
$thisfile_audio['streams'][$streamindex]['dataformat']   = $thisfile_audio_dataformat;
                }

                if (isset(
$thisfile_riff_WAVE['rgad'][0]['data'])) {

                    
// shortcuts
                    
$rgadData = &$thisfile_riff_WAVE['rgad'][0]['data'];
                    
$thisfile_riff_raw['rgad']    = array('track'=>array(), 'album'=>array());
                    
$thisfile_riff_raw_rgad       = &$thisfile_riff_raw['rgad'];
                    
$thisfile_riff_raw_rgad_track = &$thisfile_riff_raw_rgad['track'];
                    
$thisfile_riff_raw_rgad_album = &$thisfile_riff_raw_rgad['album'];

                    
$thisfile_riff_raw_rgad['fPeakAmplitude']      =               getid3_lib::LittleEndian2Float(substr($rgadData, 0, 4));
                    
$thisfile_riff_raw_rgad['nRadioRgAdjust']      = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($rgadData, 4, 2));
                    
$thisfile_riff_raw_rgad['nAudiophileRgAdjust'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($rgadData, 6, 2));

                    
$nRadioRgAdjustBitstring      = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nRadioRgAdjust']), 16, '0', STR_PAD_LEFT);
                    
$nAudiophileRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nAudiophileRgAdjust']), 16, '0', STR_PAD_LEFT);
                    
$thisfile_riff_raw_rgad_track['name']       = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 0, 3));
                    
$thisfile_riff_raw_rgad_track['originator'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 3, 3));
                    
$thisfile_riff_raw_rgad_track['signbit']    = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 6, 1));
                    
$thisfile_riff_raw_rgad_track['adjustment'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 7, 9));
                    
$thisfile_riff_raw_rgad_album['name']       = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 0, 3));
                    
$thisfile_riff_raw_rgad_album['originator'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 3, 3));
                    
$thisfile_riff_raw_rgad_album['signbit']    = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 6, 1));
                    
$thisfile_riff_raw_rgad_album['adjustment'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 7, 9));

                    
$thisfile_riff['rgad']['peakamplitude'] = $thisfile_riff_raw_rgad['fPeakAmplitude'];
                    if ((
$thisfile_riff_raw_rgad_track['name'] != 0) && ($thisfile_riff_raw_rgad_track['originator'] != 0)) {
                        
$thisfile_riff['rgad']['track']['name']            = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_track['name']);
                        
$thisfile_riff['rgad']['track']['originator']      = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_track['originator']);
                        
$thisfile_riff['rgad']['track']['adjustment']      = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_track['adjustment'], $thisfile_riff_raw_rgad_track['signbit']);
                    }
                    if ((
$thisfile_riff_raw_rgad_album['name'] != 0) && ($thisfile_riff_raw_rgad_album['originator'] != 0)) {
                        
$thisfile_riff['rgad']['album']['name']       = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_album['name']);
                        
$thisfile_riff['rgad']['album']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_album['originator']);
                        
$thisfile_riff['rgad']['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_album['adjustment'], $thisfile_riff_raw_rgad_album['signbit']);
                    }
                }

                if (isset(
$thisfile_riff_WAVE['fact'][0]['data'])) {
                    
$thisfile_riff_raw['fact']['NumberOfSamples'] = getid3_riff::EitherEndian2Int($ThisFileInfo, substr($thisfile_riff_WAVE['fact'][0]['data'], 0, 4));

                    
// This should be a good way of calculating exact playtime,
                    // but some sample files have had incorrect number of samples,
                    // so cannot use this method

                    // if (!empty($thisfile_riff_raw['fmt ']['nSamplesPerSec'])) {
                    //     $ThisFileInfo['playtime_seconds'] = (float) $thisfile_riff_raw['fact']['NumberOfSamples'] / $thisfile_riff_raw['fmt ']['nSamplesPerSec'];
                    // }
                
}
                if (!empty(
$thisfile_riff_raw['fmt ']['nAvgBytesPerSec'])) {
                    
$thisfile_audio['bitrate'] = getid3_lib::CastAsInt($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'] * 8);
                }

                if (isset(
$thisfile_riff_WAVE['bext'][0]['data'])) {
                    
// shortcut
                    
$thisfile_riff_WAVE_bext_0 = &$thisfile_riff_WAVE['bext'][0];

                    
$thisfile_riff_WAVE_bext_0['title']          =                         trim(substr($thisfile_riff_WAVE_bext_0['data'],   0, 256));
                    
$thisfile_riff_WAVE_bext_0['author']         =                         trim(substr($thisfile_riff_WAVE_bext_0['data'], 256,  32));
                    
$thisfile_riff_WAVE_bext_0['reference']      =                         trim(substr($thisfile_riff_WAVE_bext_0['data'], 288,  32));
                    
$thisfile_riff_WAVE_bext_0['origin_date']    =                              substr($thisfile_riff_WAVE_bext_0['data'], 320,  10);
                    
$thisfile_riff_WAVE_bext_0['origin_time']    =                              substr($thisfile_riff_WAVE_bext_0['data'], 330,   8);
                    
$thisfile_riff_WAVE_bext_0['time_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 338,   8));
                    
$thisfile_riff_WAVE_bext_0['bwf_version']    = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 346,   1));
                    
$thisfile_riff_WAVE_bext_0['reserved']       = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 347, 254));
                    
$thisfile_riff_WAVE_bext_0['coding_history'] =         explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601)));

                    
$thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime(
                                                                                
substr($thisfile_riff_WAVE_bext_0['origin_time'], 0, 2),
                                                                                
substr($thisfile_riff_WAVE_bext_0['origin_time'], 3, 2),
                                                                                
substr($thisfile_riff_WAVE_bext_0['origin_time'], 6, 2),
                                                                                
substr($thisfile_riff_WAVE_bext_0['origin_date'], 5, 2),
                                                                                
substr($thisfile_riff_WAVE_bext_0['origin_date'], 8, 2),
                                                                                
substr($thisfile_riff_WAVE_bext_0['origin_date'], 0, 4));

                    
$thisfile_riff['comments']['author'][] = $thisfile_riff_WAVE_bext_0['author'];
                    
$thisfile_riff['comments']['title'][]  = $thisfile_riff_WAVE_bext_0['title'];
                }

                if (isset(
$thisfile_riff_WAVE['MEXT'][0]['data'])) {
                    
// shortcut
                    
$thisfile_riff_WAVE_MEXT_0 = &$thisfile_riff_WAVE['MEXT'][0];

                    
$thisfile_riff_WAVE_MEXT_0['raw']['sound_information']      = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 0, 2));
                    
$thisfile_riff_WAVE_MEXT_0['flags']['homogenous']           = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0001);
                    if (
$thisfile_riff_WAVE_MEXT_0['flags']['homogenous']) {
                        
$thisfile_riff_WAVE_MEXT_0['flags']['padding']          = ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0002) ? false : true;
                        
$thisfile_riff_WAVE_MEXT_0['flags']['22_or_44']         =        (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0004);
                        
$thisfile_riff_WAVE_MEXT_0['flags']['free_format']      =        (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0008);

                        
$thisfile_riff_WAVE_MEXT_0['nominal_frame_size']        = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 2, 2));
                    }
                    
$thisfile_riff_WAVE_MEXT_0['anciliary_data_length']         = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 6, 2));
                    
$thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def']     = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 8, 2));
                    
$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_left']  = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0001);
                    
$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_free']  = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0002);
                    
$thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_right'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0004);
                }

                if (isset(
$thisfile_riff_WAVE['cart'][0]['data'])) {
                    
// shortcut
                    
$thisfile_riff_WAVE_cart_0 = &$thisfile_riff_WAVE['cart'][0];

                    
$thisfile_riff_WAVE_cart_0['version']              =                  substr($thisfile_riff_WAVE_cart_0['data'],    0,    4);
                    
$thisfile_riff_WAVE_cart_0['title']                =             trim(substr($thisfile_riff_WAVE_cart_0['data'],    4,   64));
                    
$thisfile_riff_WAVE_cart_0['artist']               =             trim(substr($thisfile_riff_WAVE_cart_0['data'],   68,   64));
                    
$thisfile_riff_WAVE_cart_0['cut_id']               =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  132,   64));
                    
$thisfile_riff_WAVE_cart_0['client_id']            =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  196,   64));
                    
$thisfile_riff_WAVE_cart_0['category']             =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  260,   64));
                    
$thisfile_riff_WAVE_cart_0['classification']       =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  324,   64));
                    
$thisfile_riff_WAVE_cart_0['out_cue']              =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  388,   64));
                    
$thisfile_riff_WAVE_cart_0['start_date']           =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  452,   10));
                    
$thisfile_riff_WAVE_cart_0['start_time']           =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  462,    8));
                    
$thisfile_riff_WAVE_cart_0['end_date']             =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  470,   10));
                    
$thisfile_riff_WAVE_cart_0['end_time']             =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  480,    8));
                    
$thisfile_riff_WAVE_cart_0['producer_app_id']      =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  488,   64));
                    
$thisfile_riff_WAVE_cart_0['producer_app_version'] =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  552,   64));
                    
$thisfile_riff_WAVE_cart_0['user_defined_text']    =             trim(substr($thisfile_riff_WAVE_cart_0['data'],  616,   64));
                    
$thisfile_riff_WAVE_cart_0['zero_db_reference']    = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'],  680,    4), true);
                    for (
$i = 0; $i < 8; $i++) {
                        
$thisfile_riff_WAVE_cart_0['post_time'][$i]['usage_fourcc'] =                  substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8), 4);
                        
$thisfile_riff_WAVE_cart_0['post_time'][$i]['timer_value']  = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8) + 4, 4));
                    }
                    
$thisfile_riff_WAVE_cart_0['url']              =                 trim(substr($thisfile_riff_WAVE_cart_0['data'],  748, 1024));
                    
$thisfile_riff_WAVE_cart_0['tag_text']         = explode("\r\n", trim(substr($thisfile_riff_WAVE_cart_0['data'], 1772)));

                    
$thisfile_riff['comments']['artist'][] = $thisfile_riff_WAVE_cart_0['artist'];
                    
$thisfile_riff['comments']['title'][]  = $thisfile_riff_WAVE_cart_0['title'];
                }

                if (!isset(
$thisfile_audio['bitrate']) && isset($thisfile_riff_audio[$streamindex]['bitrate'])) {
                    
$thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate'];
                    
$ThisFileInfo['playtime_seconds'] = (float) ((($thisfile_avdataend - $thisfile_avdataoffset) * 8) / $thisfile_audio['bitrate']);
                }

                if (!empty(
$ThisFileInfo['wavpack'])) {
                    
$thisfile_audio_dataformat = 'wavpack';
                    
$thisfile_audio['bitrate_mode'] = 'vbr';
                    
$thisfile_audio['encoder']      = 'WavPack v'.$ThisFileInfo['wavpack']['version'];

                    
// Reset to the way it was - RIFF parsing will have messed this up
                    
$thisfile_avdataend        = $Original['avdataend'];
                    
$thisfile_audio['bitrate'] = (($thisfile_avdataend - $thisfile_avdataoffset) * 8) / $ThisFileInfo['playtime_seconds'];

                    
fseek($fd, $thisfile_avdataoffset - 44, SEEK_SET);
                    
$RIFFdata = fread($fd, 44);
                    
$OrignalRIFFheaderSize = getid3_lib::LittleEndian2Int(substr($RIFFdata,  4, 4)) +  8;
                    
$OrignalRIFFdataSize   = getid3_lib::LittleEndian2Int(substr($RIFFdata, 40, 4)) + 44;

                    if (
$OrignalRIFFheaderSize > $OrignalRIFFdataSize) {
                        
$thisfile_avdataend -= ($OrignalRIFFheaderSize - $OrignalRIFFdataSize);
                        
fseek($fd, $thisfile_avdataend, SEEK_SET);
                        
$RIFFdata .= fread($fd, $OrignalRIFFheaderSize - $OrignalRIFFdataSize);
                    }

                    
// move the data chunk after all other chunks (if any)
                    // so that the RIFF parser doesn't see EOF when trying
                    // to skip over the data chunk
                    
$RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8);
                    
getid3_riff::ParseRIFFdata($RIFFdata, $ThisFileInfo);
                }

                if (isset(
$thisfile_riff_raw['fmt ']['wFormatTag'])) {
                    switch (
$thisfile_riff_raw['fmt ']['wFormatTag']) {
                        case
0x08AE: // ClearJump LiteWave
                            
$thisfile_audio['bitrate_mode'] = 'vbr';
                            
$thisfile_audio_dataformat   = 'litewave';

                            
//typedef struct tagSLwFormat {
                            //  WORD    m_wCompFormat;     // low byte defines compression method, high byte is compression flags
                            //  DWORD   m_dwScale;         // scale factor for lossy compression
                            //  DWORD   m_dwBlockSize;     // number of samples in encoded blocks
                            //  WORD    m_wQuality;        // alias for the scale factor
                            //  WORD    m_wMarkDistance;   // distance between marks in bytes
                            //  WORD    m_wReserved;
                            //
                            //  //following paramters are ignored if CF_FILESRC is not set
                            //  DWORD   m_dwOrgSize;       // original file size in bytes
                            //  WORD    m_bFactExists;     // indicates if 'fact' chunk exists in the original file
                            //  DWORD   m_dwRiffChunkSize; // riff chunk size in the original file
                            //
                            //  PCMWAVEFORMAT m_OrgWf;     // original wave format
                            // }SLwFormat, *PSLwFormat;

                            // shortcut
                            
$thisfile_riff['litewave']['raw'] = array();
                            
$thisfile_riff_litewave     = &$thisfile_riff['litewave'];
                            
$thisfile_riff_litewave_raw = &$thisfile_riff_litewave['raw'];

                            
$thisfile_riff_litewave_raw['compression_method'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 18, 1));
                            
$thisfile_riff_litewave_raw['compression_flags']  = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 19, 1));
                            
$thisfile_riff_litewave_raw['m_dwScale']          = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 20, 4));
                            
$thisfile_riff_litewave_raw['m_dwBlockSize']      = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 24, 4));
                            
$thisfile_riff_litewave_raw['m_wQuality']         = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 28, 2));
                            
$thisfile_riff_litewave_raw['m_wMarkDistance']    = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 30, 2));
                            
$thisfile_riff_litewave_raw['m_wReserved']        = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 32, 2));
                            
$thisfile_riff_litewave_raw['m_dwOrgSize']        = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 34, 4));
                            
$thisfile_riff_litewave_raw['m_bFactExists']      = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], 38, 2));
                            
$thisfile_riff_litewave_raw['m_dwRiffChunkSize']  = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0