aboutsummaryrefslogtreecommitdiff
path: root/sound/rate.h
diff options
context:
space:
mode:
authorMax Horn2003-08-02 16:11:12 +0000
committerMax Horn2003-08-02 16:11:12 +0000
commite3b64fa7578896d23db09d6d6ed952aaf70467ed (patch)
tree1ec03dc37bd719b5045ebe3cd079ad2a55458386 /sound/rate.h
parent1bd9026d8ab0bf7fca1b81d8d15e22068f6cc0d3 (diff)
downloadscummvm-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.h30
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>();
}
}