VoIP: client can now specify targets for voice transmission.

This commit is contained in:
Ryan C. Gordon 2008-06-04 21:49:15 +00:00
parent b9a9727689
commit cc18323a99
4 changed files with 21 additions and 1 deletions

View File

@ -928,6 +928,7 @@ void CL_FirstSnapshot( void ) {
speex_bits_reset(&clc.speexDecoderBits[i]); speex_bits_reset(&clc.speexDecoderBits[i]);
clc.speexDecoder[i] = speex_decoder_init(&speex_nb_mode); clc.speexDecoder[i] = speex_decoder_init(&speex_nb_mode);
clc.voipIgnore[i] = qfalse; clc.voipIgnore[i] = qfalse;
clc.voipGain[i] = 1.0f;
} }
speex_encoder_ctl(clc.speexEncoder, SPEEX_GET_FRAME_SIZE, speex_encoder_ctl(clc.speexEncoder, SPEEX_GET_FRAME_SIZE,
&clc.speexFrameSize); &clc.speexFrameSize);

View File

@ -190,6 +190,20 @@ void CL_UpdateVoipIgnore(const char *idstr, qboolean ignore)
} }
} }
static
void CL_UpdateVoipGain(const char *idstr, float gain)
{
if ((*idstr >= '0') && (*idstr <= '9')) {
const int id = atoi(idstr);
if (gain < 0.0f)
gain = 0.0f;
if ((id >= 0) && (id < MAX_CLIENTS)) {
clc.voipGain[id] = gain;
Com_Printf("VoIP: player #%d gain now set to %f\n", id, gain);
}
}
}
void CL_Voip_f( void ) void CL_Voip_f( void )
{ {
const char *cmd = Cmd_Argv(1); const char *cmd = Cmd_Argv(1);
@ -213,6 +227,8 @@ void CL_Voip_f( void )
CL_UpdateVoipIgnore(Cmd_Argv(2), qtrue); CL_UpdateVoipIgnore(Cmd_Argv(2), qtrue);
} else if (strcmp(cmd, "unignore") == 0) { } else if (strcmp(cmd, "unignore") == 0) {
CL_UpdateVoipIgnore(Cmd_Argv(2), qfalse); CL_UpdateVoipIgnore(Cmd_Argv(2), qfalse);
} else if (strcmp(cmd, "gain") == 0) {
CL_UpdateVoipGain(Cmd_Argv(2), atof(Cmd_Argv(3)));
} else if (strcmp(cmd, "muteall") == 0) { } else if (strcmp(cmd, "muteall") == 0) {
Com_Printf("VoIP: muting incoming voice\n"); Com_Printf("VoIP: muting incoming voice\n");
CL_AddReliableCommand("voip muteall"); CL_AddReliableCommand("voip muteall");

View File

@ -647,6 +647,8 @@ qboolean CL_ShouldIgnoreVoipSender(int sender)
return qtrue; // all channels are muted with extreme prejudice. return qtrue; // all channels are muted with extreme prejudice.
else if (clc.voipIgnore[sender]) else if (clc.voipIgnore[sender])
return qtrue; // just ignoring this guy. return qtrue; // just ignoring this guy.
else if (clc.voipGain[sender] == 0.0f)
return qtrue; // too quiet to play.
return qfalse; // !!! FIXME: implement per-channel muting. return qfalse; // !!! FIXME: implement per-channel muting.
} }
@ -758,7 +760,7 @@ void CL_ParseVoip ( msg_t *msg ) {
Com_DPrintf("VoIP: playback %d bytes, %d samples, %d frames\n", Com_DPrintf("VoIP: playback %d bytes, %d samples, %d frames\n",
written * 2, written, i); written * 2, written, i);
S_RawSamples(sender + 1, written, 8000, 2, 1, S_RawSamples(sender + 1, written, 8000, 2, 1,
(const byte *) decoded, 1.0f); // !!! FIXME: hardcoding! (const byte *) decoded, clc.voipGain[sender]); // !!! FIXME: hardcoding!
written = 0; written = 0;
} }

View File

@ -239,6 +239,7 @@ typedef struct {
void *speexDecoder[MAX_CLIENTS]; void *speexDecoder[MAX_CLIENTS];
byte voipIncomingGeneration[MAX_CLIENTS]; byte voipIncomingGeneration[MAX_CLIENTS];
int voipIncomingSequence[MAX_CLIENTS]; int voipIncomingSequence[MAX_CLIENTS];
float voipGain[MAX_CLIENTS];
qboolean voipIgnore[MAX_CLIENTS]; qboolean voipIgnore[MAX_CLIENTS];
qboolean voipMuteAll; qboolean voipMuteAll;