• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

src/audio/src/utilWAV.cpp

Go to the documentation of this file.
00001 #pragma once
00002 #include "../h/OpenAL.h"
00003 
00004 namespace REAL
00005 {
00006         namespace GRAPHIC
00007         {
00008                 BufferData* loadWavFile(InputStream *stream)
00009                 {
00010                         ALboolean found_header = AL_FALSE;
00011                         unsigned int chunkLength;
00012                         int magic;
00013                         unsigned short audioFormat;
00014                         unsigned short numChannels;
00015                         unsigned int sampleFrequency;
00016                         unsigned int byteRate;
00017                         unsigned short blockAlign;
00018                         unsigned short bitsPerSample;
00019                         Codec *codec = _alutCodecLinear;
00020 
00021                         if(!_alutInputStreamReadUInt32LE(stream, &chunkLength) ||
00022                                 !_alutInputStreamReadInt32BE(stream, &magic))
00023                         {
00024                                 return NULL;
00025                         }
00026 
00027                         if(magic != 0x57415645)      /* "WAVE" */
00028                         {
00029                                 return NULL;
00030                         }
00031 
00032                         for(;;)
00033                         {
00034                                 if(!_alutInputStreamReadInt32BE(stream, &magic) ||
00035                                         !_alutInputStreamReadUInt32LE(stream, &chunkLength))
00036                                         return NULL;
00037 
00038                                 if(magic == 0x666d7420)  /* "fmt " */
00039                                 {
00040                                         found_header = AL_TRUE;
00041 
00042                                         if(chunkLength < 16)
00043                                                 return NULL;
00044 
00045                                         if(!_alutInputStreamReadUInt16LE (stream, &audioFormat) ||
00046                                                 !_alutInputStreamReadUInt16LE (stream, &numChannels) ||
00047                                                 !_alutInputStreamReadUInt32LE (stream, &sampleFrequency) ||
00048                                                 !_alutInputStreamReadUInt32LE (stream, &byteRate) ||
00049                                                 !_alutInputStreamReadUInt16LE (stream, &blockAlign) ||
00050                                                 !_alutInputStreamReadUInt16LE (stream, &bitsPerSample))
00051                                                 return NULL;
00052 
00053                                         if(!_alutInputStreamSkip (stream, chunkLength - 16))
00054                                                 return NULL;
00055 
00056                                         switch(audioFormat)
00057                                         {
00058                                         // PCM
00059                                         case 1:
00060                                                 codec = (bitsPerSample == 8 || endianess () == LittleEndian) ?
00061                                                         _alutCodecLinear : _alutCodecPCM16;
00062                                                 break;
00063                                         // uLaw
00064                                         case 7:
00065                                                 bitsPerSample *= 2;
00066                                                 codec = _alutCodecULaw;
00067                                                 break;
00068                                         default:
00069                                                 return NULL;
00070                                         }
00071                                 }
00072                                 else if(magic == 0x64617461) // "data"
00073                                 {
00074                                         ALvoid *data;
00075                                         if(!found_header)
00076                                                 return NULL;
00077 
00078                                         data = _alutInputStreamRead(stream, chunkLength);
00079                                         if(data == NULL)
00080                                                 return NULL;
00081 
00082                                         return codec(data, chunkLength, numChannels, bitsPerSample,
00083                                                 (ALfloat) sampleFrequency);
00084                                 }
00085                                 else
00086                                 {
00087                                         if(!_alutInputStreamSkip(stream, chunkLength))
00088                                                 return NULL;
00089                                 }
00090 
00091                                 if((chunkLength & 1) && !_alutInputStreamEOF (stream)
00092                                         && !_alutInputStreamSkip (stream, 1))
00093                                         return NULL;
00094                         }
00095                 }
00096         }
00097 }

Generated on Fri Jun 18 2010 17:48:39 for Cannonball by  doxygen 1.7.0