[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