[Scummvm-cvs-logs] CVS: scummvm/sound mixer.cpp,1.98,1.99 rate.cpp,1.17,1.18 rate.h,1.12,1.13
Max Horn
fingolfin at users.sourceforge.net
Sat Aug 2 09:12:01 CEST 2003
Update of /cvsroot/scummvm/scummvm/sound
In directory sc8-pr-cvs1:/tmp/cvs-serv7632
Modified Files:
mixer.cpp rate.cpp rate.h
Log Message:
added FLAG_REVERSE_STEREO support
Index: mixer.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/mixer.cpp,v
retrieving revision 1.98
retrieving revision 1.99
diff -u -d -r1.98 -r1.99
--- mixer.cpp 2 Aug 2003 11:44:57 -0000 1.98
+++ mixer.cpp 2 Aug 2003 16:11:12 -0000 1.99
@@ -654,9 +654,8 @@
_id = id;
_ptr = (byte *)sound;
_flags = flags;
-
-#ifdef SOX_HACK
+#ifdef SOX_HACK
// Create the input stream
if (flags & SoundMixer::FLAG_LOOP) {
if (loopEnd == 0) {
@@ -671,8 +670,9 @@
// TODO: add support for SoundMixer::FLAG_REVERSE_STEREO
// Get a rate converter instance
- _converter = makeRateConverter(rate, mixer->getOutputRate(), _input->isStereo());
-// printf(" data has %d bits and is %s\n",
+ _converter = makeRateConverter(rate, mixer->getOutputRate(), _input->isStereo(), (flags & SoundMixer::FLAG_REVERSE_STEREO) != 0);
+// printf("inrate %d, outrate %d, %d bits, %s\n",
+// rate, mixer->getOutputRate(),
// ((flags & SoundMixer::FLAG_16BITS) ? 16 : 8),
// ((flags & SoundMixer::FLAG_UNSIGNED) ? "unsigned" : "signed"));
#else
@@ -760,7 +760,7 @@
// TODO: add support for SoundMixer::FLAG_REVERSE_STEREO
// Get a rate converter instance
- _converter = makeRateConverter(rate, mixer->getOutputRate(), _input->isStereo());
+ _converter = makeRateConverter(rate, mixer->getOutputRate(), _input->isStereo(), (flags & SoundMixer::FLAG_REVERSE_STEREO) != 0);
// printf(" data has %d bits and is %s\n",
// ((flags & SoundMixer::FLAG_16BITS) ? 16 : 8),
// ((flags & SoundMixer::FLAG_UNSIGNED) ? "unsigned" : "signed"));
Index: rate.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/rate.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- rate.cpp 2 Aug 2003 14:54:54 -0000 1.17
+++ rate.cpp 2 Aug 2003 16:11:12 -0000 1.18
@@ -99,7 +99,7 @@
* Processed signed long samples from ibuf to obuf.
* Return number of samples processed.
*/
-template<bool stereo>
+template<bool stereo, int leftChannel>
int st_rate_flow(eff_t effp, AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol)
{
rate_t rate = (rate_t) effp->priv;
@@ -107,6 +107,8 @@
st_sample_t out;
unsigned long tmp;
+ assert(leftChannel == 0 || leftChannel == 1);
+
ostart = obuf;
oend = obuf + *osamp * 2;
@@ -132,7 +134,7 @@
while (rate->ipos > rate->opos + 1) {
// interpolate
- out = (st_sample_t) (rate->ilast[0] + (((rate->icur[0] - rate->ilast[0]) * rate->opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS));
+ out = (st_sample_t) (rate->ilast[leftChannel] + (((rate->icur[leftChannel] - rate->ilast[leftChannel]) * rate->opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS));
// adjust volume
out = out * vol / 256;
@@ -141,7 +143,7 @@
if (stereo) {
// interpolate
- out = (st_sample_t) (rate->ilast[1] + (((rate->icur[1] - rate->ilast[1]) * rate->opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS));
+ out = (st_sample_t) (rate->ilast[1-leftChannel] + (((rate->icur[1-leftChannel] - rate->ilast[1-leftChannel]) * rate->opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS));
// adjust volume
out = out * vol / 256;
}
@@ -165,15 +167,19 @@
return (ST_SUCCESS);
}
-LinearRateConverter::LinearRateConverter(st_rate_t inrate, st_rate_t outrate) {
+LinearRateConverter::LinearRateConverter(st_rate_t inrate, st_rate_t outrate, bool reverseStereo) {
+ _reverseStereo = reverseStereo;
st_rate_start(&effp, inrate, outrate);
}
int LinearRateConverter::flow(AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) {
- if (input.isStereo())
- return st_rate_flow<true>(&effp, input, obuf, osamp, vol);
- else
- return st_rate_flow<false>(&effp, input, obuf, osamp, vol);
+ if (input.isStereo()) {
+ if (_reverseStereo)
+ return st_rate_flow<true, 1>(&effp, input, obuf, osamp, vol);
+ else
+ return st_rate_flow<true, 0>(&effp, input, obuf, osamp, vol);
+ } else
+ return st_rate_flow<false, 0>(&effp, input, obuf, osamp, vol);
}
int LinearRateConverter::drain(st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) {
Index: rate.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/rate.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- rate.h 2 Aug 2003 00:29:53 -0000 1.12
+++ rate.h 2 Aug 2003 16:11:12 -0000 1.13
@@ -58,8 +58,9 @@
};
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 @@
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 @@
}
};
-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>();
}
}
More information about the Scummvm-git-logs
mailing list