shithub: cstory

Download patch

ref: 449a09b09e5309e2c9cf473b06722007ef5920c6
parent: c831031ba4545543445bbbf8dc8366edda3d94ad
author: Clownacy <[email protected]>
date: Thu Jan 9 04:10:24 EST 2020

Fix an occational invalid memory read

Stupid floating-point rounding errors. Had to undo a fancy
optimisation to avoid it.

--- a/src/Backends/Audio/SDL2.cpp
+++ b/src/Backends/Audio/SDL2.cpp
@@ -75,28 +75,21 @@
 		{
 			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 @@
 						break;
 					}
 				}
-
-				frames_done += frames_to_do;
 			}
 		}
 	}