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)
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)
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
00059 case 1:
00060 codec = (bitsPerSample == 8 || endianess () == LittleEndian) ?
00061 _alutCodecLinear : _alutCodecPCM16;
00062 break;
00063
00064 case 7:
00065 bitsPerSample *= 2;
00066 codec = _alutCodecULaw;
00067 break;
00068 default:
00069 return NULL;
00070 }
00071 }
00072 else if(magic == 0x64617461)
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 }