mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-10 04:43:26 +00:00
Made the calculation of _samples_per_tick a bit less prone to arithmetic
overflow. It failed if the output rate was 44100 Hz. (It didn't use to, but somewhere along the line an unsigned value was changed to a signed. This seemed like a better fix, though.) svn-id: r15610
This commit is contained in:
parent
4d3913d1b2
commit
61e438df22
@ -54,7 +54,14 @@ public:
|
||||
|
||||
int open() {
|
||||
_isOpen = true;
|
||||
_samples_per_tick = (getRate() << FIXP_SHIFT) / BASE_FREQ;
|
||||
|
||||
int d = getRate() / BASE_FREQ;
|
||||
int r = getRate() % BASE_FREQ;
|
||||
|
||||
// This is equivalent to (getRate() << FIXP_SHIFT) / BASE_FREQ
|
||||
// but less prone to arithmetic overflow.
|
||||
|
||||
_samples_per_tick = (d << FIXP_SHIFT) + (r << FIXP_SHIFT) / BASE_FREQ;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -71,11 +78,12 @@ public:
|
||||
const int stereoFactor = isStereo() ? 2 : 1;
|
||||
int len = numSamples / stereoFactor;
|
||||
int step;
|
||||
|
||||
|
||||
do {
|
||||
step = len;
|
||||
if (step > (_next_tick >> FIXP_SHIFT))
|
||||
step = (_next_tick >> FIXP_SHIFT);
|
||||
|
||||
generate_samples(data, step);
|
||||
|
||||
_next_tick -= step << FIXP_SHIFT;
|
||||
|
Loading…
x
Reference in New Issue
Block a user