From 4c8c8fb6c6fc2173197183edc21a9b3d561dd235 Mon Sep 17 00:00:00 2001 From: Ben Millwood Date: Tue, 19 Oct 2010 13:53:48 +0100 Subject: [PATCH] * (bug 3787) only parse cl_voipTarget at the beginning of each generation --- code/client/cl_input.c | 40 --------------------- code/client/cl_main.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 40 deletions(-) diff --git ioq3-r1799/code/client/cl_input.c voip-parsing/code/client/cl_input.c index a42030d..21da4ea 100644 --- ioq3-r1799/code/client/cl_input.c +++ voip-parsing/code/client/cl_input.c @@ -796,46 +796,6 @@ void CL_WritePacket( void ) { #ifdef USE_VOIP if (clc.voipOutgoingDataSize > 0) { // only send if data. - // Move cl_voipSendTarget from a string to the bitmasks if needed. - if (cl_voipSendTarget->modified) { - char buffer[32]; - const char *target = cl_voipSendTarget->string; - - if (Q_stricmp(target, "attacker") == 0) { - int player = VM_Call( cgvm, CG_LAST_ATTACKER ); - Com_sprintf(buffer, sizeof (buffer), "%d", player); - target = buffer; - } else if (Q_stricmp(target, "crosshair") == 0) { - int player = VM_Call( cgvm, CG_CROSSHAIR_PLAYER ); - Com_sprintf(buffer, sizeof (buffer), "%d", player); - target = buffer; - } - - if ((*target == '\0') || (Q_stricmp(target, "all") == 0)) { - const int all = 0x7FFFFFFF; - clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = all; - } else if (Q_stricmp(target, "none") == 0) { - clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0; - } else { - const char *ptr = target; - clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0; - 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; - } - MSG_WriteByte (&buf, clc_EOF); // placate legacy servers. MSG_WriteByte (&buf, clc_extension); MSG_WriteByte (&buf, clc_voip); diff --git ioq3-r1799/code/client/cl_main.c voip-parsing/code/client/cl_main.c index 2b4be3a..b4f5fdd 100644 --- ioq3-r1799/code/client/cl_main.c +++ voip-parsing/code/client/cl_main.c @@ -281,6 +281,94 @@ void CL_VoipNewGeneration(void) /* =============== +CL_VoipParseTargets + +sets clc.voipTargets according to cl_voipSendTarget +Generally we don't want who's listening to change during a transmission, +so this is only called when the key is first pressed +=============== +*/ +void CL_VoipParseTargets(void) +{ + char buffer[32]; + const char *target = cl_voipSendTarget->string; + qboolean attacker; + + attacker = Q_stricmp( target, "attacker" ) == 0; + + if( attacker || Q_stricmp( target, "crosshair" ) == 0 ) + { + int player; + + if( attacker ) + player = VM_Call( cgvm, CG_LAST_ATTACKER ); + else + player = VM_Call( cgvm, CG_CROSSHAIR_PLAYER ); + + if( player < 0 ) + Q_strncpyz( buffer, "none", sizeof( buffer ) ); + else + Com_sprintf( buffer, sizeof( buffer ), "%d", player ); + + target = buffer; + } + + 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 + { + char *end; + int val; + + clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0; + + while( 1 ) + { + // It's a bit silly to accept ",,,0,,9," but equally + // it's silly to expend effort rejecting it. + while( *target == ',' || isspace( *target ) ) + target++; + + if( !*target ) + break; + + val = strtol( target, &end, 10 ); + + if( target == end ) + { + Com_Printf( S_COLOR_RED "ERROR: failed " + "to parse VoIP target string.\n" ); + break; + } + + if( val < 0 || val >= MAX_CLIENTS ) + { + Com_Printf( S_COLOR_YELLOW "WARNING: VoIP " + "target %d is not a valid client " + "number.\n", val ); + } + else if( val < 31 ) + clc.voipTarget1 |= (1 << val); + else if( val < 62 ) + clc.voipTarget2 |= (1 << (val - 31)); + else if( val < 93 ) + clc.voipTarget3 |= (1 << (val - 62)); + else + { + Com_Printf( S_COLOR_RED "ERROR: VoIP " + "target %d is outside transmissible " + "range.\n", val ); + } + + target = end; + } + } +} + +/* +=============== CL_CaptureVoip Record more audio from the hardware if required and encode it into Speex @@ -350,6 +438,7 @@ void CL_CaptureVoip(void) S_MasterGain(cl_voipGainDuringCapture->value); S_StartCapture(); CL_VoipNewGeneration(); + CL_VoipParseTargets(); } if ((cl_voipSend->integer) || (finalFrame)) { // user wants to capture audio? -- 1.7.3.1