Browse Source

engine: client: voice: open microphone only after server sends svc_voiceinit to us and shutdown immediately after disconnect

master
Alibek Omarov 10 months ago
parent
commit
5d6cf62405
  1. 2
      engine/client/cl_main.c
  2. 2
      engine/client/cl_parse.c
  3. 64
      engine/client/voice.c
  4. 3
      engine/client/voice.h

2
engine/client/cl_main.c

@ -3139,7 +3139,7 @@ void CL_Init( void )
VID_Init(); // init video VID_Init(); // init video
S_Init(); // init sound S_Init(); // init sound
Voice_Init( VOICE_DEFAULT_CODEC, 3 ); // init voice Voice_Init( VOICE_DEFAULT_CODEC, 3, true ); // init voice (do not open the device)
// unreliable buffer. unsed for unreliable commands and voice stream // unreliable buffer. unsed for unreliable commands and voice stream
MSG_Init( &cls.datagram, "cls.datagram", cls.datagram_buf, sizeof( cls.datagram_buf )); MSG_Init( &cls.datagram, "cls.datagram", cls.datagram_buf, sizeof( cls.datagram_buf ));

2
engine/client/cl_parse.c

@ -1778,7 +1778,7 @@ void CL_ParseVoiceInit( sizebuf_t *msg )
char *pszCodec = MSG_ReadString( msg ); char *pszCodec = MSG_ReadString( msg );
int quality = MSG_ReadByte( msg ); int quality = MSG_ReadByte( msg );
Voice_Init( pszCodec, quality ); Voice_Init( pszCodec, quality, false ); // init requested codec and the device
} }
/* /*

64
engine/client/voice.c

@ -428,6 +428,9 @@ void Voice_Disconnect( void )
voice.players_status[i].talking_ack = false; voice.players_status[i].talking_ack = false;
} }
} }
VoiceCapture_Shutdown();
voice.device_opened = false;
} }
/* /*
@ -588,48 +591,53 @@ Voice_Init
Initialize the voice subsystem Initialize the voice subsystem
========================= =========================
*/ */
qboolean Voice_Init( const char *pszCodecName, int quality ) qboolean Voice_Init( const char *pszCodecName, int quality, qboolean preinit )
{ {
if( !voice_enable.value ) if( !voice_enable.value )
return false; return false;
if( Q_strcmp( pszCodecName, VOICE_OPUS_CUSTOM_CODEC )) // reinitialize only if codec parameters are different
if( Q_strcmp( pszCodecName, voice.codec ) || voice.quality != quality )
{ {
Con_Printf( S_ERROR "Server requested unsupported codec: %s\n", pszCodecName ); Voice_Shutdown();
return false;
}
// reinitialize only if codec parameters are different if( Q_strcmp( pszCodecName, VOICE_OPUS_CUSTOM_CODEC ))
if( !Q_strcmp( voice.codec, pszCodecName ) && voice.quality == quality ) {
return true; Con_Printf( S_ERROR "Server requested unsupported codec: %s\n", pszCodecName );
return false;
}
Voice_Shutdown(); voice.autogain.block_size = 128;
voice.autogain.block_size = 128; if( !Voice_InitOpusDecoder( ))
{
// no reason to init encoder and open audio device
// if we can't hear other players
Con_Printf( S_ERROR "Voice chat disabled.\n" );
Voice_Shutdown();
return false;
}
if( !Voice_InitOpusDecoder( )) // we can hear others players, so it's fine to fail now
{ voice.initialized = true;
// no reason to init encoder and open audio device Q_strncpy( voice.codec, pszCodecName, sizeof( voice.codec ));
// if we can't hear other players
Con_Printf( S_ERROR "Voice chat disabled.\n" );
Voice_Shutdown();
return false;
}
// we can hear others players, so it's fine to fail now if( !Voice_InitOpusEncoder( quality ))
voice.initialized = true; {
Q_strncpy( voice.codec, pszCodecName, sizeof( voice.codec )); Con_Printf( S_WARN "Other players will not be able to hear you.\n" );
return false;
}
if( !Voice_InitOpusEncoder( quality )) voice.quality = quality;
{
Con_Printf( S_WARN "Other players will not be able to hear you.\n" );
return false;
} }
voice.quality = quality; if( !preinit )
{
voice.device_opened = VoiceCapture_Init();
if( !VoiceCapture_Init( )) if( !voice.device_opened )
Con_Printf( S_WARN "No microphone is available.\n" ); Con_Printf( S_WARN "No microphone is available.\n" );
}
return true; return true;
} }

3
engine/client/voice.h

@ -53,6 +53,7 @@ typedef struct voice_state_s
qboolean initialized; qboolean initialized;
qboolean is_recording; qboolean is_recording;
qboolean device_opened;
double start_time; double start_time;
voice_status_t local; voice_status_t local;
@ -92,7 +93,7 @@ extern voice_state_t voice;
void CL_AddVoiceToDatagram( void ); void CL_AddVoiceToDatagram( void );
void Voice_RegisterCvars( void ); void Voice_RegisterCvars( void );
qboolean Voice_Init( const char *pszCodecName, int quality ); qboolean Voice_Init( const char *pszCodecName, int quality, qboolean preinit );
void Voice_Idle( double frametime ); void Voice_Idle( double frametime );
qboolean Voice_IsRecording( void ); qboolean Voice_IsRecording( void );
void Voice_RecordStop( void ); void Voice_RecordStop( void );

Loading…
Cancel
Save