From 785b2881b60d1b0a29537211b3eb874df746b844 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Sun, 14 Dec 2025 03:44:17 +0300 Subject: [PATCH] engine: client: fix crash when sound pitch is too high --- engine/client/s_mix.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/engine/client/s_mix.c b/engine/client/s_mix.c index 3ae38708..0770d963 100644 --- a/engine/client/s_mix.c +++ b/engine/client/s_mix.c @@ -34,11 +34,11 @@ enum // fixed point stuff for real-time resampling #define FIX_BITS 28 -#define FIX_SCALE ( 1 << FIX_BITS ) -#define FIX_MASK (( 1 << FIX_BITS ) - 1 ) -#define FIX_FLOAT( a ) ((int)(( a ) * FIX_SCALE )) -#define FIX( a ) (((int)( a )) << FIX_BITS ) -#define FIX_INTPART( a ) (((int)( a )) >> FIX_BITS ) +#define FIX_SCALE ( 1U << FIX_BITS ) +#define FIX_MASK (( 1U << FIX_BITS ) - 1 ) +#define FIX_FLOAT( a ) ((uint)(( a ) * FIX_SCALE )) +#define FIX( a ) (((uint)( a )) << FIX_BITS ) +#define FIX_INTPART( a ) (((uint)( a )) >> FIX_BITS ) #define FIX_FRACPART( a ) (( a ) & FIX_MASK ) typedef struct @@ -279,13 +279,14 @@ static void S_PaintStereoFrom16( portable_samplepair_t *pbuf, int *volume, short } } -static void S_Mix8MonoTimeCompress( portable_samplepair_t *pbuf, int *volume, byte *pData, int inputOffset, uint rateScale, int outCount, int timecompress ) +static void S_Mix8MonoTimeCompress( portable_samplepair_t *pbuf, int *volume, byte *pData, uint inputOffset, uint rateScale, int outCount, int timecompress ) { } -static void S_Mix8Mono( portable_samplepair_t *pbuf, int *volume, byte *pData, int inputOffset, uint rateScale, int outCount, int timecompress ) +static void S_Mix8Mono( portable_samplepair_t *pbuf, int *volume, byte *pData, uint inputOffset, uint rateScale, int outCount, int timecompress ) { - int i, sampleIndex = 0; + int i; + uint sampleIndex = 0; uint sampleFrac = inputOffset; int *lscale, *rscale; @@ -315,9 +316,10 @@ static void S_Mix8Mono( portable_samplepair_t *pbuf, int *volume, byte *pData, i } } -static void S_Mix8Stereo( portable_samplepair_t *pbuf, int *volume, byte *pData, int inputOffset, uint rateScale, int outCount ) +static void S_Mix8Stereo( portable_samplepair_t *pbuf, int *volume, byte *pData, uint inputOffset, uint rateScale, int outCount ) { - int i, sampleIndex = 0; + int i; + uint sampleIndex = 0; uint sampleFrac = inputOffset; int *lscale, *rscale; @@ -341,9 +343,10 @@ static void S_Mix8Stereo( portable_samplepair_t *pbuf, int *volume, byte *pData, } } -static void S_Mix16Mono( portable_samplepair_t *pbuf, int *volume, short *pData, int inputOffset, uint rateScale, int outCount ) +static void S_Mix16Mono( portable_samplepair_t *pbuf, int *volume, short *pData, uint inputOffset, uint rateScale, int outCount ) { - int i, sampleIndex = 0; + int i; + uint sampleIndex = 0; uint sampleFrac = inputOffset; // Not using pitch shift? @@ -363,9 +366,10 @@ static void S_Mix16Mono( portable_samplepair_t *pbuf, int *volume, short *pData, } } -static void S_Mix16Stereo( portable_samplepair_t *pbuf, int *volume, short *pData, int inputOffset, uint rateScale, int outCount ) +static void S_Mix16Stereo( portable_samplepair_t *pbuf, int *volume, short *pData, uint inputOffset, uint rateScale, int outCount ) { - int i, sampleIndex = 0; + int i; + uint sampleIndex = 0; uint sampleFrac = inputOffset; // Not using pitch shift? @@ -385,7 +389,7 @@ static void S_Mix16Stereo( portable_samplepair_t *pbuf, int *volume, short *pDat } } -static void S_MixChannel( channel_t *pChannel, void *pData, int outputOffset, int inputOffset, uint fracRate, int outCount, int timecompress ) +static void S_MixChannel( channel_t *pChannel, void *pData, int outputOffset, uint inputOffset, uint fracRate, int outCount, int timecompress ) { int pvol[CCHANVOLUMES]; paintbuffer_t *ppaint = MIX_GetCurrentPaintbufferPtr();