mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-05 03:24:56 +08:00
engine: client: streamline samples handling
This commit is contained in:
committed by
a1batross
parent
a14cc82d46
commit
ee7dce68b8
@@ -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 );
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user