From d212b2c2e1bc6aba370fa5e0ae4d122cd19a2466 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Sat, 3 Jan 2004 02:29:48 +0000 Subject: replace read() by readBuffer() in CopyRateConverter svn-id: r12102 --- sound/rate.cpp | 48 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) (limited to 'sound') diff --git a/sound/rate.cpp b/sound/rate.cpp index 45046cb80b..352243bc79 100644 --- a/sound/rate.cpp +++ b/sound/rate.cpp @@ -192,26 +192,54 @@ the_end: /** * 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 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); } -- cgit v1.2.3