aboutsummaryrefslogtreecommitdiffstats
path: root/code/client
diff options
context:
space:
mode:
authoricculus <icculus@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-06-08 08:25:25 +0000
committericculus <icculus@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-06-08 08:25:25 +0000
commitba53563804ad3589f5ad5618230606dd3cb4410f (patch)
treef6362763e85fa190ab609fd53d44586040d11604 /code/client
parent0cfbb51836fefc35f6e1aa612d6bc77203d6b1d3 (diff)
downloadioquake3-aero-ba53563804ad3589f5ad5618230606dd3cb4410f.tar.gz
ioquake3-aero-ba53563804ad3589f5ad5618230606dd3cb4410f.zip
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. git-svn-id: svn://svn.icculus.org/quake3/trunk@1382 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'code/client')
-rw-r--r--code/client/cl_input.c25
-rw-r--r--code/client/cl_main.c1
-rw-r--r--code/client/cl_parse.c4
-rw-r--r--code/client/client.h6
4 files changed, 34 insertions, 2 deletions
diff --git a/code/client/cl_input.c b/code/client/cl_input.c
index 5eab1a2..323aba1 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 7959bd0..a7734c6 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 18cbe27..2219529 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 329d67a..682b3cf 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 );
+