mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-02-04 13:23:46 +00:00
(svn r18835) -Fix: Large sounds could still cause an overflow with high sample rates, causing them to be cut off.
This commit is contained in:
parent
15adbad2f4
commit
df06c14f61
@ -33,6 +33,7 @@ struct MixerChannel {
|
|||||||
|
|
||||||
static MixerChannel _channels[8];
|
static MixerChannel _channels[8];
|
||||||
static uint32 _play_rate = 11025;
|
static uint32 _play_rate = 11025;
|
||||||
|
static uint32 _max_size = UINT_MAX;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The theoretical maximum volume for a single sound sample. Multiple sound
|
* 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;
|
mc->frac_speed = (rate << 16) / _play_rate;
|
||||||
|
|
||||||
|
if (is16bit) size /= 2;
|
||||||
|
|
||||||
/* adjust the magnitude to prevent overflow */
|
/* adjust the magnitude to prevent overflow */
|
||||||
while (size & ~0xFFFF) {
|
while (size >= _max_size) {
|
||||||
size >>= 1;
|
size >>= 1;
|
||||||
rate = (rate >> 1) + 1;
|
rate = (rate >> 1) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int div = is16bit ? 2 : 1;
|
mc->samples_left = (uint)size * _play_rate / rate;
|
||||||
|
|
||||||
mc->samples_left = (uint)size * _play_rate / rate / div;
|
|
||||||
mc->is16bit = is16bit;
|
mc->is16bit = is16bit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,5 +201,6 @@ void MxActivateChannel(MixerChannel *mc)
|
|||||||
bool MxInitialize(uint rate)
|
bool MxInitialize(uint rate)
|
||||||
{
|
{
|
||||||
_play_rate = rate;
|
_play_rate = rate;
|
||||||
|
_max_size = UINT_MAX / _play_rate;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user