aboutsummaryrefslogtreecommitdiffstats
path: root/code/client/cl_main.c
diff options
context:
space:
mode:
authoricculus <icculus@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-06-08 07:09:10 +0000
committericculus <icculus@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-06-08 07:09:10 +0000
commitcb33a80a6843fdc76ef82ee86cf5c90c23060ff3 (patch)
treef24c0d94839cba075b8c2b9cf659178b163dfaa8 /code/client/cl_main.c
parent1578ade96332b449ae175385c7dbb1782740bc81 (diff)
downloadioquake3-aero-cb33a80a6843fdc76ef82ee86cf5c90c23060ff3.tar.gz
ioquake3-aero-cb33a80a6843fdc76ef82ee86cf5c90c23060ff3.zip
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." git-svn-id: svn://svn.icculus.org/quake3/trunk@1377 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'code/client/cl_main.c')
-rw-r--r--code/client/cl_main.c30
1 files changed, 12 insertions, 18 deletions
diff --git a/code/client/cl_main.c b/code/client/cl_main.c
index 334b6a5..3fa0933 100644
--- a/code/client/cl_main.c
+++ b/code/client/cl_main.c
@@ -283,11 +283,8 @@ void CL_CaptureVoip(void)
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 @@ void CL_CaptureVoip(void)
// 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 @@ void CL_CaptureVoip(void)
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 @@ void CL_CaptureVoip(void)
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;