From df06c14f610dfce9f3acd8638fc40df16b0d148e Mon Sep 17 00:00:00 2001 From: peter1138 Date: Sat, 16 Jan 2010 22:15:02 +0000 Subject: (svn r18835) -Fix: Large sounds could still cause an overflow with high sample rates, causing them to be cut off. --- src/mixer.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src/mixer.cpp') diff --git a/src/mixer.cpp b/src/mixer.cpp index 6fcdcb11f..1b054f4e3 100644 --- a/src/mixer.cpp +++ b/src/mixer.cpp @@ -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; } -- cgit v1.2.3-54-g00ecf