mirror of
https://github.com/nzp-team/fteqw.git
synced 2024-11-26 13:50:53 +00:00
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;
|
cl.sendprespawn = false;
|
||||||
|
|
||||||
|
#ifdef VOICECHAT
|
||||||
|
S_Voip_MapChange();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef VM_CG
|
#ifdef VM_CG
|
||||||
CG_Stop();
|
CG_Stop();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -905,6 +905,7 @@ static WAVEFORMATEX wfxFormat;
|
||||||
|
|
||||||
qboolean SNDDMA_InitCapture (void)
|
qboolean SNDDMA_InitCapture (void)
|
||||||
{
|
{
|
||||||
|
DWORD capturePos;
|
||||||
DSCBUFFERDESC bufdesc;
|
DSCBUFFERDESC bufdesc;
|
||||||
|
|
||||||
wfxFormat.wFormatTag = WAVE_FORMAT_PCM;
|
wfxFormat.wFormatTag = WAVE_FORMAT_PCM;
|
||||||
|
@ -970,7 +971,7 @@ qboolean SNDDMA_InitCapture (void)
|
||||||
IDirectSoundCaptureBuffer_Start(DSCaptureBuffer, DSBPLAY_LOOPING);
|
IDirectSoundCaptureBuffer_Start(DSCaptureBuffer, DSBPLAY_LOOPING);
|
||||||
|
|
||||||
lastreadpos = 0;
|
lastreadpos = 0;
|
||||||
|
IDirectSoundCaptureBuffer_GetCurrentPosition(DSCaptureBuffer, &capturePos, &lastreadpos);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,8 +106,9 @@ cvar_t snd_usemultipledevices = CVARAF( "s_multipledevices", "0",
|
||||||
"snd_multipledevices", 0);
|
"snd_multipledevices", 0);
|
||||||
|
|
||||||
#ifdef VOICECHAT
|
#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_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");
|
cvar_t cl_voip_micamp = CVAR("cl_voip_micamp", "2");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -159,7 +160,7 @@ void S_SoundInfo_f(void)
|
||||||
#ifdef VOICECHAT
|
#ifdef VOICECHAT
|
||||||
#include "speex/speex.h"
|
#include "speex/speex.h"
|
||||||
#include "speex/speex_preprocess.h"
|
#include "speex/speex_preprocess.h"
|
||||||
struct
|
static struct
|
||||||
{
|
{
|
||||||
qboolean inited;
|
qboolean inited;
|
||||||
qboolean loaded;
|
qboolean loaded;
|
||||||
|
@ -175,26 +176,27 @@ struct
|
||||||
SpeexBits decbits[MAX_CLIENTS];
|
SpeexBits decbits[MAX_CLIENTS];
|
||||||
void *decoder[MAX_CLIENTS];
|
void *decoder[MAX_CLIENTS];
|
||||||
unsigned char decseq[MAX_CLIENTS];
|
unsigned char decseq[MAX_CLIENTS];
|
||||||
|
float decamp[MAX_CLIENTS];
|
||||||
} s_speex;
|
} s_speex;
|
||||||
|
|
||||||
const SpeexMode *(VARGS *qspeex_lib_get_mode)(int mode);
|
static const SpeexMode *(VARGS *qspeex_lib_get_mode)(int mode);
|
||||||
void (VARGS *qspeex_bits_init)(SpeexBits *bits);
|
static void (VARGS *qspeex_bits_init)(SpeexBits *bits);
|
||||||
void (VARGS *qspeex_bits_reset)(SpeexBits *bits);
|
static void (VARGS *qspeex_bits_reset)(SpeexBits *bits);
|
||||||
int (VARGS *qspeex_bits_write)(SpeexBits *bits, char *bytes, int max_len);
|
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);
|
static SpeexPreprocessState *(VARGS *qspeex_preprocess_state_init)(int frame_size, int sampling_rate);
|
||||||
int (VARGS *qspeex_preprocess_ctl)(SpeexPreprocessState *st, int request, void *ptr);
|
static int (VARGS *qspeex_preprocess_ctl)(SpeexPreprocessState *st, int request, void *ptr);
|
||||||
int (VARGS *qspeex_preprocess_run)(SpeexPreprocessState *st, spx_int16_t *x);
|
static int (VARGS *qspeex_preprocess_run)(SpeexPreprocessState *st, spx_int16_t *x);
|
||||||
|
|
||||||
void * (VARGS *qspeex_encoder_init)(const SpeexMode *mode);
|
static void * (VARGS *qspeex_encoder_init)(const SpeexMode *mode);
|
||||||
int (VARGS *qspeex_encoder_ctl)(void *state, int request, void *ptr);
|
static 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 int (VARGS *qspeex_encode_int)(void *state, spx_int16_t *in, SpeexBits *bits);
|
||||||
|
|
||||||
void *(VARGS *qspeex_decoder_init)(const SpeexMode *mode);
|
static void *(VARGS *qspeex_decoder_init)(const SpeexMode *mode);
|
||||||
int (VARGS *qspeex_decode_int)(void *state, SpeexBits *bits, spx_int16_t *out);
|
static 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_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_lib_get_mode, "speex_lib_get_mode"},
|
||||||
{(void*)&qspeex_bits_init, "speex_bits_init"},
|
{(void*)&qspeex_bits_init, "speex_bits_init"},
|
||||||
|
@ -211,7 +213,7 @@ dllfunction_t qspeexfuncs[] =
|
||||||
|
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
dllfunction_t qspeexdspfuncs[] =
|
static dllfunction_t qspeexdspfuncs[] =
|
||||||
{
|
{
|
||||||
{(void*)&qspeex_preprocess_state_init, "speex_preprocess_state_init"},
|
{(void*)&qspeex_preprocess_state_init, "speex_preprocess_state_init"},
|
||||||
{(void*)&qspeex_preprocess_ctl, "speex_preprocess_ctl"},
|
{(void*)&qspeex_preprocess_ctl, "speex_preprocess_ctl"},
|
||||||
|
@ -220,7 +222,7 @@ dllfunction_t qspeexdspfuncs[] =
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
qboolean S_Speex_Init(void)
|
static qboolean S_Speex_Init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
const SpeexMode *mode;
|
const SpeexMode *mode;
|
||||||
|
@ -266,6 +268,7 @@ qboolean S_Speex_Init(void)
|
||||||
qspeex_bits_init(&s_speex.decbits[i]);
|
qspeex_bits_init(&s_speex.decbits[i]);
|
||||||
qspeex_bits_reset(&s_speex.decbits[i]);
|
qspeex_bits_reset(&s_speex.decbits[i]);
|
||||||
s_speex.decoder[i] = qspeex_decoder_init(mode);
|
s_speex.decoder[i] = qspeex_decoder_init(mode);
|
||||||
|
s_speex.decamp[i] = 1;
|
||||||
}
|
}
|
||||||
s_speex.loaded = true;
|
s_speex.loaded = true;
|
||||||
return s_speex.loaded;
|
return s_speex.loaded;
|
||||||
|
@ -279,6 +282,8 @@ void S_ParseVoiceChat(void)
|
||||||
short decodebuf[1024];
|
short decodebuf[1024];
|
||||||
unsigned int decodesamps, len, newseq, drops;
|
unsigned int decodesamps, len, newseq, drops;
|
||||||
unsigned char seq;
|
unsigned char seq;
|
||||||
|
float amp = 1;
|
||||||
|
unsigned int i;
|
||||||
seq = MSG_ReadByte();
|
seq = MSG_ReadByte();
|
||||||
bytes = MSG_ReadShort();
|
bytes = MSG_ReadShort();
|
||||||
if (bytes > sizeof(data) || !cl_voip_play.ival)
|
if (bytes > sizeof(data) || !cl_voip_play.ival)
|
||||||
|
@ -290,6 +295,8 @@ void S_ParseVoiceChat(void)
|
||||||
|
|
||||||
sender &= MAX_CLIENTS-1;
|
sender &= MAX_CLIENTS-1;
|
||||||
|
|
||||||
|
amp = s_speex.decamp[sender];
|
||||||
|
|
||||||
decodesamps = 0;
|
decodesamps = 0;
|
||||||
newseq = 0;
|
newseq = 0;
|
||||||
drops = 0;
|
drops = 0;
|
||||||
|
@ -318,6 +325,11 @@ void S_ParseVoiceChat(void)
|
||||||
qspeex_decode_int(s_speex.decoder[sender], &s_speex.decbits[sender], decodebuf + decodesamps);
|
qspeex_decode_int(s_speex.decoder[sender], &s_speex.decbits[sender], decodebuf + decodesamps);
|
||||||
newseq++;
|
newseq++;
|
||||||
}
|
}
|
||||||
|
if (amp != 1)
|
||||||
|
{
|
||||||
|
for (i = decodesamps; i < decodesamps+s_speex.framesize; i++)
|
||||||
|
decodebuf[i] *= amp;
|
||||||
|
}
|
||||||
decodesamps += s_speex.framesize;
|
decodesamps += s_speex.framesize;
|
||||||
}
|
}
|
||||||
s_speex.decseq[sender] += newseq;
|
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.
|
//add new drivers in order or desirability.
|
||||||
if (pDSOUND_UpdateCapture)
|
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
|
else
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!cl_voip_send.ival)
|
||||||
|
{
|
||||||
|
capturepos = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!S_Speex_Init())
|
if (!S_Speex_Init())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -392,14 +410,31 @@ void S_TransmitVoiceChat(unsigned char clc, sizebuf_t *buf)
|
||||||
capturepos -= encpos;
|
capturepos -= encpos;
|
||||||
}
|
}
|
||||||
|
|
||||||
void S_Voip_Enable_f(void)
|
static void S_Voip_Enable_f(void)
|
||||||
{
|
{
|
||||||
Cvar_Set(&cl_voip_send, "1");
|
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");
|
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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -150,6 +150,7 @@ void S_ResetFailedLoad(void);
|
||||||
#ifdef VOICECHAT
|
#ifdef VOICECHAT
|
||||||
void S_ParseVoiceChat(void);
|
void S_ParseVoiceChat(void);
|
||||||
void S_TransmitVoiceChat(unsigned char clc, sizebuf_t *buf);
|
void S_TransmitVoiceChat(unsigned char clc, sizebuf_t *buf);
|
||||||
|
void S_Voip_MapChange(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qboolean S_IsPlayingSomewhere(sfx_t *s);
|
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_mapcheck = SCVAR("sv_mapcheck", "1");
|
||||||
|
|
||||||
cvar_t sv_antilag = SCVARF("sv_antilag", "0", CVAR_SERVERINFO);
|
cvar_t sv_antilag = CVARFD("sv_antilag", "0", CVAR_SERVERINFO, "Attempt to backdate impacts to compensate for lag.");
|
||||||
cvar_t sv_antilag_frac = SCVARF("sv_antilag_frac", "1", CVAR_SERVERINFO);
|
cvar_t sv_antilag_frac = CVARF("sv_antilag_frac", "1", CVAR_SERVERINFO);
|
||||||
cvar_t sv_cheatpc = SCVAR("sv_cheatpc", "125");
|
cvar_t sv_cheatpc = CVAR("sv_cheatpc", "125");
|
||||||
cvar_t sv_cheatspeedchecktime = SCVAR("sv_cheatspeedchecktime", "30");
|
cvar_t sv_cheatspeedchecktime = CVAR("sv_cheatspeedchecktime", "30");
|
||||||
cvar_t sv_playermodelchecks = SCVAR("sv_playermodelchecks", "1");
|
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 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_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 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",
|
cvar_t sv_edgefriction = CVARAF("sv_edgefriction", "2",
|
||||||
"edgefriction", 0);
|
"edgefriction", 0);
|
||||||
|
|
||||||
|
@ -88,14 +88,15 @@ extern cvar_t pm_walljump;
|
||||||
cvar_t sv_pushplayers = SCVAR("sv_pushplayers", "0");
|
cvar_t sv_pushplayers = SCVAR("sv_pushplayers", "0");
|
||||||
|
|
||||||
//yes, realip cvars need to be fully initialised or realip will be disabled
|
//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_realip_kick = SCVAR("sv_realip_kick", "0");
|
||||||
cvar_t sv_realiphostname_ipv4 = SCVAR("sv_realiphostname_ipv4", "");
|
cvar_t sv_realiphostname_ipv4 = SCVAR("sv_realiphostname_ipv4", "");
|
||||||
cvar_t sv_realiphostname_ipv6 = SCVAR("sv_realiphostname_ipv6", "");
|
cvar_t sv_realiphostname_ipv6 = SCVAR("sv_realiphostname_ipv6", "");
|
||||||
cvar_t sv_realip_timeout = SCVAR("sv_realip_timeout", "10");
|
cvar_t sv_realip_timeout = SCVAR("sv_realip_timeout", "10");
|
||||||
|
|
||||||
#ifdef VOICECHAT
|
#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
|
#endif
|
||||||
|
|
||||||
char sv_votinggroup[] = "server voting";
|
char sv_votinggroup[] = "server voting";
|
||||||
|
@ -2134,8 +2135,8 @@ void SV_VoiceReadPacket(void)
|
||||||
ring->receiver[j] = 0;
|
ring->receiver[j] = 0;
|
||||||
for (j = 0, cl = svs.clients; j < sv.allocated_client_slots; j++, cl++)
|
for (j = 0, cl = svs.clients; j < sv.allocated_client_slots; j++, cl++)
|
||||||
{
|
{
|
||||||
// if (cl == host_client)
|
if (cl == host_client && !sv_voip_echo.ival)
|
||||||
// continue;
|
continue;
|
||||||
|
|
||||||
if (cl->state != cs_spawned && cl->state != cs_connected)
|
if (cl->state != cs_spawned && cl->state != cs_connected)
|
||||||
continue;
|
continue;
|
||||||
|
@ -2208,16 +2209,17 @@ void SV_VoiceSendPacket(client_t *client, sizebuf_t *buf)
|
||||||
if (client->download)
|
if (client->download)
|
||||||
send = false;
|
send = false;
|
||||||
|
|
||||||
client->voice_read++;
|
|
||||||
|
|
||||||
if (send)
|
if (send)
|
||||||
{
|
{
|
||||||
|
if (buf->maxsize - buf->cursize < ring->datalen+5)
|
||||||
|
break;
|
||||||
MSG_WriteByte(buf, svcfte_voicechat);
|
MSG_WriteByte(buf, svcfte_voicechat);
|
||||||
MSG_WriteByte(buf, ring->sender);
|
MSG_WriteByte(buf, ring->sender);
|
||||||
MSG_WriteByte(buf, ring->seq);
|
MSG_WriteByte(buf, ring->seq);
|
||||||
MSG_WriteShort(buf, ring->datalen);
|
MSG_WriteShort(buf, ring->datalen);
|
||||||
SZ_Write(buf, ring->data, ring->datalen);
|
SZ_Write(buf, ring->data, ring->datalen);
|
||||||
}
|
}
|
||||||
|
client->voice_read++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6364,6 +6366,7 @@ void SV_UserInit (void)
|
||||||
{
|
{
|
||||||
#ifdef VOICECHAT
|
#ifdef VOICECHAT
|
||||||
Cvar_Register (&sv_voip, cvargroup_serverpermissions);
|
Cvar_Register (&sv_voip, cvargroup_serverpermissions);
|
||||||
|
Cvar_Register (&sv_voip_echo, cvargroup_serverpermissions);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SERVERONLY
|
#ifdef SERVERONLY
|
||||||
Cvar_Register (&cl_rollspeed, "Prediction stuff");
|
Cvar_Register (&cl_rollspeed, "Prediction stuff");
|
||||||
|
|
Loading…
Reference in a new issue