diff options
author | Max Horn | 2003-08-02 17:22:52 +0000 |
---|---|---|
committer | Max Horn | 2003-08-02 17:22:52 +0000 |
commit | 4cc8c70f25731ab22bc50baecfe47b031a4638c6 (patch) | |
tree | 17beb6d9c819799ac78c03d84cb68c0e48ede536 /sound | |
parent | d82969b3768ea8634adcb06b394cc45d38213e9f (diff) | |
download | scummvm-rg350-4cc8c70f25731ab22bc50baecfe47b031a4638c6.tar.gz scummvm-rg350-4cc8c70f25731ab22bc50baecfe47b031a4638c6.tar.bz2 scummvm-rg350-4cc8c70f25731ab22bc50baecfe47b031a4638c6.zip |
optimize code flow a little
svn-id: r9419
Diffstat (limited to 'sound')
-rw-r--r-- | sound/rate.cpp | 43 |
1 files changed, 18 insertions, 25 deletions
diff --git a/sound/rate.cpp b/sound/rate.cpp index b1be58ebdf..2ae24595c9 100644 --- a/sound/rate.cpp +++ b/sound/rate.cpp @@ -44,6 +44,8 @@ * * Limited to sampling frequency <= 65535 Hz. */ + +template<bool stereo, bool reverseStereo> class LinearRateConverter : public RateConverter { protected: bool _reverseStereo; @@ -62,23 +64,10 @@ protected: /** current sample(s) in the input stream (left/right channel) */ st_sample_t icur[2]; - /** Rate convert data from the given input stream and write the result into obuf. */ - template<bool stereo, int leftChannel> - int st_rate_flow(AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol); public: - LinearRateConverter(st_rate_t inrate, st_rate_t outrate, bool reverseStereo); - - virtual int flow(AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) { - if (input.isStereo()) { - if (_reverseStereo) - return st_rate_flow<true, 1>(input, obuf, osamp, vol); - else - return st_rate_flow<true, 0>(input, obuf, osamp, vol); - } else - return st_rate_flow<false, 0>(input, obuf, osamp, vol); - } - - virtual int drain(st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) { + LinearRateConverter(st_rate_t inrate, st_rate_t outrate); + int flow(AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol); + int drain(st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) { return (ST_SUCCESS); } }; @@ -87,8 +76,8 @@ public: /* * Prepare processing. */ -LinearRateConverter::LinearRateConverter(st_rate_t inrate, st_rate_t outrate, bool reverseStereo) - : _reverseStereo(reverseStereo) { +template<bool stereo, bool reverseStereo> +LinearRateConverter<stereo, reverseStereo>::LinearRateConverter(st_rate_t inrate, st_rate_t outrate) { unsigned long incr; if (inrate == outrate) { @@ -118,15 +107,13 @@ LinearRateConverter::LinearRateConverter(st_rate_t inrate, st_rate_t outrate, bo * Processed signed long samples from ibuf to obuf. * Return number of samples processed. */ -template<bool stereo, int leftChannel> -int LinearRateConverter::st_rate_flow(AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) +template<bool stereo, bool reverseStereo> +int LinearRateConverter<stereo, reverseStereo>::flow(AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) { st_sample_t *ostart, *oend; st_sample_t out; unsigned long tmp; - assert(leftChannel == 0 || leftChannel == 1); - ostart = obuf; oend = obuf + *osamp * 2; @@ -152,7 +139,7 @@ int LinearRateConverter::st_rate_flow(AudioInputStream &input, st_sample_t *obuf while (ipos > opos + 1) { // interpolate - out = (st_sample_t) (ilast[leftChannel] + (((icur[leftChannel] - ilast[leftChannel]) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS)); + out = (st_sample_t) (ilast[reverseStereo ? 1 : 0] + (((icur[reverseStereo ? 1 : 0] - ilast[reverseStereo ? 1 : 0]) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS)); // adjust volume out = out * vol / 256; @@ -161,7 +148,7 @@ int LinearRateConverter::st_rate_flow(AudioInputStream &input, st_sample_t *obuf if (stereo) { // interpolate - out = (st_sample_t) (ilast[1-leftChannel] + (((icur[1-leftChannel] - ilast[1-leftChannel]) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS)); + out = (st_sample_t) (ilast[reverseStereo ? 0 : 1] + (((icur[reverseStereo ? 0 : 1] - ilast[reverseStereo ? 0 : 1]) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS)); // adjust volume out = out * vol / 256; } @@ -222,7 +209,13 @@ public: */ RateConverter *makeRateConverter(st_rate_t inrate, st_rate_t outrate, bool stereo, bool reverseStereo) { if (inrate != outrate) { - return new LinearRateConverter(inrate, outrate, reverseStereo); + if (stereo) { + if (reverseStereo) + return new LinearRateConverter<true, true>(inrate, outrate); + else + return new LinearRateConverter<true, false>(inrate, outrate); + } else + return new LinearRateConverter<false, false>(inrate, outrate); //return new ResampleRateConverter(inrate, outrate, 1); } else { if (stereo) { |