engine: client: streamline samples handling

This commit is contained in:
Sergey Degtyar
2025-10-13 20:59:07 +03:00
committed by a1batross
parent a14cc82d46
commit ee7dce68b8

View File

@@ -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 );
}
/*