[Scummvm-cvs-logs] CVS: scummvm/sound rate.cpp,1.31,1.32

Max Horn fingolfin at users.sourceforge.net
Fri Jan 2 18:31:17 CET 2004


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

Modified Files:
	rate.cpp 
Log Message:
replace read() by readBuffer() in CopyRateConverter

Index: rate.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/rate.cpp,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -d -r1.31 -r1.32
--- rate.cpp	26 Dec 2003 01:32:29 -0000	1.31
+++ rate.cpp	3 Jan 2004 02:29:48 -0000	1.32
@@ -192,26 +192,54 @@
 
 /**
  * Simple audio rate converter for the case that the inrate equals the outrate.
- * @todo This is inefficient, it would be better if this used readBuffer()
- *       instead of read().
  */
 template<bool stereo, bool reverseStereo>
 class CopyRateConverter : public RateConverter {
+	st_sample_t *_buffer;
+	st_size_t _bufferSize;
 public:
+	CopyRateConverter() : _buffer(0), _bufferSize(0) {}
+	~CopyRateConverter() {
+		free(_buffer);
+	}
+
 	virtual int flow(AudioInputStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r) {
-		int16 tmp[2];
-		st_size_t len = osamp;
 		assert(input.isStereo() == stereo);
-		while (!input.endOfData() && len--) {
-			tmp[0] = tmp[1] = input.read();
-			if (stereo)
-				tmp[reverseStereo ? 0 : 1] = input.read();
+		
+		st_sample_t *ptr;
+		st_size_t len;
+		
+		if (stereo)
+			osamp *= 2;
+
+		// Reallocate temp buffer, if necessary
+		if (osamp > _bufferSize) {
+			free(_buffer);
+			_buffer = (st_sample_t *)malloc(osamp * 2);
+			_bufferSize = osamp;
+		}
+
+		// Read up to 'osamp' samples into our temporary buffer
+		len = input.readBuffer(_buffer, osamp);
+		
+		// Mix the data into the output buffer
+		ptr = _buffer;
+		while (len--) {
+			st_sample_t tmp0, tmp1;
+			tmp0 = tmp1 = *ptr++;
+			if (stereo) {
+				if (reverseStereo)
+					tmp0 = *ptr++;
+				else
+					tmp1 = *ptr++;
+				len--;
+			}
 
 			// output left channel
-			clampedAdd(*obuf++, (tmp[0] * (int)vol_l) >> 8);
+			clampedAdd(*obuf++, (tmp0 * (int)vol_l) >> 8);
 	
 			// output right channel
-			clampedAdd(*obuf++, (tmp[1] * (int)vol_r) >> 8);
+			clampedAdd(*obuf++, (tmp1 * (int)vol_r) >> 8);
 		}
 		return (ST_SUCCESS);
 	}





More information about the Scummvm-git-logs mailing list