From e85072801604c56d1138b174f28162bd18c07ef7 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Fri, 24 Apr 2026 08:23:44 +0500 Subject: [PATCH] engine: soundlib: fixes for BE --- engine/client/soundlib/snd_wav.c | 10 +++++++--- engine/common/soundlib/snd_utils.c | 26 +++++++++++++------------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/engine/client/soundlib/snd_wav.c b/engine/client/soundlib/snd_wav.c index b6e85b64..806a8b44 100644 --- a/engine/client/soundlib/snd_wav.c +++ b/engine/client/soundlib/snd_wav.c @@ -152,6 +152,8 @@ static qboolean StreamFindNextChunk( file_t *file, const char *name, int *last_c if( FS_Read( file, &iff_chunk_len, sizeof( iff_chunk_len )) != sizeof( iff_chunk_len )) return false; + iff_chunk_len = LittleLong( iff_chunk_len ); + if( iff_chunk_len < 0 ) return false; // didn't find the chunk @@ -394,6 +396,7 @@ stream_t *Stream_OpenWAV( const char *filename ) FS_Read( file, chunkName, 4 ); FS_Read( file, &t, sizeof( t )); + t = LittleShort( t ); if( t != 1 ) { Con_DPrintf( S_ERROR "%s: %s not a microsoft PCM format\n", __func__, filename ); @@ -402,14 +405,15 @@ stream_t *Stream_OpenWAV( const char *filename ) } FS_Read( file, &t, sizeof( t )); - sound.channels = t; + sound.channels = LittleShort( t ); FS_Read( file, &sound.rate, sizeof( int )); + sound.rate = LittleLong( sound.rate ); FS_Seek( file, 6, SEEK_CUR ); FS_Read( file, &t, sizeof( t )); - sound.width = t / 8; + sound.width = LittleShort( t ) / 8; sound.loopstart = 0; @@ -423,7 +427,7 @@ stream_t *Stream_OpenWAV( const char *filename ) } FS_Read( file, &sound.samples, sizeof( int )); - sound.samples = ( sound.samples / sound.width ) / sound.channels; + sound.samples = ( LittleLong( sound.samples ) / sound.width ) / sound.channels; // at this point we have valid stream stream = Mem_Calloc( host.soundpool, sizeof( stream_t )); diff --git a/engine/common/soundlib/snd_utils.c b/engine/common/soundlib/snd_utils.c index 52d1df84..b1572139 100644 --- a/engine/common/soundlib/snd_utils.c +++ b/engine/common/soundlib/snd_utils.c @@ -84,37 +84,37 @@ void Sound_Shutdown( void ) uint GAME_EXPORT Sound_GetApproxWavePlayLen( const char *filepath ) { - string name; - file_t *f; - wavehdr_t wav; - size_t filesize; - uint msecs; - + string name; Q_strncpy( name, filepath, sizeof( name )); COM_FixSlashes( name ); - f = FS_Open( name, "rb", false ); + file_t *f = FS_Open( name, "rb", false ); if( !f ) return 0; + wavehdr_t wav; if( FS_Read( f, &wav, sizeof( wav )) != sizeof( wav )) { FS_Close( f ); return 0; } - filesize = FS_FileLength( f ); - filesize -= 128; // magic number from GoldSrc, seems to be header size + // magic number from GoldSrc, seems to be header size + size_t filesize = FS_FileLength( f ) - 128; FS_Close( f ); // is real wav file ? - if( wav.riff_id != RIFFHEADER || wav.wave_id != WAVEHEADER || wav.fmt_id != FORMHEADER ) + if( wav.riff_id != LittleLong( RIFFHEADER ) || wav.wave_id != LittleLong( WAVEHEADER ) || wav.fmt_id != LittleLong( FORMHEADER )) return 0; - if( wav.nAvgBytesPerSec >= 1000 ) - msecs = (uint)((float)filesize / ((float)wav.nAvgBytesPerSec / 1000.0f)); - else msecs = (uint)(((float)filesize / (float)wav.nAvgBytesPerSec) * 1000.0f); + int avgBytes = LittleLong( wav.nAvgBytesPerSec ); + uint msecs; + + if( avgBytes >= 1000 ) + msecs = (uint)((float)filesize / ((float)avgBytes / 1000.0f)); + else + msecs = (uint)(((float)filesize / (float)avgBytes) * 1000.0f); return msecs; }