From 545948584aefc6a1df7b61efe5faa3651e15230e Mon Sep 17 00:00:00 2001 From: Clownacy Date: Mon, 6 Apr 2020 13:40:39 +0100 Subject: [PATCH] Different optimisation for software-mixer `trunc` can resolve to a library call, while a cast-to-int doesn't appear to. Since the mixer already does a cast-to-int when retrieving samples, I can kill two birds with one stone. --- src/Backends/Audio/SoftwareMixer.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Backends/Audio/SoftwareMixer.cpp b/src/Backends/Audio/SoftwareMixer.cpp index cd6b176b..5ca738d7 100644 --- a/src/Backends/Audio/SoftwareMixer.cpp +++ b/src/Backends/Audio/SoftwareMixer.cpp @@ -1,6 +1,6 @@ #include "SoftwareMixer.h" -#include +#include #include #include #include @@ -150,12 +150,15 @@ ATTRIBUTE_HOT void Mixer_MixSounds(float *stream, unsigned int frames_total) for (unsigned int frames_done = 0; frames_done < frames_total; ++frames_done) { + const size_t position_integral = (size_t)sound->position; + const double position_fractional = sound->position - position_integral; + // 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; + const float sample1 = (sound->samples[position_integral] - 128.0f) / 128.0f; + const float sample2 = (sound->samples[position_integral + 1] - 128.0f) / 128.0f; // Perform linear interpolation - const float interpolated_sample = sample1 + (sample2 - sample1) * (sound->position - std::trunc(sound->position)); + const float interpolated_sample = sample1 + (sample2 - sample1) * position_fractional; *steam_pointer++ += interpolated_sample * sound->volume_l; *steam_pointer++ += interpolated_sample * sound->volume_r;