From a7b854d65fae0d9dc914c575b9ec7ecf88b27215 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 8 Jun 2008 08:25:25 +0000 Subject: [PATCH] VoIP: Save own voice when recording a demo. We fake a server packet and write it directly to the demo file at the point where we'd transmit to the server. This is a little nasty, but it seems to be the most reasonable solution. --- code/client/cl_input.c | 25 +++++++++++++++++++++++++ code/client/cl_main.c | 1 + code/client/cl_parse.c | 4 ++-- code/client/client.h | 6 ++++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/code/client/cl_input.c b/code/client/cl_input.c index 5eab1a23..323aba1a 100644 --- a/code/client/cl_input.c +++ b/code/client/cl_input.c @@ -800,6 +800,31 @@ void CL_WritePacket( void ) { MSG_WriteLong (&buf, clc.voipTarget3); MSG_WriteShort (&buf, clc.voipOutgoingDataSize); MSG_WriteData (&buf, clc.voipOutgoingData, clc.voipOutgoingDataSize); + + // If we're recording a demo, we have to fake a server packet with + // this VoIP data so it gets to disk; the server doesn't send it + // back to us, and we might as well eliminate concerns about dropped + // and misordered packets here. + if ( clc.demorecording && !clc.demowaiting ) { + const int voipSize = clc.voipOutgoingDataSize; + msg_t fakemsg; + byte fakedata[MAX_MSGLEN]; + MSG_Init (&fakemsg, fakedata, sizeof (fakedata)); + MSG_Bitstream (&fakemsg); + MSG_WriteLong (&fakemsg, clc.reliableAcknowledge); + MSG_WriteByte (&fakemsg, svc_EOF); + MSG_WriteByte (&fakemsg, svc_extension); + MSG_WriteByte (&fakemsg, svc_voip); + MSG_WriteShort (&fakemsg, clc.clientNum); + MSG_WriteByte (&fakemsg, clc.voipOutgoingGeneration); + MSG_WriteLong (&fakemsg, clc.voipOutgoingSequence); + MSG_WriteByte (&fakemsg, clc.voipOutgoingDataFrames); + MSG_WriteShort (&fakemsg, clc.voipOutgoingDataSize ); + MSG_WriteData (&fakemsg, clc.voipOutgoingData, voipSize); + MSG_WriteByte (&fakemsg, svc_EOF); + CL_WriteDemoMessage (&fakemsg, 0); + } + clc.voipOutgoingSequence += clc.voipOutgoingDataFrames; clc.voipOutgoingDataSize = 0; clc.voipOutgoingDataFrames = 0; diff --git a/code/client/cl_main.c b/code/client/cl_main.c index 7959bd0a..a7734c62 100644 --- a/code/client/cl_main.c +++ b/code/client/cl_main.c @@ -478,6 +478,7 @@ CL_WriteDemoMessage Dumps the current net message, prefixed by the length ==================== */ + void CL_WriteDemoMessage ( msg_t *msg, int headerBytes ) { int len, swlen; diff --git a/code/client/cl_parse.c b/code/client/cl_parse.c index 18cbe279..2219529d 100644 --- a/code/client/cl_parse.c +++ b/code/client/cl_parse.c @@ -641,8 +641,8 @@ qboolean CL_ShouldIgnoreVoipSender(int sender) { if (!voip->integer) return qtrue; // VoIP is disabled. - else if (sender == clc.clientNum) - return qtrue; // this is us, don't output our own voice. + else if ((sender == clc.clientNum) && (!clc.demoplaying)) + return qtrue; // ignore own voice (unless playing back a demo). else if (clc.voipMuteAll) return qtrue; // all channels are muted with extreme prejudice. else if (clc.voipIgnore[sender]) diff --git a/code/client/client.h b/code/client/client.h index 329d67ac..682b3cf3 100644 --- a/code/client/client.h +++ b/code/client/client.h @@ -615,3 +615,9 @@ void CL_WriteAVIVideoFrame( const byte *imageBuffer, int size ); void CL_WriteAVIAudioFrame( const byte *pcmBuffer, int size ); qboolean CL_CloseAVI( void ); qboolean CL_VideoRecording( void ); + +// +// cl_main.c +// +void CL_WriteDemoMessage ( msg_t *msg, int headerBytes ); +