(svn r18835) -Fix: Large sounds could still cause an overflow with high sample rates, causing them to be cut off.

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
peter1138 15 years ago
parent 15adbad2f4
commit df06c14f61

@ -33,6 +33,7 @@ struct MixerChannel {
static MixerChannel _channels[8];
static uint32 _play_rate = 11025;
static uint32 _max_size = UINT_MAX;
/**
* The theoretical maximum volume for a single sound sample. Multiple sound
@ -172,15 +173,15 @@ void MxSetChannelRawSrc(MixerChannel *mc, int8 *mem, size_t size, uint rate, boo
mc->frac_speed = (rate << 16) / _play_rate;
if (is16bit) size /= 2;
/* adjust the magnitude to prevent overflow */
while (size & ~0xFFFF) {
while (size >= _max_size) {
size >>= 1;
rate = (rate >> 1) + 1;
}
int div = is16bit ? 2 : 1;
mc->samples_left = (uint)size * _play_rate / rate / div;
mc->samples_left = (uint)size * _play_rate / rate;
mc->is16bit = is16bit;
}
@ -200,5 +201,6 @@ void MxActivateChannel(MixerChannel *mc)
bool MxInitialize(uint rate)
{
_play_rate = rate;
_max_size = UINT_MAX / _play_rate;
return true;
}

Loading…
Cancel
Save