fixed audio decoding bug, sounds can play now!

git-svn-id: svn://anubis/anaglym/trunk@285 99a6e188-d820-4881-8870-2d33a10e2619
This commit is contained in:
Josh Holtrop 2010-06-23 03:47:08 +00:00
parent a4024bfd2c
commit 1705af029d

16
AV.cc
View File

@ -191,7 +191,7 @@ bool AV::Sound::load(FileLoader & fileLoader, const FileLoader::Path & path)
desired.format = AUDIO_S16SYS; desired.format = AUDIO_S16SYS;
desired.rate = SOUND_RATE; desired.rate = SOUND_RATE;
m_ss = Sound_NewSample(m_rwops, NULL, &desired, m_ss = Sound_NewSample(m_rwops, NULL, &desired,
CALLBACK_SAMPLES * BYTES_PER_SAMPLE * CHANNELS); CALLBACK_SAMPLES * BYTES_PER_SAMPLE);
if (m_ss != NULL) if (m_ss != NULL)
{ {
return true; return true;
@ -211,11 +211,7 @@ void AV::Sound::play()
{ {
if (m_ss != NULL) if (m_ss != NULL)
{ {
#if 0
cerr << "play()" << endl;
Sound_Rewind(m_ss); Sound_Rewind(m_ss);
cerr << "end play()" << endl;
#endif
m_av.playSound(this); m_av.playSound(this);
} }
} }
@ -233,6 +229,7 @@ int AV::Sound::decode(Uint8 * stream, int len)
int len_decoded = 0, len_decoded_now; int len_decoded = 0, len_decoded_now;
int samples_decoded_now; int samples_decoded_now;
int spos = 0; int spos = 0;
int len_samples = len / BYTES_PER_SAMPLE;
int16_t * s16stream = (int16_t *) stream; int16_t * s16stream = (int16_t *) stream;
int16_t * decoded_stream = (int16_t *) m_ss->buffer; int16_t * decoded_stream = (int16_t *) m_ss->buffer;
do do
@ -240,11 +237,16 @@ int AV::Sound::decode(Uint8 * stream, int len)
len_decoded_now = Sound_Decode(m_ss); len_decoded_now = Sound_Decode(m_ss);
samples_decoded_now = len_decoded_now / BYTES_PER_SAMPLE; samples_decoded_now = len_decoded_now / BYTES_PER_SAMPLE;
len_decoded += len_decoded_now; len_decoded += len_decoded_now;
for (int i = 0; i < samples_decoded_now; i++) for (int i = 0; i < samples_decoded_now; i++, spos++)
{ {
if (spos >= len_samples)
{
cerr << "Sorry, anaglym bug in " __FILE__ ":" << __LINE__
<< ": rework sound buffer sizes" << endl;
exit(33);
}
int val = s16stream[spos] + decoded_stream[i]; int val = s16stream[spos] + decoded_stream[i];
s16stream[spos] = (val > SHRT_MAX) ? SHRT_MAX : val; s16stream[spos] = (val > SHRT_MAX) ? SHRT_MAX : val;
spos++;
} }
} while ( (len_decoded_now == (int) m_ss->buffer_size) } while ( (len_decoded_now == (int) m_ss->buffer_size)
&& (len_decoded < len) ); && (len_decoded < len) );