5 #include "cWavDecoder.h" 8 #if CAUDIO_COMPILE_WITH_WAV_DECODER == 1 12 cWavDecoder::cWavDecoder(IDataSource* stream) : IAudioDecoder(stream), Valid(false)
14 const char* RIFFTAG =
"RIFF";
15 const char* WAVETAG =
"WAVE";
16 const char* FORMATTAG =
"fmt ";
17 const char* DATATAG =
"data";
23 unsigned int startOffset = 0;
26 Stream->seek(0,
false);
27 Stream->read(ident, 4);
29 if(strncmp(ident, RIFFTAG, 4) == 0)
31 Stream->read(&tempint32, 4);
35 Stream->read(ident, 4);
37 if(strncmp(ident, WAVETAG, 4) == 0)
40 startOffset = Stream->getCurrentPos();
45 Stream->read(ident, 4);
47 while((strncmp(ident, FORMATTAG, 4) != 0) && (Stream->getCurrentPos() < Stream->getSize()));
50 if(Stream->getCurrentPos() < (Stream->getSize() - 16))
53 Stream->read(&tempint32, 4);
57 Stream->read(&tempint16, 2);
60 Stream->read(&tempint16, 2);
63 if(Channels == 1 || Channels == 2)
65 Stream->read(&tempint32, 4);
66 SampleRate = tempint32;
67 Stream->read(&tempint32, 4);
69 Stream->read(&tempint16, 2);
70 BlockAlign = tempint16;
71 Stream->read(&tempint16, 2);
72 BitsPerSample = tempint16;
75 if(BitsPerSample == 8 || BitsPerSample == 16)
78 Stream->seek(startOffset,
false);
82 Stream->read(ident, 4);
84 while((strncmp(ident, DATATAG, 4) != 0) && (Stream->getCurrentPos() < Stream->getSize()));
87 if(Stream->getCurrentPos() < Stream->getSize())
90 Stream->read(&tempint32, 4);
92 DataOffset = Stream->getCurrentPos();
106 cWavDecoder::~cWavDecoder()
120 if(Channels == 1 && BitsPerSample == 8)
121 return EAF_8BIT_MONO;
122 else if(Channels == 1 && BitsPerSample == 16)
123 return EAF_16BIT_MONO;
124 else if(Channels == 2 && BitsPerSample == 8)
125 return EAF_8BIT_STEREO;
127 return EAF_16BIT_STEREO;
130 int cWavDecoder::getFrequency()
135 bool cWavDecoder::isSeekingSupported()
140 bool cWavDecoder::isValid()
145 int cWavDecoder::readAudioData(
void* output,
int amount)
147 int currentPos = Stream->getCurrentPos();
148 int startPos = DataOffset;
149 int endPos = DataOffset + DataSize;
150 int amountToRead = amount;
153 if(currentPos > endPos)
156 if(currentPos < startPos)
158 Stream->seek(startPos,
false);
159 currentPos = Stream->getCurrentPos();
162 if((currentPos + amountToRead) > endPos)
163 amountToRead = endPos - currentPos;
168 return Stream->read(output,amountToRead);
172 bool cWavDecoder::setPosition(
int position,
bool relative)
174 int currentPos = Stream->getCurrentPos();
175 int startPos = DataOffset;
176 int endPos = DataOffset + DataSize;
179 if(!relative && position < startPos)
181 if(!relative && position > endPos)
183 if(relative && currentPos + position < startPos)
184 position = startPos - currentPos;
185 if(relative && currentPos + position > startPos)
186 position = endPos - currentPos;
188 Stream->seek(position,relative);
192 bool cWavDecoder::seek(
float seconds,
bool relative)
194 int amountToSeek = (int) (seconds * (
float)SampleRate * (float)Channels * (
float)(BitsPerSample/8));
195 return setPosition(amountToSeek, relative);
198 float cWavDecoder::getTotalTime()
200 return (
float)Stream->getSize() / ((float)SampleRate * (
float)Channels * (float)(BitsPerSample/8));
203 int cWavDecoder::getTotalSize()
205 return Stream->getSize();
208 int cWavDecoder::getCompressedSize()
210 return Stream->getSize();
213 float cWavDecoder::getCurrentTime()
215 return (
float)Stream->getCurrentPos() / ((float)SampleRate * (
float)Channels * (float)(BitsPerSample/8));
218 int cWavDecoder::getCurrentPosition()
220 return Stream->getCurrentPos();
223 int cWavDecoder::getCurrentCompressedPosition()
225 return Stream->getCurrentPos();
228 cAudioString cWavDecoder::getType()
const 230 return cAudioString(_CTEXT(
"cWavDecoder"));
AudioFormats
Enumeration of audio formats supported by the engine.
Main namespace for the entire cAudio library.