From 41fd71487ee41196b9fbe3e701a6c5414f20a8a3 Mon Sep 17 00:00:00 2001 From: icculus Date: Wed, 4 Jun 2008 21:50:00 +0000 Subject: VoIP: functionality to adjust incoming audio gain, per-user. git-svn-id: svn://svn.icculus.org/quake3/trunk@1366 edf5b092-35ff-0310-97b2-ce42778d08ea --- code/client/cl_cgame.c | 2 ++ code/client/cl_input.c | 33 ++++++++++++++++++++++++++++++--- code/client/cl_main.c | 2 ++ code/client/client.h | 7 +++++++ 4 files changed, 41 insertions(+), 3 deletions(-) (limited to 'code') 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 -- cgit v1.2.3