Files
xash3d-fwgs/engine/client/voice.h
2026-04-10 14:58:46 +05:00

137 lines
3.6 KiB
C

/*
voice.h - voice chat implementation
Copyright (C) 2022 Velaron
Copyright (C) 2022 SNMetamorph
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#ifndef VOICE_H
#define VOICE_H
#include "common.h"
#include "protocol.h" // MAX_CLIENTS
#include "sound.h"
typedef struct OpusCustomEncoder OpusCustomEncoder;
typedef struct OpusCustomDecoder OpusCustomDecoder;
typedef struct OpusCustomMode OpusCustomMode;
typedef struct OpusEncoder OpusEncoder;
typedef struct OpusDecoder OpusDecoder;
#define VOICE_LOOPBACK_INDEX ( -2 )
#define VOICE_LOCALCLIENT_INDEX ( -1 )
#define VOICE_PCM_CHANNELS 1 // always mono
#define VOICE_MAX_DATA_SIZE 8192
#define VOICE_MAX_GS_DATA_SIZE 4096
// never change these parameters when using opuscustom
#define VOICE_OPUS_CUSTOM_SAMPLERATE 44100
// must follow opus custom requirements
// also be divisible with MAX_RAW_SAMPLES
#define VOICE_OPUS_CUSTOM_FRAME_SIZE 1024
#define VOICE_OPUS_CUSTOM_CODEC "opus_custom_44k_512"
// a1ba: do not change, we don't have any re-encoding support now
#define VOICE_DEFAULT_CODEC VOICE_OPUS_CUSTOM_CODEC
#define VOICE_DEFAULT_SILENCE_FRAME_SIZE 160
// GoldSrc voice configuration
#define GS_MAX_DECOMPRESSED_SAMPLES 32768
#define GS_DEFAULT_SAMPLE_RATE 24000
#define GS_DEFAULT_FRAME_SIZE 480
// VPC (Voice Packet Control) types
enum gs_vpc_type
{
GS_VPC_VDATA_SILENCE = 0,
GS_VPC_VDATA_MILES = 1,
GS_VPC_VDATA_SPEEX = 2,
GS_VPC_VDATA_RAW = 3,
GS_VPC_VDATA_SILK = 4,
GS_VPC_VDATA_OPUS_PLC = 6,
GS_VPC_SETSAMPLERATE = 11,
GS_VPC_UNKNOWN = 10
};
typedef struct voice_status_s
{
qboolean talking_ack;
double talking_timeout;
} voice_status_t;
typedef struct voice_autogain_s
{
int block_size;
float current_gain;
float next_gain;
float gain_multiplier;
} voice_autogain_t;
typedef struct voice_state_s
{
string codec;
int quality;
qboolean goldsrc;
qboolean initialized;
qboolean is_recording;
qboolean device_opened;
double start_time;
voice_status_t local;
// opus stuff
OpusCustomMode *custom_mode;
OpusCustomEncoder *encoder;
OpusCustomDecoder *decoders[MAX_CLIENTS];
OpusEncoder *gs_encoder;
OpusDecoder *gs_decoders[MAX_CLIENTS];
// audio info
uint width;
uint samplerate;
uint frame_size; // in samples
// buffers
byte input_buffer[MAX_RAW_SAMPLES];
byte compress_buffer[MAX_RAW_SAMPLES];
byte decompress_buffer[MAX_RAW_SAMPLES];
fs_offset_t input_buffer_pos; // in bytes
// input from file
wavdata_t *input_file;
fs_offset_t input_file_pos; // in bytes
voice_autogain_t autogain;
} voice_state_t;
extern voice_state_t voice;
extern convar_t voice_loopback;
void CL_AddVoiceToDatagram( void );
void Voice_RegisterCvars( void );
qboolean Voice_Init( const char *pszCodecName, int quality, qboolean preinit );
void Voice_Idle( double frametime );
qboolean Voice_IsRecording( void );
void Voice_RecordStop( void );
void Voice_RecordStart( void );
void Voice_Disconnect( void );
void Voice_AddIncomingData( int ent, const byte *data, uint size, uint frames );
void Voice_StopChannel( int entnum );
void Voice_LoopbackAck( void ); // sends VOICE_LOOPBACK_INDEX to client, gets disabled on timeout
voice_audio_info_t Voice_GetAudioInfo( void );
#endif // VOICE_H