diff --git a/sound/mixer.cpp b/sound/mixer.cpp index 69d4e0d5af8..dbc87f01f74 100644 --- a/sound/mixer.cpp +++ b/sound/mixer.cpp @@ -716,8 +716,7 @@ void ChannelRaw::mix(int16 *data, uint len) { } const int volume = _mixer->getVolume(); - st_size_t tmpLen = len; - _converter->flow(*_input, data, &tmpLen, volume); + _converter->flow(*_input, data, len, volume); #else byte *s, *end; @@ -837,8 +836,7 @@ void ChannelStream::mix(int16 *data, uint len) { } const int volume = _mixer->getVolume(); - st_size_t tmpLen = len; - _converter->flow(*_input, data, &tmpLen, volume); + _converter->flow(*_input, data, len, volume); #else if (_pos == _endOfData) { // Normally, the stream stays around even if all its data is used up. @@ -960,8 +958,7 @@ void ChannelMP3::mix(int16 *data, uint len) { } const int volume = _mixer->getVolume(); - st_size_t tmpLen = len; - _converter->flow(*_input, data, &tmpLen, volume); + _converter->flow(*_input, data, len, volume); #else const int volume = _mixer->getVolume(); @@ -1044,8 +1041,7 @@ void ChannelMP3CDMusic::mix(int16 *data, uint len) { } const int volume = _mixer->getMusicVolume(); - st_size_t tmpLen = len; - _converter->flow(*_input, data, &tmpLen, volume); + _converter->flow(*_input, data, len, volume); #else mad_timer_t frame_duration; const int volume = _mixer->getMusicVolume(); @@ -1198,8 +1194,7 @@ void ChannelVorbis::mix(int16 *data, uint len) { } const int volume = isMusicChannel() ? _mixer->getMusicVolume() : _mixer->getVolume(); - st_size_t tmpLen = len; - _converter->flow(*_input, data, &tmpLen, volume); + _converter->flow(*_input, data, len, volume); #else if (_end_pos > 0 && ov_pcm_tell(_ov_file) >= _end_pos) { destroy(); diff --git a/sound/rate.cpp b/sound/rate.cpp index 4f05dd326ea..5498f482026 100644 --- a/sound/rate.cpp +++ b/sound/rate.cpp @@ -66,8 +66,8 @@ protected: public: 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) { + 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); } }; @@ -108,14 +108,13 @@ LinearRateConverter::LinearRateConverter(st_rate_t inrate * Return number of samples processed. */ template -int LinearRateConverter::flow(AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) +int LinearRateConverter::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; + st_sample_t out[2], tmpOut; ostart = obuf; - oend = obuf + *osamp * 2; + oend = obuf + osamp * 2; while (obuf < oend) { @@ -140,25 +139,25 @@ int LinearRateConverter::flow(AudioInputStream &input, st while (ipos > opos + 1) { // interpolate - out = (st_sample_t) (ilast[reverseStereo ? 1 : 0] + (((icur[reverseStereo ? 1 : 0] - ilast[reverseStereo ? 1 : 0]) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS)); + tmpOut = (st_sample_t)(ilast[0] + (((icur[0] - ilast[0]) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS)); // adjust volume - out = out * vol / 256; - - // output left channel sample - clampedAdd(*obuf++, out); + out[0] = out[1] = (st_sample_t)((tmpOut * vol) >> 8); if (stereo) { // interpolate - out = (st_sample_t) (ilast[reverseStereo ? 0 : 1] + (((icur[reverseStereo ? 0 : 1] - ilast[reverseStereo ? 0 : 1]) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS)); + tmpOut = (st_sample_t)(ilast[1] + (((icur[1] - ilast[1]) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS)); // adjust volume - out = out * vol / 256; + out[reverseStereo ? 0 : 1] = (st_sample_t)((tmpOut * vol) >> 8); } - // output right channel sample - clampedAdd(*obuf++, out); + // output left channel + clampedAdd(*obuf++, out[0]); + + // output right channel + clampedAdd(*obuf++, out[1]); // Increment output position - tmp = opos_frac + opos_inc_frac; + unsigned long tmp = opos_frac + opos_inc_frac; opos += opos_inc + (tmp >> FRAC_BITS); opos_frac = tmp & ((1UL << FRAC_BITS) - 1); @@ -169,7 +168,6 @@ int LinearRateConverter::flow(AudioInputStream &input, st } the_end: - *osamp = (obuf - ostart) / 2; return (ST_SUCCESS); } @@ -183,20 +181,20 @@ the_end: template class CopyRateConverter : public RateConverter { public: - virtual int flow(AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) { + virtual int flow(AudioInputStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol) { int16 tmp[2]; - st_size_t len = *osamp; + st_size_t len = osamp; assert(input.isStereo() == stereo); while (!input.eof() && len--) { - tmp[0] = tmp[1] = input.read() * vol / 256; + tmp[0] = tmp[1] = (input.read() * vol) >> 8; if (stereo) - tmp[reverseStereo ? 0 : 1] = input.read() * vol / 256; + tmp[reverseStereo ? 0 : 1] = (input.read() * vol) >> 8; clampedAdd(*obuf++, tmp[0]); clampedAdd(*obuf++, tmp[1]); } return (ST_SUCCESS); } - virtual int drain(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) { return (ST_SUCCESS); } }; diff --git a/sound/rate.h b/sound/rate.h index b55897caad1..694dbe0b165 100644 --- a/sound/rate.h +++ b/sound/rate.h @@ -48,14 +48,14 @@ typedef eff_struct *eff_t; #define ST_SUCCESS (0) static inline void clampedAdd(int16& a, int b) { - int val = a + b; + register int val = a + b; if (val > ST_SAMPLE_MAX) - a = ST_SAMPLE_MAX; + val = ST_SAMPLE_MAX; else if (val < ST_SAMPLE_MIN) - a = ST_SAMPLE_MIN; - else - a = val; + val = ST_SAMPLE_MIN; + + a = val; } // Q&D hack to get this SOX stuff to work @@ -68,19 +68,21 @@ class RateConverter { public: RateConverter() {} virtual ~RateConverter() {} - virtual int flow(AudioInputStream &input, st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) = 0; - virtual int drain(st_sample_t *obuf, st_size_t *osamp, st_volume_t vol) = 0; + virtual int flow(AudioInputStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol) = 0; + virtual int drain(st_sample_t *obuf, st_size_t osamp, st_volume_t vol) = 0; }; +/* class ResampleRateConverter : public RateConverter { protected: eff_struct effp; public: ResampleRateConverter(st_rate_t inrate, st_rate_t outrate, int quality); ~ResampleRateConverter(); - 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); + 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); }; +*/ RateConverter *makeRateConverter(st_rate_t inrate, st_rate_t outrate, bool stereo, bool reverseStereo = false);