r1377 - trunk/code/client

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Jun 8 03:09:10 EDT 2008


Author: icculus
Date: 2008-06-08 03:09:10 -0400 (Sun, 08 Jun 2008)
New Revision: 1377

Modified:
   trunk/code/client/cl_cgame.c
   trunk/code/client/cl_main.c
Log:
VoIP: attempt at changing voipPower calc and using it for VAD.

The Speex VAD sort of sucks, honestly, or I'm not using it right. Now
 trying this algorithm, after denoising:

    http://lists.xiph.org/pipermail/speex-dev/2006-March/004269.html

And I'll play around to find the threshold for considering a set of frames
 to be "voice" from there.

Also worth noting: we consider the power of the set of frames as a whole, so
 you need to sustain power for 0.25 seconds at a time, or it's not "voice."



Modified: trunk/code/client/cl_cgame.c
===================================================================
--- trunk/code/client/cl_cgame.c	2008-06-07 14:41:21 UTC (rev 1376)
+++ trunk/code/client/cl_cgame.c	2008-06-08 07:09:10 UTC (rev 1377)
@@ -937,10 +937,6 @@
 		speex_preprocess_ctl(clc.speexPreprocessor,
 		                     SPEEX_PREPROCESS_SET_DENOISE, &i);
 
-		i = (cl_voipUseVAD->integer != 0);
-		speex_preprocess_ctl(clc.speexPreprocessor,
-		                     SPEEX_PREPROCESS_SET_VAD, &i);
-
 		for (i = 0; i < MAX_CLIENTS; i++) {
 			speex_bits_init(&clc.speexDecoderBits[i]);
 			speex_bits_reset(&clc.speexDecoderBits[i]);

Modified: trunk/code/client/cl_main.c
===================================================================
--- trunk/code/client/cl_main.c	2008-06-07 14:41:21 UTC (rev 1376)
+++ trunk/code/client/cl_main.c	2008-06-08 07:09:10 UTC (rev 1377)
@@ -283,11 +283,8 @@
 		return;  // packet is pending transmission, don't record more yet.
 
 	if (cl_voipUseVAD->modified) {
-		int useVadi = (int) useVad;
-		speex_preprocess_ctl(clc.speexPreprocessor,
-		                     SPEEX_PREPROCESS_SET_VAD, &useVadi);
-		cl_voipUseVAD->modified = qfalse;
 		Cvar_Set("cl_voipSend", (useVad) ? "1" : "0");
+		cl_voipUseVAD->modified = qfalse;
 	}
 
 	if ((useVad) && (!cl_voipSend->integer))
@@ -339,8 +336,7 @@
 			// audio capture is always MONO16 (and that's what speex wants!).
 			//  2048 will cover 12 uncompressed frames in narrowband mode.
 			static int16_t sampbuffer[2048];
-			qboolean isVoice = qfalse;
-			int16_t voipPower = 0;
+			float voipPower = 0.0f;
 			int speexFrames = 0;
 			int wpos = 0;
 			int pos = 0;
@@ -359,19 +355,15 @@
 				int16_t *sampptr = &sampbuffer[pos];
 				int i, bytes;
 
+				// preprocess samples to remove noise...
+				speex_preprocess_run(clc.speexPreprocessor, sampptr);
+
 				// check the "power" of this packet...
 				for (i = 0; i < clc.speexFrameSize; i++) {
-					int16_t s = sampptr[i];
-					if (s < 0)
-						s = -s;
-					if (s > voipPower)
-						voipPower = s;  // !!! FIXME: this isn't very clever.
+					const float s = fabs((float) sampptr[i]);
+					voipPower += s * s;
 				}
 
-				// preprocess samples to remove noise, check for voice...
-				if (speex_preprocess_run(clc.speexPreprocessor, sampptr))
-					isVoice = qtrue;  // player is probably speaking.
-
 				// encode raw audio samples into Speex data...
 				speex_bits_reset(&clc.speexEncoderBits);
 				speex_encode_int(clc.speexEncoder, sampptr,
@@ -389,10 +381,12 @@
 				speexFrames++;
 			}
 
-			if ((useVad) && (!isVoice)) {
-				CL_VoipNewGeneration();  // no talk for at least 1/4 second.
+			clc.voipPower = voipPower / (32768.0f * 32768.0f *
+			              ((float) (clc.speexFrameSize * speexFrames)));
+
+			if ((useVad) && (clc.voipPower > 0.25f)) {
+				CL_VoipNewGeneration();  // no "talk" for at least 1/4 second.
 			} else {
-				clc.voipPower = ((float) voipPower) / 32767.0f;
 				clc.voipOutgoingDataSize = wpos;
 				clc.voipOutgoingDataFrames = speexFrames;
 




More information about the quake3-commits mailing list