Trying to make voicechat controls more usable.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3660 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
188d0b5225
commit
6d7724f339
5 changed files with 78 additions and 34 deletions
|
@ -2256,6 +2256,10 @@ void CL_ParseServerData (void)
|
|||
|
||||
cl.sendprespawn = false;
|
||||
|
||||
#ifdef VOICECHAT
|
||||
S_Voip_MapChange();
|
||||
#endif
|
||||
|
||||
#ifdef VM_CG
|
||||
CG_Stop();
|
||||
#endif
|
||||
|
|
|
@ -905,6 +905,7 @@ static WAVEFORMATEX wfxFormat;
|
|||
|
||||
qboolean SNDDMA_InitCapture (void)
|
||||
{
|
||||
DWORD capturePos;
|
||||
DSCBUFFERDESC bufdesc;
|
||||
|
||||
wfxFormat.wFormatTag = WAVE_FORMAT_PCM;
|
||||
|
@ -970,7 +971,7 @@ qboolean SNDDMA_InitCapture (void)
|
|||
IDirectSoundCaptureBuffer_Start(DSCaptureBuffer, DSBPLAY_LOOPING);
|
||||
|
||||
lastreadpos = 0;
|
||||
|
||||
IDirectSoundCaptureBuffer_GetCurrentPosition(DSCaptureBuffer, &capturePos, &lastreadpos);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -106,8 +106,9 @@ cvar_t snd_usemultipledevices = CVARAF( "s_multipledevices", "0",
|
|||
"snd_multipledevices", 0);
|
||||
|
||||
#ifdef VOICECHAT
|
||||
static void S_Voip_Play_Callback(cvar_t *var, char *oldval);
|
||||
cvar_t cl_voip_send = CVAR("cl_voip_send", "0");
|
||||
cvar_t cl_voip_play = CVAR("cl_voip_play", "1");
|
||||
cvar_t cl_voip_play = CVARC("cl_voip_play", "1", S_Voip_Play_Callback);
|
||||
cvar_t cl_voip_micamp = CVAR("cl_voip_micamp", "2");
|
||||
#endif
|
||||
|
||||
|
@ -159,7 +160,7 @@ void S_SoundInfo_f(void)
|
|||
#ifdef VOICECHAT
|
||||
#include "speex/speex.h"
|
||||
#include "speex/speex_preprocess.h"
|
||||
struct
|
||||
static struct
|
||||
{
|
||||
qboolean inited;
|
||||
qboolean loaded;
|
||||
|
@ -175,26 +176,27 @@ struct
|
|||
SpeexBits decbits[MAX_CLIENTS];
|
||||
void *decoder[MAX_CLIENTS];
|
||||
unsigned char decseq[MAX_CLIENTS];
|
||||
float decamp[MAX_CLIENTS];
|
||||
} s_speex;
|
||||
|
||||
const SpeexMode *(VARGS *qspeex_lib_get_mode)(int mode);
|
||||
void (VARGS *qspeex_bits_init)(SpeexBits *bits);
|
||||
void (VARGS *qspeex_bits_reset)(SpeexBits *bits);
|
||||
int (VARGS *qspeex_bits_write)(SpeexBits *bits, char *bytes, int max_len);
|
||||
static const SpeexMode *(VARGS *qspeex_lib_get_mode)(int mode);
|
||||
static void (VARGS *qspeex_bits_init)(SpeexBits *bits);
|
||||
static void (VARGS *qspeex_bits_reset)(SpeexBits *bits);
|
||||
static int (VARGS *qspeex_bits_write)(SpeexBits *bits, char *bytes, int max_len);
|
||||
|
||||
SpeexPreprocessState *(VARGS *qspeex_preprocess_state_init)(int frame_size, int sampling_rate);
|
||||
int (VARGS *qspeex_preprocess_ctl)(SpeexPreprocessState *st, int request, void *ptr);
|
||||
int (VARGS *qspeex_preprocess_run)(SpeexPreprocessState *st, spx_int16_t *x);
|
||||
static SpeexPreprocessState *(VARGS *qspeex_preprocess_state_init)(int frame_size, int sampling_rate);
|
||||
static int (VARGS *qspeex_preprocess_ctl)(SpeexPreprocessState *st, int request, void *ptr);
|
||||
static int (VARGS *qspeex_preprocess_run)(SpeexPreprocessState *st, spx_int16_t *x);
|
||||
|
||||
void * (VARGS *qspeex_encoder_init)(const SpeexMode *mode);
|
||||
int (VARGS *qspeex_encoder_ctl)(void *state, int request, void *ptr);
|
||||
int (VARGS *qspeex_encode_int)(void *state, spx_int16_t *in, SpeexBits *bits);
|
||||
static void * (VARGS *qspeex_encoder_init)(const SpeexMode *mode);
|
||||
static int (VARGS *qspeex_encoder_ctl)(void *state, int request, void *ptr);
|
||||
static int (VARGS *qspeex_encode_int)(void *state, spx_int16_t *in, SpeexBits *bits);
|
||||
|
||||
void *(VARGS *qspeex_decoder_init)(const SpeexMode *mode);
|
||||
int (VARGS *qspeex_decode_int)(void *state, SpeexBits *bits, spx_int16_t *out);
|
||||
void (VARGS *qspeex_bits_read_from)(SpeexBits *bits, char *bytes, int len);
|
||||
static void *(VARGS *qspeex_decoder_init)(const SpeexMode *mode);
|
||||
static int (VARGS *qspeex_decode_int)(void *state, SpeexBits *bits, spx_int16_t *out);
|
||||
static void (VARGS *qspeex_bits_read_from)(SpeexBits *bits, char *bytes, int len);
|
||||
|
||||
dllfunction_t qspeexfuncs[] =
|
||||
static dllfunction_t qspeexfuncs[] =
|
||||
{
|
||||
{(void*)&qspeex_lib_get_mode, "speex_lib_get_mode"},
|
||||
{(void*)&qspeex_bits_init, "speex_bits_init"},
|
||||
|
@ -211,7 +213,7 @@ dllfunction_t qspeexfuncs[] =
|
|||
|
||||
{NULL}
|
||||
};
|
||||
dllfunction_t qspeexdspfuncs[] =
|
||||
static dllfunction_t qspeexdspfuncs[] =
|
||||
{
|
||||
{(void*)&qspeex_preprocess_state_init, "speex_preprocess_state_init"},
|
||||
{(void*)&qspeex_preprocess_ctl, "speex_preprocess_ctl"},
|
||||
|
@ -220,7 +222,7 @@ dllfunction_t qspeexdspfuncs[] =
|
|||
{NULL}
|
||||
};
|
||||
|
||||
qboolean S_Speex_Init(void)
|
||||
static qboolean S_Speex_Init(void)
|
||||
{
|
||||
int i;
|
||||
const SpeexMode *mode;
|
||||
|
@ -266,6 +268,7 @@ qboolean S_Speex_Init(void)
|
|||
qspeex_bits_init(&s_speex.decbits[i]);
|
||||
qspeex_bits_reset(&s_speex.decbits[i]);
|
||||
s_speex.decoder[i] = qspeex_decoder_init(mode);
|
||||
s_speex.decamp[i] = 1;
|
||||
}
|
||||
s_speex.loaded = true;
|
||||
return s_speex.loaded;
|
||||
|
@ -279,6 +282,8 @@ void S_ParseVoiceChat(void)
|
|||
short decodebuf[1024];
|
||||
unsigned int decodesamps, len, newseq, drops;
|
||||
unsigned char seq;
|
||||
float amp = 1;
|
||||
unsigned int i;
|
||||
seq = MSG_ReadByte();
|
||||
bytes = MSG_ReadShort();
|
||||
if (bytes > sizeof(data) || !cl_voip_play.ival)
|
||||
|
@ -290,6 +295,8 @@ void S_ParseVoiceChat(void)
|
|||
|
||||
sender &= MAX_CLIENTS-1;
|
||||
|
||||
amp = s_speex.decamp[sender];
|
||||
|
||||
decodesamps = 0;
|
||||
newseq = 0;
|
||||
drops = 0;
|
||||
|
@ -318,6 +325,11 @@ void S_ParseVoiceChat(void)
|
|||
qspeex_decode_int(s_speex.decoder[sender], &s_speex.decbits[sender], decodebuf + decodesamps);
|
||||
newseq++;
|
||||
}
|
||||
if (amp != 1)
|
||||
{
|
||||
for (i = decodesamps; i < decodesamps+s_speex.framesize; i++)
|
||||
decodebuf[i] *= amp;
|
||||
}
|
||||
decodesamps += s_speex.framesize;
|
||||
}
|
||||
s_speex.decseq[sender] += newseq;
|
||||
|
@ -346,13 +358,19 @@ void S_TransmitVoiceChat(unsigned char clc, sizebuf_t *buf)
|
|||
//add new drivers in order or desirability.
|
||||
if (pDSOUND_UpdateCapture)
|
||||
{
|
||||
capturepos += pDSOUND_UpdateCapture(cl_voip_send.ival, (unsigned char*)capturebuf + capturepos, 64, sizeof(capturebuf) - capturepos);
|
||||
capturepos += pDSOUND_UpdateCapture(1, (unsigned char*)capturebuf + capturepos, 64, sizeof(capturebuf) - capturepos);
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cl_voip_send.ival)
|
||||
{
|
||||
capturepos = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (!S_Speex_Init())
|
||||
return;
|
||||
|
||||
|
@ -392,14 +410,31 @@ void S_TransmitVoiceChat(unsigned char clc, sizebuf_t *buf)
|
|||
capturepos -= encpos;
|
||||
}
|
||||
|
||||
void S_Voip_Enable_f(void)
|
||||
static void S_Voip_Enable_f(void)
|
||||
{
|
||||
Cvar_Set(&cl_voip_send, "1");
|
||||
}
|
||||
void S_Voip_Disable_f(void)
|
||||
static void S_Voip_Disable_f(void)
|
||||
{
|
||||
Cvar_Set(&cl_voip_send, "0");
|
||||
}
|
||||
static void S_Voip_f(void)
|
||||
{
|
||||
}
|
||||
static void S_Voip_Play_Callback(cvar_t *var, char *oldval)
|
||||
{
|
||||
if (cls.fteprotocolextensions2 & PEXT2_VOICECHAT)
|
||||
{
|
||||
if (var->ival)
|
||||
CL_SendClientCommand(true, "unmuteall");
|
||||
else
|
||||
CL_SendClientCommand(true, "muteall");
|
||||
}
|
||||
}
|
||||
void S_Voip_MapChange(void)
|
||||
{
|
||||
Cvar_ForceCallback(&cl_voip_play);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
|
|
@ -150,6 +150,7 @@ void S_ResetFailedLoad(void);
|
|||
#ifdef VOICECHAT
|
||||
void S_ParseVoiceChat(void);
|
||||
void S_TransmitVoiceChat(unsigned char clc, sizebuf_t *buf);
|
||||
void S_Voip_MapChange(void);
|
||||
#endif
|
||||
|
||||
qboolean S_IsPlayingSomewhere(sfx_t *s);
|
||||
|
|
|
@ -44,17 +44,17 @@ cvar_t sv_spectalk = SCVAR("sv_spectalk", "1");
|
|||
|
||||
cvar_t sv_mapcheck = SCVAR("sv_mapcheck", "1");
|
||||
|
||||
cvar_t sv_antilag = SCVARF("sv_antilag", "0", CVAR_SERVERINFO);
|
||||
cvar_t sv_antilag_frac = SCVARF("sv_antilag_frac", "1", CVAR_SERVERINFO);
|
||||
cvar_t sv_cheatpc = SCVAR("sv_cheatpc", "125");
|
||||
cvar_t sv_cheatspeedchecktime = SCVAR("sv_cheatspeedchecktime", "30");
|
||||
cvar_t sv_playermodelchecks = SCVAR("sv_playermodelchecks", "1");
|
||||
cvar_t sv_antilag = CVARFD("sv_antilag", "0", CVAR_SERVERINFO, "Attempt to backdate impacts to compensate for lag.");
|
||||
cvar_t sv_antilag_frac = CVARF("sv_antilag_frac", "1", CVAR_SERVERINFO);
|
||||
cvar_t sv_cheatpc = CVAR("sv_cheatpc", "125");
|
||||
cvar_t sv_cheatspeedchecktime = CVAR("sv_cheatspeedchecktime", "30");
|
||||
cvar_t sv_playermodelchecks = CVAR("sv_playermodelchecks", "1");
|
||||
|
||||
cvar_t sv_cmdlikercon = SCVAR("sv_cmdlikercon", "0"); //set to 1 to allow a password of username:password instead of the correct rcon password.
|
||||
cvar_t cmd_allowaccess = SCVAR("cmd_allowaccess", "0"); //set to 1 to allow cmd to execute console commands on the server.
|
||||
cvar_t cmd_gamecodelevel = SCVAR("cmd_gamecodelevel", "50"); //execution level which gamecode is told about (for unrecognised commands)
|
||||
|
||||
cvar_t sv_nomsec = SCVAR("sv_nomsec", "0");
|
||||
cvar_t sv_nomsec = CVARD("sv_nomsec", "0", "Ignore client msec times, runs using NQ physics instead.");
|
||||
cvar_t sv_edgefriction = CVARAF("sv_edgefriction", "2",
|
||||
"edgefriction", 0);
|
||||
|
||||
|
@ -88,14 +88,15 @@ extern cvar_t pm_walljump;
|
|||
cvar_t sv_pushplayers = SCVAR("sv_pushplayers", "0");
|
||||
|
||||
//yes, realip cvars need to be fully initialised or realip will be disabled
|
||||
cvar_t sv_getrealip = SCVAR("sv_getrealip", "0");
|
||||
cvar_t sv_getrealip = CVARD("sv_getrealip", "0", "Attempt to obtain a more reliable IP for clients, rather than just their proxy.");
|
||||
cvar_t sv_realip_kick = SCVAR("sv_realip_kick", "0");
|
||||
cvar_t sv_realiphostname_ipv4 = SCVAR("sv_realiphostname_ipv4", "");
|
||||
cvar_t sv_realiphostname_ipv6 = SCVAR("sv_realiphostname_ipv6", "");
|
||||
cvar_t sv_realip_timeout = SCVAR("sv_realip_timeout", "10");
|
||||
|
||||
#ifdef VOICECHAT
|
||||
cvar_t sv_voip = CVAR("sv_voip", "1");
|
||||
cvar_t sv_voip = CVARD("sv_voip", "1", "Enable reception of voice packets.");
|
||||
cvar_t sv_voip_echo = CVARD("sv_voip_echo", "0", "Echo voice packets back to their sender, a debug/test setting.");
|
||||
#endif
|
||||
|
||||
char sv_votinggroup[] = "server voting";
|
||||
|
@ -2134,8 +2135,8 @@ void SV_VoiceReadPacket(void)
|
|||
ring->receiver[j] = 0;
|
||||
for (j = 0, cl = svs.clients; j < sv.allocated_client_slots; j++, cl++)
|
||||
{
|
||||
// if (cl == host_client)
|
||||
// continue;
|
||||
if (cl == host_client && !sv_voip_echo.ival)
|
||||
continue;
|
||||
|
||||
if (cl->state != cs_spawned && cl->state != cs_connected)
|
||||
continue;
|
||||
|
@ -2208,16 +2209,17 @@ void SV_VoiceSendPacket(client_t *client, sizebuf_t *buf)
|
|||
if (client->download)
|
||||
send = false;
|
||||
|
||||
client->voice_read++;
|
||||
|
||||
if (send)
|
||||
{
|
||||
if (buf->maxsize - buf->cursize < ring->datalen+5)
|
||||
break;
|
||||
MSG_WriteByte(buf, svcfte_voicechat);
|
||||
MSG_WriteByte(buf, ring->sender);
|
||||
MSG_WriteByte(buf, ring->seq);
|
||||
MSG_WriteShort(buf, ring->datalen);
|
||||
SZ_Write(buf, ring->data, ring->datalen);
|
||||
}
|
||||
client->voice_read++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6364,6 +6366,7 @@ void SV_UserInit (void)
|
|||
{
|
||||
#ifdef VOICECHAT
|
||||
Cvar_Register (&sv_voip, cvargroup_serverpermissions);
|
||||
Cvar_Register (&sv_voip_echo, cvargroup_serverpermissions);
|
||||
#endif
|
||||
#ifdef SERVERONLY
|
||||
Cvar_Register (&cl_rollspeed, "Prediction stuff");
|
||||
|
|
Loading…
Reference in a new issue