mirror of https://github.com/OpenTTD/OpenTTD
(svn r17146) -Codechange: improve the sample rate conversion a bit
parent
6800db65a7
commit
238b0e43bb
|
@ -36,6 +36,19 @@ static uint32 _play_rate = 11025;
|
||||||
*/
|
*/
|
||||||
static const int MAX_VOLUME = 128 * 128;
|
static const int MAX_VOLUME = 128 * 128;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform the rate conversion between the input and output.
|
||||||
|
* @param b the buffer to read the data from
|
||||||
|
* @param frac_pos the position from the begin of the buffer till the next element
|
||||||
|
* @tparam T the size of the buffer (8 or 16 bits)
|
||||||
|
* @return the converted value.
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
static int RateConversion(T *b, int frac_pos)
|
||||||
|
{
|
||||||
|
return ((b[0] * ((1 << 16) - frac_pos)) + (b[1] * frac_pos)) >> 16;
|
||||||
|
}
|
||||||
|
|
||||||
static void mix_int16(MixerChannel *sc, int16 *buffer, uint samples)
|
static void mix_int16(MixerChannel *sc, int16 *buffer, uint samples)
|
||||||
{
|
{
|
||||||
int16 *b;
|
int16 *b;
|
||||||
|
@ -64,8 +77,9 @@ static void mix_int16(MixerChannel *sc, int16 *buffer, uint samples)
|
||||||
} while (--samples > 0);
|
} while (--samples > 0);
|
||||||
} else {
|
} else {
|
||||||
do {
|
do {
|
||||||
buffer[0] = Clamp(buffer[0] + (*b * volume_left >> 16), -MAX_VOLUME, MAX_VOLUME);
|
int data = RateConversion(b, frac_pos);
|
||||||
buffer[1] = Clamp(buffer[1] + (*b * volume_right >> 16), -MAX_VOLUME, MAX_VOLUME);
|
buffer[0] = Clamp(buffer[0] + (data * volume_left >> 16), -MAX_VOLUME, MAX_VOLUME);
|
||||||
|
buffer[1] = Clamp(buffer[1] + (data * volume_right >> 16), -MAX_VOLUME, MAX_VOLUME);
|
||||||
buffer += 2;
|
buffer += 2;
|
||||||
frac_pos += frac_speed;
|
frac_pos += frac_speed;
|
||||||
b += frac_pos >> 16;
|
b += frac_pos >> 16;
|
||||||
|
@ -105,8 +119,9 @@ static void mix_int8_to_int16(MixerChannel *sc, int16 *buffer, uint samples)
|
||||||
} while (--samples > 0);
|
} while (--samples > 0);
|
||||||
} else {
|
} else {
|
||||||
do {
|
do {
|
||||||
buffer[0] = Clamp(buffer[0] + (*b * volume_left >> 8), -MAX_VOLUME, MAX_VOLUME);
|
int data = RateConversion(b, frac_pos);
|
||||||
buffer[1] = Clamp(buffer[1] + (*b * volume_right >> 8), -MAX_VOLUME, MAX_VOLUME);
|
buffer[0] = Clamp(buffer[0] + (data * volume_left >> 8), -MAX_VOLUME, MAX_VOLUME);
|
||||||
|
buffer[1] = Clamp(buffer[1] + (data * volume_right >> 8), -MAX_VOLUME, MAX_VOLUME);
|
||||||
buffer += 2;
|
buffer += 2;
|
||||||
frac_pos += frac_speed;
|
frac_pos += frac_speed;
|
||||||
b += frac_pos >> 16;
|
b += frac_pos >> 16;
|
||||||
|
|
|
@ -109,7 +109,11 @@ static bool SetBankSource(MixerChannel *mc, const SoundEntry *sound)
|
||||||
|
|
||||||
if (sound->file_size == 0) return false;
|
if (sound->file_size == 0) return false;
|
||||||
|
|
||||||
int8 *mem = MallocT<int8>(sound->file_size);
|
int8 *mem = MallocT<int8>(sound->file_size + 2);
|
||||||
|
/* Add two extra bytes so rate conversion can read these
|
||||||
|
* without reading out of it's input buffer. */
|
||||||
|
mem[sound->file_size ] = 0;
|
||||||
|
mem[sound->file_size + 1] = 0;
|
||||||
|
|
||||||
FioSeekToFile(sound->file_slot, sound->file_offset);
|
FioSeekToFile(sound->file_slot, sound->file_offset);
|
||||||
FioReadBlock(mem, sound->file_size);
|
FioReadBlock(mem, sound->file_size);
|
||||||
|
|
Loading…
Reference in New Issue