mirror of
https://github.com/FWGS/xash3d-fwgs.git
synced 2026-08-05 03:24:56 +08:00
137 lines
3.6 KiB
C
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
|