From 449a09b09e5309e2c9cf473b06722007ef5920c6 Mon Sep 17 00:00:00 2001 From: Clownacy Date: Thu, 9 Jan 2020 09:10:24 +0000 Subject: [PATCH] Fix an occational invalid memory read Stupid floating-point rounding errors. Had to undo a fancy optimisation to avoid it. --- src/Backends/Audio/SDL2.cpp | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/src/Backends/Audio/SDL2.cpp b/src/Backends/Audio/SDL2.cpp index 908efdb6..d6b360a3 100644 --- a/src/Backends/Audio/SDL2.cpp +++ b/src/Backends/Audio/SDL2.cpp @@ -75,28 +75,21 @@ static void MixSounds(float *stream, unsigned int frames_total) { float *steam_pointer = stream; - unsigned int frames_done = 0; - - while (frames_done != frames_total) + for (unsigned int frames_done = 0; frames_done < frames_total; ++frames_done) { - const unsigned int frames_to_do = MIN((unsigned int)ceil((sound->frames - sound->position) / sound->advance_delta), frames_total - frames_done); + // Get two samples, and normalise them to 0-1 + const float sample1 = (sound->samples[(size_t)sound->position] - 128.0f) / 128.0f; + const float sample2 = (sound->samples[(size_t)sound->position + 1] - 128.0f) / 128.0f; - for (unsigned int i = 0; i < frames_to_do; ++i) - { - // Get two samples, and normalise them to 0-1 - const float sample1 = (sound->samples[(size_t)sound->position] - 128.0f) / 128.0f; - const float sample2 = (sound->samples[(size_t)sound->position + 1] - 128.0f) / 128.0f; + // Perform linear interpolation + const float interpolated_sample = sample1 + ((sample2 - sample1) * (float)fmod(sound->position, 1.0)); - // Perform linear interpolation - const float interpolated_sample = sample1 + ((sample2 - sample1) * (float)fmod(sound->position, 1.0)); + *steam_pointer++ += interpolated_sample * sound->volume_l; + *steam_pointer++ += interpolated_sample * sound->volume_r; - *steam_pointer++ += interpolated_sample * sound->volume_l; - *steam_pointer++ += interpolated_sample * sound->volume_r; + sound->position += sound->advance_delta; - sound->position += sound->advance_delta; - } - - if ((size_t)sound->position >= sound->frames) + if (sound->position >= sound->frames) { if (sound->looping) { @@ -109,8 +102,6 @@ static void MixSounds(float *stream, unsigned int frames_total) break; } } - - frames_done += frames_to_do; } } }