diff options
author | Max Horn | 2003-08-02 16:11:12 +0000 |
---|---|---|
committer | Max Horn | 2003-08-02 16:11:12 +0000 |
commit | e3b64fa7578896d23db09d6d6ed952aaf70467ed (patch) | |
tree | 1ec03dc37bd719b5045ebe3cd079ad2a55458386 /sound/rate.h | |
parent | 1bd9026d8ab0bf7fca1b81d8d15e22068f6cc0d3 (diff) | |
download | scummvm-rg350-e3b64fa7578896d23db09d6d6ed952aaf70467ed.tar.gz scummvm-rg350-e3b64fa7578896d23db09d6d6ed952aaf70467ed.tar.bz2 scummvm-rg350-e3b64fa7578896d23db09d6d6ed952aaf70467ed.zip |
added FLAG_REVERSE_STEREO support
svn-id: r9416
Diffstat (limited to 'sound/rate.h')
-rw-r--r-- | sound/rate.h | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/sound/rate.h b/sound/rate.h index 9a33e4ee2a..d7691538f3 100644 --- a/sound/rate.h +++ b/sound/rate.h @@ -58,8 +58,9 @@ public: }; class LinearRateConverter : public RateConverter { + bool _reverseStereo; public: - LinearRateConverter(st_rate_t inrate, st_rate_t outrate); + 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); virtual int drain(st_sample_t *obuf, st_size_t *osamp, st_volume_t vol); }; @@ -72,19 +73,19 @@ public: virtual int drain(st_sample_t *obuf, st_size_t *osamp, st_volume_t vol); }; -template<bool stereo> +template<bool stereo, bool reverseStereo> class CopyRateConverter : public RateConverter { public: virtual int flow(AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) { - int16 tmp; + int16 tmp[2]; st_size_t len = *osamp; assert(input.isStereo() == stereo); while (!input.eof() && len--) { - tmp = input.read() * vol / 256; - clampedAdd(*obuf++, tmp); + tmp[0] = tmp[1] = input.read() * vol / 256; if (stereo) - tmp = input.read() * vol / 256; - clampedAdd(*obuf++, tmp); + tmp[reverseStereo ? 0 : 1] = input.read() * vol / 256; + clampedAdd(*obuf++, tmp[0]); + clampedAdd(*obuf++, tmp[1]); } return (ST_SUCCESS); } @@ -93,15 +94,18 @@ public: } }; -static inline RateConverter *makeRateConverter(st_rate_t inrate, st_rate_t outrate, bool stereo) { +static inline RateConverter *makeRateConverter(st_rate_t inrate, st_rate_t outrate, bool stereo, bool reverseStereo = false) { if (inrate != outrate) { - return new LinearRateConverter(inrate, outrate); + return new LinearRateConverter(inrate, outrate, reverseStereo); //return new ResampleRateConverter(inrate, outrate, 1); } else { - if (stereo) - return new CopyRateConverter<true>(); - else - return new CopyRateConverter<false>(); + if (stereo) { + if (reverseStereo) + return new CopyRateConverter<true, true>(); + else + return new CopyRateConverter<true, false>(); + } else + return new CopyRateConverter<false, false>(); } } |