diff options
author | icculus <icculus@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2008-06-08 08:25:25 +0000 |
---|---|---|
committer | icculus <icculus@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2008-06-08 08:25:25 +0000 |
commit | ba53563804ad3589f5ad5618230606dd3cb4410f (patch) | |
tree | f6362763e85fa190ab609fd53d44586040d11604 | |
parent | 0cfbb51836fefc35f6e1aa612d6bc77203d6b1d3 (diff) | |
download | ioquake3-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
-rw-r--r-- | code/client/cl_input.c | 25 | ||||
-rw-r--r-- | code/client/cl_main.c | 1 | ||||
-rw-r--r-- | code/client/cl_parse.c | 4 | ||||
-rw-r--r-- | 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 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 ); + |