summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mixer.cpp10
1 files changed, 6 insertions, 4 deletions
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;
}