diff options
author | Max Horn | 2007-06-16 23:07:25 +0000 |
---|---|---|
committer | Max Horn | 2007-06-16 23:07:25 +0000 |
commit | a435757699352ff6afa0caf40c6db7335062bf23 (patch) | |
tree | 0a688f506f2616759f3bf23f3ca0ca48ad608533 | |
parent | 1281707d294e8851df83b5a7588df1b00f83b914 (diff) | |
download | scummvm-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.cpp | 38 |
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); } |