shithub: ft²

Download patch

ref: 5137f5d5af98159def020f575fe094585fc1f549
parent: 452664b3e1586c1f7f8cdc3dc890b6adcc0a8c5b
author: Olav Sørensen <olav.sorensen@live.no>
date: Tue Dec 10 16:40:42 EST 2024

Fix a mixer/voice delta problem when voice vol is zero

--- a/src/ft2_header.h
+++ b/src/ft2_header.h
@@ -12,7 +12,7 @@
 #endif
 #include "ft2_replayer.h"
 
-#define PROG_VER_STR "1.90"
+#define PROG_VER_STR "1.91"
 
 // do NOT change these! It will only mess things up...
 
--- a/src/mixer/ft2_silence_mix.c
+++ b/src/mixer/ft2_silence_mix.c
@@ -6,13 +6,13 @@
 
 void silenceMixRoutine(voice_t *v, int32_t numSamples)
 {
-	assert((uint32_t)numSamples <= UINT16_MAX);
+	const uint64_t samplesToMix = (uint64_t)v->delta * (uint32_t)numSamples; // fixed-point
 
-	const uint32_t samplesInt = (uint32_t)(v->delta >> MIXER_FRAC_BITS) * (uint32_t)numSamples;
-	const uint64_t samplesFrac = (uint64_t)(v->delta & MIXER_FRAC_SCALE) * (uint32_t)numSamples;
+	const uint32_t samples = (uint32_t)(samplesToMix >> MIXER_FRAC_BITS);
+	const uint64_t samplesFrac = (samplesToMix & MIXER_FRAC_MASK) + v->positionFrac;
 
-	uint32_t position = v->position + samplesInt + (uint32_t)(samplesFrac >> MIXER_FRAC_BITS);
-	uint32_t positionFrac = samplesFrac & MIXER_FRAC_MASK;
+	uint32_t position = v->position + samples + (uint32_t)(samplesFrac >> MIXER_FRAC_BITS);
+	uint64_t positionFrac = samplesFrac & MIXER_FRAC_MASK;
 
 	if (position < (uint32_t)v->sampleEnd) // we haven't reached the sample's end yet
 	{
--