From ee7dce68b8c380c11efaa372f3f7ebcd93a45995 Mon Sep 17 00:00:00 2001 From: Sergey Degtyar Date: Mon, 13 Oct 2025 20:59:07 +0300 Subject: [PATCH] engine: client: streamline samples handling --- engine/client/voice.c | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/engine/client/voice.c b/engine/client/voice.c index 579cbcdd..462b3d37 100644 --- a/engine/client/voice.c +++ b/engine/client/voice.c @@ -593,8 +593,7 @@ static int Voice_ProcessGSData( int ent, const uint8_t *data, uint32_t size ) uint32_t crc_in_packet; uint32_t crc; size_t offset; - int16_t pcm[GS_MAX_DECOMPRESSED_SAMPLES]; - size_t output_samples; + size_t samples; uint16_t sample_rate; uint8_t vpc_type; uint16_t data_len; @@ -619,7 +618,7 @@ static int Voice_ProcessGSData( int ent, const uint8_t *data, uint32_t size ) } offset = sizeof( uint64_t ); - output_samples = 0; + samples = 0; if( offset >= size - sizeof( uint32_t ) || data[offset] != GS_VPC_SETSAMPLERATE ) { @@ -638,12 +637,6 @@ static int Voice_ProcessGSData( int ent, const uint8_t *data, uint32_t size ) data_len = LittleShort( *(uint16_t *)( data + offset )); offset += sizeof( uint16_t ); - if( offset + data_len > size - sizeof( uint32_t )) - { - Con_Printf( S_WARN "Voice packet data_len out of bounds\n" ); - return 0; - } - if( vpc_type == GS_VPC_VDATA_OPUS_PLC ) { decoder = voice.gs_decoders[ent - 1]; @@ -660,13 +653,13 @@ static int Voice_ProcessGSData( int ent, const uint8_t *data, uint32_t size ) // if frame size is 0, it means silence if( frame_size == 0 ) { - if( output_samples + VOICE_DEFAULT_SILENCE_FRAME_SIZE > GS_MAX_DECOMPRESSED_SAMPLES ) + if( samples + VOICE_DEFAULT_SILENCE_FRAME_SIZE > GS_MAX_DECOMPRESSED_SAMPLES ) { Con_Printf( S_WARN "Voice buffer overflow\n" ); return 0; } - memset( pcm + output_samples, 0, VOICE_DEFAULT_SILENCE_FRAME_SIZE * sizeof( int16_t )); - output_samples += VOICE_DEFAULT_SILENCE_FRAME_SIZE; + memset( ( (int16_t *)voice.decompress_buffer ) + samples, 0, VOICE_DEFAULT_SILENCE_FRAME_SIZE * sizeof( int16_t )); + samples += VOICE_DEFAULT_SILENCE_FRAME_SIZE; continue; } if( frame_size == 0xFFFF ) @@ -680,13 +673,13 @@ static int Voice_ProcessGSData( int ent, const uint8_t *data, uint32_t size ) return 0; } decoded = opus_decode( decoder, data + offset + opus_offset, frame_size, - pcm + output_samples, voice.frame_size, 0 ); + ( (int16_t *)voice.decompress_buffer ) + samples, voice.frame_size, 0 ); if( decoded < 0 ) { Con_Printf( S_WARN "Opus decode error: %s\n", opus_strerror( decoded )); return 0; } - output_samples += decoded; + samples += decoded; opus_offset += frame_size; } } @@ -698,8 +691,8 @@ static int Voice_ProcessGSData( int ent, const uint8_t *data, uint32_t size ) Con_Printf( S_WARN "Silence data too large\n" ); return 0; } - memset( pcm, 0, silence_samples * sizeof( int16_t )); - output_samples = silence_samples; + memset( voice.decompress_buffer, 0, silence_samples * sizeof( int16_t )); + samples = silence_samples; } else { @@ -707,10 +700,7 @@ static int Voice_ProcessGSData( int ent, const uint8_t *data, uint32_t size ) return 0; } - if( output_samples > 0 ) - Voice_StartChannel( output_samples, (byte *)pcm, ent ); - - return output_samples; + return samples; } /* @@ -989,8 +979,7 @@ void Voice_AddIncomingData( int ent, const byte *data, uint size, uint frames ) if( voice.goldsrc ) { - // Voice_ProcessGSData handles Voice_StartChannel internally - Voice_ProcessGSData( ent, (const uint8_t *)data, size ); + samples = Voice_ProcessGSData( ent, (const uint8_t *)data, size ); } else { @@ -1021,10 +1010,10 @@ void Voice_AddIncomingData( int ent, const byte *data, uint size, uint frames ) ofs += compressed_size; samples += frame_samples; } - - if( samples > 0 ) - Voice_StartChannel( samples, voice.decompress_buffer, ent ); } + + if( samples > 0 ) + Voice_StartChannel( samples, voice.decompress_buffer, ent ); } /*