aboutsummaryrefslogtreecommitdiffstats
path: root/code/client
diff options
context:
space:
mode:
Diffstat (limited to 'code/client')
-rw-r--r--code/client/cl_cgame.c2
-rw-r--r--code/client/cl_input.c33
-rw-r--r--code/client/cl_main.c2
-rw-r--r--code/client/client.h7
4 files changed, 41 insertions, 3 deletions
diff --git a/code/client/cl_cgame.c b/code/client/cl_cgame.c
index 56d824f..e93a73e 100644
--- a/code/client/cl_cgame.c
+++ b/code/client/cl_cgame.c
@@ -935,6 +935,8 @@ void CL_FirstSnapshot( void ) {
clc.speexInitialized = qtrue;
clc.voipMuteAll = qfalse;
Cmd_AddCommand ("voip", CL_Voip_f);
+ Cvar_Set("cl_voipSendTarget", "all");
+ clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0x7FFFFFFF;
}
#endif
}
diff --git a/code/client/cl_input.c b/code/client/cl_input.c
index ff0e5b1..46ede87 100644
--- a/code/client/cl_input.c
+++ b/code/client/cl_input.c
@@ -759,6 +759,33 @@ void CL_WritePacket( void ) {
}
#if USE_VOIP
+ // Move cl_voipSendTarget from a string to a
+ if (cl_voipSendTarget->modified) {
+ const char *target = cl_voipSendTarget->string;
+ if ((*target == '\0') || (Q_stricmp(target, "all") == 0)) {
+ clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0x7FFFFFFF;
+ } else if (Q_stricmp(target, "none") == 0) {
+ clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0;
+ } else {
+ clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0;
+ const char *ptr = target;
+ do {
+ if ((*ptr == ',') || (*ptr == '\0')) {
+ const int val = atoi(target);
+ target = ptr + 1;
+ if ((val >= 0) && (val < 31)) {
+ clc.voipTarget1 |= (1 << (val-0));
+ } else if ((val >= 31) && (val < 62)) {
+ clc.voipTarget2 |= (1 << (val-31));
+ } else if ((val >= 62) && (val < 93)) {
+ clc.voipTarget3 |= (1 << (val-62));
+ }
+ }
+ } while (*(ptr++));
+ }
+ cl_voipSendTarget->modified = qfalse;
+ }
+
if (clc.voipOutgoingDataSize > 0) { // only send if data.
MSG_WriteByte (&buf, clc_EOF); // placate legacy servers.
MSG_WriteByte (&buf, clc_extension);
@@ -766,9 +793,9 @@ void CL_WritePacket( void ) {
MSG_WriteByte (&buf, clc.voipOutgoingGeneration);
MSG_WriteLong (&buf, clc.voipOutgoingSequence);
MSG_WriteByte (&buf, clc.voipOutgoingDataFrames);
- MSG_WriteLong (&buf, 0x7FFFFFFF); // !!! FIXME: send to specific people.
- MSG_WriteLong (&buf, 0x7FFFFFFF); // !!! FIXME: send to specific people.
- MSG_WriteLong (&buf, 0x7FFFFFFF); // !!! FIXME: send to specific people.
+ MSG_WriteLong (&buf, clc.voipTarget1);
+ MSG_WriteLong (&buf, clc.voipTarget2);
+ MSG_WriteLong (&buf, clc.voipTarget3);
MSG_WriteShort (&buf, clc.voipOutgoingDataSize);
MSG_WriteData (&buf, clc.voipOutgoingData, clc.voipOutgoingDataSize);
clc.voipOutgoingSequence += clc.voipOutgoingDataFrames;
diff --git a/code/client/cl_main.c b/code/client/cl_main.c
index 43c2d65..cd6a146 100644
--- a/code/client/cl_main.c
+++ b/code/client/cl_main.c
@@ -35,6 +35,7 @@ cvar_t *cl_mumbleScale;
#if USE_VOIP
cvar_t *cl_voipSend;
+cvar_t *cl_voipSendTarget;
cvar_t *cl_voipGainDuringCapture;
cvar_t *voip;
#endif
@@ -3052,6 +3053,7 @@ void CL_Init( void ) {
#if USE_VOIP
cl_voipSend = Cvar_Get ("cl_voipSend", "0", 0);
+ cl_voipSendTarget = Cvar_Get ("cl_voipSendTarget", "all", 0);
cl_voipGainDuringCapture = Cvar_Get ("cl_voipGainDuringCapture", "0.2", CVAR_ARCHIVE);
voip = Cvar_Get ("voip", "1", CVAR_USERINFO | CVAR_ARCHIVE | CVAR_LATCH);
diff --git a/code/client/client.h b/code/client/client.h
index fb15f45..152d0b9 100644
--- a/code/client/client.h
+++ b/code/client/client.h
@@ -244,6 +244,9 @@ typedef struct {
qboolean voipMuteAll;
// outgoing data...
+ int voipTarget1; // these three ints make up a bit mask of 92 bits.
+ int voipTarget2; // the bits say who a VoIP pack is addressed to:
+ int voipTarget3; // (1 << clientnum). See cl_voipSendTarget cvar.
SpeexBits speexEncoderBits;
void *speexEncoder;
int voipOutgoingDataSize;
@@ -402,7 +405,11 @@ extern cvar_t *cl_mumbleScale;
#endif
#if USE_VOIP
+// cl_voipSendTarget is a string: "all" to broadcast to everyone, "none" to
+// send to no one, or a comma-separated list of client numbers:
+// "0,7,2,23" ... an empty string is treated like "all".
extern cvar_t *cl_voipSend;
+extern cvar_t *cl_voipSendTarget;
extern cvar_t *cl_voipGainDuringCapture;
extern cvar_t *voip;
#endif