Changeset - r14273:79f9c8f3fcad
[Not reviewed]
master
0 1 0
peter1138 - 14 years ago 2010-01-16 22:15:02
peter1138@openttd.org
(svn r18835) -Fix: Large sounds could still cause an overflow with high sample rates, causing them to be cut off.
1 file changed with 6 insertions and 4 deletions:
0 comments (0 inline, 0 general)
src/mixer.cpp
Show inline comments
 
@@ -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
 

	
 
	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;
 
}
0 comments (0 inline, 0 general)