aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2007-06-16 23:07:25 +0000
committerMax Horn2007-06-16 23:07:25 +0000
commita435757699352ff6afa0caf40c6db7335062bf23 (patch)
tree0a688f506f2616759f3bf23f3ca0ca48ad608533
parent1281707d294e8851df83b5a7588df1b00f83b914 (diff)
downloadscummvm-rg350-a435757699352ff6afa0caf40c6db7335062bf23.tar.gz
scummvm-rg350-a435757699352ff6afa0caf40c6db7335062bf23.tar.bz2
scummvm-rg350-a435757699352ff6afa0caf40c6db7335062bf23.zip
Avoid using the 'st_sample_t out[2]' arrays inside tight loops, as some compilers are bad at optimizing array access due to pointer aliasing
svn-id: r27499
-rw-r--r--sound/rate.cpp38
1 files changed, 22 insertions, 16 deletions
diff --git a/sound/rate.cpp b/sound/rate.cpp
index d755ff9281..541f314088 100644
--- a/sound/rate.cpp
+++ b/sound/rate.cpp
@@ -137,18 +137,20 @@ int SimpleRateConverter<stereo, reverseStereo>::flow(AudioStream &input, st_samp
}
} while (opos >= 0);
- st_sample_t out[2];
- out[reverseStereo ] = *inPtr++;
- out[reverseStereo ^ 1] = (stereo ? *inPtr++ : out[reverseStereo]);
+ st_sample_t out0, out1;
+ out0 = *inPtr++;
+ out1 = (stereo ? *inPtr++ : out0);
// Increment output position
opos += opos_inc;
// output left channel
- clampedAdd(*obuf++, (out[0] * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
+ clampedAdd(obuf[reverseStereo ], (out0 * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
// output right channel
- clampedAdd(*obuf++, (out[1] * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+ clampedAdd(obuf[reverseStereo ^ 1], (out1 * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+
+ obuf += 2;
}
the_end:
return (ST_SUCCESS);
@@ -258,17 +260,19 @@ int LinearRateConverter<stereo, reverseStereo>::flow(AudioStream &input, st_samp
// still space in the output buffer.
while (0 > opos) {
// interpolate
- st_sample_t out[2];
- out[reverseStereo ] = (st_sample_t)(ilast0 + (((icur0 - ilast0) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS));
- out[reverseStereo ^ 1] = (stereo ?
+ st_sample_t out0, out1;
+ out0 = (st_sample_t)(ilast0 + (((icur0 - ilast0) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS));
+ out1 = (stereo ?
(st_sample_t)(ilast1 + (((icur1 - ilast1) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS)) :
- out[reverseStereo]);
+ out0);
// output left channel
- clampedAdd(*obuf++, (out[0] * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
+ clampedAdd(obuf[reverseStereo ], (out0 * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
// output right channel
- clampedAdd(*obuf++, (out[1] * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+ clampedAdd(obuf[reverseStereo ^ 1], (out1 * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+
+ obuf += 2;
// Increment output position
long tmp = opos_frac + opos_inc_frac;
@@ -323,15 +327,17 @@ public:
// Mix the data into the output buffer
ptr = _buffer;
for (; len > 0; len -= (stereo ? 2 : 1)) {
- st_sample_t tmp[2];
- tmp[reverseStereo ] = *ptr++;
- tmp[reverseStereo ^ 1] = (stereo ? *ptr++ : tmp[reverseStereo]);
+ st_sample_t out0, out1;
+ out0 = *ptr++;
+ out1 = (stereo ? *ptr++ : out0);
// output left channel
- clampedAdd(*obuf++, (tmp[0] * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
+ clampedAdd(obuf[reverseStereo ], (out0 * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
// output right channel
- clampedAdd(*obuf++, (tmp[1] * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+ clampedAdd(obuf[reverseStereo ^ 1], (out1 * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+
+ obuf += 2;
}
return (ST_SUCCESS);
}