[Scummvm-cvs-logs] CVS: scummvm/sound rate.cpp,1.19,1.20

Max Horn fingolfin at users.sourceforge.net
Sat Aug 2 10:23:03 CEST 2003


Update of /cvsroot/scummvm/scummvm/sound
In directory sc8-pr-cvs1:/tmp/cvs-serv17918

Modified Files:
	rate.cpp 
Log Message:
optimize code flow a little

Index: rate.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/rate.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- rate.cpp	2 Aug 2003 16:31:31 -0000	1.19
+++ rate.cpp	2 Aug 2003 17:22:52 -0000	1.20
@@ -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 @@
 	/** 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 @@
 /*
  * 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 @@
  * 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 @@
 		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 @@
 			
 			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 @@
  */
 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) {





More information about the Scummvm-git-logs mailing list