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