serious cleanup of demo_t in preparation for converting it to a more

general recorder struct to be shared between the demo recorder and qtv
proxy connection(s)
This commit is contained in:
Bill Currie 2005-05-01 04:27:05 +00:00
parent 8950f3188f
commit 12eb4eb72e
3 changed files with 80 additions and 112 deletions

View file

@ -37,28 +37,9 @@ typedef struct header_s {
byte full;
int to;
int size;
byte data[1]; // gcc doesn't allow [] (?)
byte data[1];
} header_t;
typedef struct demoinfo_s {
vec3_t origin;
vec3_t angles;
int weaponframe;
int skinnum;
int model;
int effects;
} demoinfo_t;
typedef struct demo_client_s {
demoinfo_t info;
float sec;
int parsecount;
vec3_t angle;
float cmdtime;
int flags;
int frame;
} demo_client_t;
typedef struct demobuf_s {
sizebuf_t sz;
int bufsize;
@ -66,7 +47,6 @@ typedef struct demobuf_s {
} demobuf_t;
typedef struct demo_frame_s {
demo_client_t clients[MAX_CLIENTS];
double time;
demobuf_t buf;
} demo_frame_t;
@ -75,36 +55,23 @@ typedef struct demo_frame_s {
#define DEMO_FRAMES_MASK (DEMO_FRAMES - 1)
typedef struct demo_s {
QFile *file;
demobuf_t *dbuf;
dbuffer_t dbuffer;
byte buffer[20 * MAX_MSGLEN];
sizebuf_t datagram;
byte datagram_data[MAX_DATAGRAM];
int lastto;
int lasttype;
double time, pingtime;
client_t recorder;
delta_t delta;
int stats[MAX_CLIENTS][MAX_CL_STATS]; // ouch!
demoinfo_t info[MAX_CLIENTS];
demo_frame_t frames[DEMO_FRAMES];
int forceFrame;
int parsecount;
int lastwritten;
int size;
qboolean disk;
void *dest;
byte *mfile;
struct dstring_s *name;
struct dstring_s *text;
int forceFrame;
int size; // XXX doesn't belong here
} demo_t;
extern demo_t demo;

View file

@ -52,7 +52,15 @@ static __attribute__ ((unused)) const char rcsid[] =
#include "sv_demo.h"
#include "sv_progs.h"
demo_t demo;
demo_t demo;
static byte demo_buffer[20 * MAX_MSGLEN];
static byte demo_datagram_data[MAX_DATAGRAM];
static QFile *demo_file;
static byte *demo_mfile;
static qboolean demo_disk;
static dstring_t *demo_name; // filename of mvd
static dstring_t *demo_text; // filename of description file
static void *demo_dest;
#define MIN_DEMO_MEMORY 0x100000
#define USECACHE (sv_demoUseCache->int_val && svs.demomemsize)
@ -105,7 +113,7 @@ SV_WriteDemoMessage (sizebuf_t *msg, int type, int to, float time)
msec = 0;
c = msec;
demo.size += DWRITE (&c, sizeof (c), demo.dest);
demo.size += DWRITE (&c, sizeof (c), demo_dest);
if (demo.lasttype != type || demo.lastto != to) {
demo.lasttype = type;
@ -113,19 +121,19 @@ SV_WriteDemoMessage (sizebuf_t *msg, int type, int to, float time)
switch (demo.lasttype) {
case dem_all:
c = dem_all;
demo.size += DWRITE (&c, sizeof (c), demo.dest);
demo.size += DWRITE (&c, sizeof (c), demo_dest);
break;
case dem_multiple:
c = dem_multiple;
demo.size += DWRITE (&c, sizeof (c), demo.dest);
demo.size += DWRITE (&c, sizeof (c), demo_dest);
i = LittleLong (demo.lastto);
demo.size += DWRITE (&i, sizeof (i), demo.dest);
demo.size += DWRITE (&i, sizeof (i), demo_dest);
break;
case dem_single:
case dem_stats:
c = demo.lasttype + (demo.lastto << 3);
demo.size += DWRITE (&c, sizeof (c), demo.dest);
demo.size += DWRITE (&c, sizeof (c), demo_dest);
break;
default:
SV_Stop (0);
@ -134,21 +142,21 @@ SV_WriteDemoMessage (sizebuf_t *msg, int type, int to, float time)
}
} else {
c = dem_read;
demo.size += DWRITE (&c, sizeof (c), demo.dest);
demo.size += DWRITE (&c, sizeof (c), demo_dest);
}
len = LittleLong (msg->cursize);
demo.size += DWRITE (&len, 4, demo.dest);
demo.size += DWRITE (msg->data, msg->cursize, demo.dest);
demo.size += DWRITE (&len, 4, demo_dest);
demo.size += DWRITE (msg->data, msg->cursize, demo_dest);
if (demo.disk)
Qflush (demo.file);
if (demo_disk)
Qflush (demo_file);
else if (demo.size - demo_size > demo_max_size) {
demo_size = demo.size;
demo.mfile -= 0x80000;
Qwrite (demo.file, svs.demomem, 0x80000);
Qflush (demo.file);
demo_mfile -= 0x80000;
Qwrite (demo_file, svs.demomem, 0x80000);
Qflush (demo_file);
memmove (svs.demomem, svs.demomem + 0x80000, demo.size - 0x80000);
}
}
@ -357,13 +365,13 @@ SV_Stop (int reason)
if (reason == 2) {
// stop and remove
if (demo.disk)
Qclose (demo.file);
if (demo_disk)
Qclose (demo_file);
QFS_Remove (demo.name->str);
QFS_Remove (demo.text->str);
QFS_Remove (demo_name->str);
QFS_Remove (demo_text->str);
demo.file = NULL;
demo_file = NULL;
sv.demorecording = false;
SV_BroadcastPrintf (PRINT_CHAT,
@ -385,14 +393,14 @@ SV_Stop (int reason)
SV_DemoWritePackets (demo.parsecount - demo.lastwritten + 1);
// finish up
if (!demo.disk) {
Qwrite (demo.file, svs.demomem, demo.size - demo_size);
Qflush (demo.file);
if (!demo_disk) {
Qwrite (demo_file, svs.demomem, demo.size - demo_size);
Qflush (demo_file);
}
Qclose (demo.file);
Qclose (demo_file);
demo.file = NULL;
demo_file = NULL;
sv.demorecording = false;
if (!reason)
SV_BroadcastPrintf (PRINT_CHAT, "Server recording completed\n");
@ -409,8 +417,8 @@ SV_Stop (int reason)
if ((p = strstr (sv_onrecordfinish->string, " ")) != NULL)
*p = 0; // strip parameters
strcpy (path, demo.name->str);
strcpy (path + strlen (demo.name->str) - 3, "txt");
strcpy (path, demo_name->str);
strcpy (path + strlen (demo_name->str) - 3, "txt");
sv_redirected = RD_NONE; // onrecord script is called always
// from the console
@ -501,12 +509,12 @@ SV_InitRecord (void)
{
if (!USECACHE) {
dwrite = &Qwrite;
demo.dest = demo.file;
demo.disk = true;
demo_dest = demo_file;
demo_disk = true;
} else {
dwrite = &memwrite;
demo.mfile = svs.demomem;
demo.dest = &demo.mfile;
demo_mfile = svs.demomem;
demo_dest = &demo_mfile;
}
demo_size = 0;
@ -527,18 +535,18 @@ SV_WriteRecordDemoMessage (sizebuf_t *msg)
byte c;
c = 0;
demo.size += DWRITE (&c, sizeof (c), demo.dest);
demo.size += DWRITE (&c, sizeof (c), demo_dest);
c = dem_read;
demo.size += DWRITE (&c, sizeof (c), demo.dest);
demo.size += DWRITE (&c, sizeof (c), demo_dest);
len = LittleLong (msg->cursize);
demo.size += DWRITE (&len, 4, demo.dest);
demo.size += DWRITE (&len, 4, demo_dest);
demo.size += DWRITE (msg->data, msg->cursize, demo.dest);
demo.size += DWRITE (msg->data, msg->cursize, demo_dest);
if (demo.disk)
Qflush (demo.file);
if (demo_disk)
Qflush (demo_file);
}
static void
@ -548,19 +556,19 @@ SV_WriteSetDemoMessage (void)
byte c;
c = 0;
demo.size += DWRITE (&c, sizeof (c), demo.dest);
demo.size += DWRITE (&c, sizeof (c), demo_dest);
c = dem_set;
demo.size += DWRITE (&c, sizeof (c), demo.dest);
demo.size += DWRITE (&c, sizeof (c), demo_dest);
len = LittleLong (0);
demo.size += DWRITE (&len, 4, demo.dest);
demo.size += DWRITE (&len, 4, demo_dest);
len = LittleLong (0);
demo.size += DWRITE (&len, 4, demo.dest);
demo.size += DWRITE (&len, 4, demo_dest);
if (demo.disk)
Qflush (demo.file);
if (demo_disk)
Qflush (demo_file);
}
static const char *
@ -640,27 +648,22 @@ SV_Record (char *name)
client_t *player;
const char *gamedir, *s;
{
// save over memset
dstring_t *tn = demo.name, *tt = demo.text;
memset (&demo, 0, sizeof (demo));
dstring_clearstr (demo.name = tn);
dstring_clearstr (demo.text = tt);
}
demo.recorder.delta.pvs = dt_pvs_fat;
memset (&demo, 0, sizeof (demo));
demo.delta.pvs = dt_pvs_fat;
for (i = 0; i < UPDATE_BACKUP; i++) {
demo.recorder.delta.frames[i].entities.entities = demo_entities[i];
demo.recorder.delta.frames[i].players.players = demo_players[i];
demo.delta.frames[i].entities.entities = demo_entities[i];
demo.delta.frames[i].players.players = demo_players[i];
}
DemoBuffer_Init (&demo.dbuffer, demo.buffer, sizeof (demo.buffer));
DemoBuffer_Init (&demo.dbuffer, demo_buffer, sizeof (demo_buffer));
DemoSetMsgBuf (NULL, &demo.frames[0].buf);
demo.datagram.maxsize = sizeof (demo.datagram_data);
demo.datagram.data = demo.datagram_data;
demo.datagram.maxsize = sizeof (demo_datagram_data);
demo.datagram.data = demo_datagram_data;
demo.file = QFS_Open (name, "wb");
if (!demo.file) {
demo_file = QFS_Open (name, "wb");
if (!demo_file) {
Con_Printf ("ERROR: couldn't open %s\n", name);
return;
}
@ -670,19 +673,19 @@ SV_Record (char *name)
s = name + strlen (name);
while (s > name && *s != '/')
s--;
dstring_copystr (demo.name, s + (*s == '/'));
dstring_copystr (demo_name, s + (*s == '/'));
SV_BroadcastPrintf (PRINT_CHAT, "Server started recording (%s):\n%s\n",
demo.disk ? "disk" : "memory", demo.name->str);
Cvar_Set (serverdemo, demo.name->str);
demo_disk ? "disk" : "memory", demo_name->str);
Cvar_Set (serverdemo, demo_name->str);
dstring_copystr (demo.text, name);
strcpy (demo.text->str + strlen (demo.text->str) - 3, "txt");
dstring_copystr (demo_text, name);
strcpy (demo_text->str + strlen (demo_text->str) - 3, "txt");
if (sv_demotxt->int_val) {
QFile *f;
f = QFS_Open (demo.text->str, "w+t");
f = QFS_Open (demo_text->str, "w+t");
if (f != NULL) {
char date[20];
time_t tim;
@ -697,7 +700,7 @@ SV_Record (char *name)
Qclose (f);
}
} else
QFS_Remove (demo.text->str);
QFS_Remove (demo_text->str);
sv.demorecording = true;
demo.pingtime = demo.time = sv.time;
@ -1078,8 +1081,8 @@ Demo_Init (void)
size = MIN_DEMO_MEMORY;
}
demo.name = dstring_newstr ();
demo.text = dstring_newstr ();
demo_name = dstring_newstr ();
demo_text = dstring_newstr ();
svs.demomem = Hunk_AllocName (size, "demo");
svs.demomemsize = size;

View file

@ -863,12 +863,11 @@ SV_SendDemoMessage (void)
msg.allowoverflow = true;
msg.overflowed = false;
if (!demo.recorder.delta.delta_sequence)
demo.recorder.delta.delta_sequence = -1;
demo.recorder.delta.cur_frame = (demo.recorder.delta.delta_sequence + 1)
& UPDATE_MASK;
demo.recorder.delta.out_frame = demo.recorder.delta.cur_frame;
SV_WriteEntitiesToClient (&demo.recorder.delta, &msg);
if (!demo.delta.delta_sequence)
demo.delta.delta_sequence = -1;
demo.delta.cur_frame = (demo.delta.delta_sequence + 1) & UPDATE_MASK;
demo.delta.out_frame = demo.delta.cur_frame;
SV_WriteEntitiesToClient (&demo.delta, &msg);
DemoWrite_Begin (dem_all, 0, msg.cursize);
SZ_Write (&demo.dbuf->sz, msg.data, msg.cursize);
// copy the accumulated multicast datagram
@ -879,9 +878,8 @@ SV_SendDemoMessage (void)
SZ_Clear (&demo.datagram);
}
demo.recorder.delta.delta_sequence =
demo.recorder.netchan.incoming_sequence & UPDATE_MASK;
demo.recorder.netchan.incoming_sequence++;
demo.delta.delta_sequence++;
demo.delta.delta_sequence &= UPDATE_MASK;
demo.frames[demo.parsecount & DEMO_FRAMES_MASK].time = demo.time = sv.time;
// that's a backup of 3sec at 20fps, should be enough