[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