r1382 - trunk/code/client
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Sun Jun 8 04:25:33 EDT 2008
Author: icculus
Date: 2008-06-08 04:25:25 -0400 (Sun, 08 Jun 2008)
New Revision: 1382
Modified:
trunk/code/client/cl_input.c
trunk/code/client/cl_main.c
trunk/code/client/cl_parse.c
trunk/code/client/client.h
Log:
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.
Modified: trunk/code/client/cl_input.c
===================================================================
--- trunk/code/client/cl_input.c 2008-06-08 08:24:38 UTC (rev 1381)
+++ trunk/code/client/cl_input.c 2008-06-08 08:25:25 UTC (rev 1382)
@@ -800,6 +800,31 @@
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;
Modified: trunk/code/client/cl_main.c
===================================================================
--- trunk/code/client/cl_main.c 2008-06-08 08:24:38 UTC (rev 1381)
+++ trunk/code/client/cl_main.c 2008-06-08 08:25:25 UTC (rev 1382)
@@ -478,6 +478,7 @@
Dumps the current net message, prefixed by the length
====================
*/
+
void CL_WriteDemoMessage ( msg_t *msg, int headerBytes ) {
int len, swlen;
Modified: trunk/code/client/cl_parse.c
===================================================================
--- trunk/code/client/cl_parse.c 2008-06-08 08:24:38 UTC (rev 1381)
+++ trunk/code/client/cl_parse.c 2008-06-08 08:25:25 UTC (rev 1382)
@@ -641,8 +641,8 @@
{
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])
Modified: trunk/code/client/client.h
===================================================================
--- trunk/code/client/client.h 2008-06-08 08:24:38 UTC (rev 1381)
+++ trunk/code/client/client.h 2008-06-08 08:25:25 UTC (rev 1382)
@@ -615,3 +615,9 @@
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 );
+
More information about the quake3-commits
mailing list