From c6881a425fb82b9f3c41897df813b1e2211efa10 Mon Sep 17 00:00:00 2001 From: SNMetamorph <25657591+SNMetamorph@users.noreply.github.com> Date: Mon, 15 Aug 2022 11:40:55 +0400 Subject: [PATCH] engine: client: added support for variable voice chat quality --- engine/client/cl_main.c | 2 +- engine/client/voice.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 53b35734..f65166f1 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -3085,7 +3085,7 @@ void CL_Init( void ) VID_Init(); // init video S_Init(); // init sound - Voice_Init( "opus", 0 ); // init voice + Voice_Init( "opus", 3 ); // init voice // unreliable buffer. unsed for unreliable commands and voice stream MSG_Init( &cls.datagram, "cls.datagram", cls.datagram_buf, sizeof( cls.datagram_buf )); diff --git a/engine/client/voice.c b/engine/client/voice.c index 9eb63cba..e06e47fb 100644 --- a/engine/client/voice.c +++ b/engine/client/voice.c @@ -79,9 +79,37 @@ qboolean Voice_Init( const char *pszCodecName, int quality ) } voice.encoder = opus_encoder_create( voice.samplerate, voice.channels, OPUS_APPLICATION_VOIP, &err ); + + if( err != OPUS_OK ) + return false; + voice.decoder = opus_decoder_create( voice.samplerate, voice.channels, &err ); - return true; + switch( quality ) + { + case 1: // 4800 bits per second, <4 kHz bandwidth + opus_encoder_ctl( voice.encoder, OPUS_SET_BITRATE( 4800 )); + opus_encoder_ctl( voice.encoder, OPUS_SET_BANDWIDTH( OPUS_BANDWIDTH_NARROWBAND )); + break; + case 2: // 12000 bits per second, <6 kHz bandwidth + opus_encoder_ctl( voice.encoder, OPUS_SET_BITRATE( 12000 )); + opus_encoder_ctl( voice.encoder, OPUS_SET_BANDWIDTH( OPUS_BANDWIDTH_MEDIUMBAND )); + break; + case 4: // automatic bitrate, full band (20 kHz) + opus_encoder_ctl( voice.encoder, OPUS_SET_BITRATE( OPUS_AUTO )); + opus_encoder_ctl( voice.encoder, OPUS_SET_BANDWIDTH( OPUS_BANDWIDTH_FULLBAND )); + break; + case 5: // maximum bitrate, full band (20 kHz) + opus_encoder_ctl( voice.encoder, OPUS_SET_BITRATE( OPUS_BITRATE_MAX )); + opus_encoder_ctl( voice.encoder, OPUS_SET_BANDWIDTH( OPUS_BANDWIDTH_FULLBAND )); + break; + default: // 36000 bits per second, <12 kHz bandwidth + opus_encoder_ctl( voice.encoder, OPUS_SET_BITRATE( 36000 )); + opus_encoder_ctl( voice.encoder, OPUS_SET_BANDWIDTH( OPUS_BANDWIDTH_SUPERWIDEBAND )); + break; + } + + return err == OPUS_OK; } void Voice_DeInit( void )