emoved PHYSFSX_getFreeDiskSpace and relying on success of buffered writing to see if demo recording must be stopped

This commit is contained in:
zicodxx 2010-06-18 08:22:45 +00:00
parent e4a0c20f76
commit c3d91ceeca
3 changed files with 38 additions and 62 deletions

View file

@ -2,7 +2,8 @@ D1X-Rebirth Changelog
20100618 20100618
-------- --------
2d/bitblt.c, include/gr.h, main/game.c, main/gauges.c: Introducing gr_bitblt_find_transparent_area to dynamically detect boundaries of sub cancas used for CM_REAR_VIEW; On the way also allowing to create weapon box sub bitmaps from uncompressed cockpit bitmaps 2d/bitblt.c, include/gr.h, main/game.c, main/gauges.c: Introducing gr_bitblt_find_transparent_area to dynamically detect boundaries of sub canvas used for CM_REAR_VIEW; On the way also allowing to create weapon box sub bitmaps from uncompressed cockpit bitmaps
include/physfsx.h, main/newdemo.c: Removed PHYSFSX_getFreeDiskSpace and relying on success of buffered writing to see if demo recording must be stopped
20100617 20100617
-------- --------

View file

@ -12,9 +12,7 @@
#if !defined(macintosh) && !defined(_MSC_VER) #if !defined(macintosh) && !defined(_MSC_VER)
#include <sys/param.h> #include <sys/param.h>
#endif #endif
#if defined(__LINUX__) #if defined(__MACH__) && defined(__APPLE__)
#include <sys/vfs.h>
#elif defined(__MACH__) && defined(__APPLE__)
#include <sys/mount.h> #include <sys/mount.h>
#include <unistd.h> // for chdir hack #include <unistd.h> // for chdir hack
#endif #endif
@ -375,6 +373,7 @@ static inline char **PHYSFSX_findabsoluteFiles(char *path, char *realpath, char
return list; return list;
} }
#if 0
// returns -1 if error // returns -1 if error
// Gets bytes free in current write dir // Gets bytes free in current write dir
static inline PHYSFS_sint64 PHYSFSX_getFreeDiskSpace() static inline PHYSFS_sint64 PHYSFSX_getFreeDiskSpace()
@ -390,6 +389,7 @@ static inline PHYSFS_sint64 PHYSFSX_getFreeDiskSpace()
return 0x7FFFFFFF; return 0x7FFFFFFF;
#endif #endif
} }
#endif
//Open a file for reading, set up a buffer //Open a file for reading, set up a buffer
static inline PHYSFS_file *PHYSFSX_openReadBuffered(char *filename) static inline PHYSFS_file *PHYSFSX_openReadBuffered(char *filename)

View file

@ -98,7 +98,7 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#define ND_EVENT_SOUND 5 // Followed by int soundum #define ND_EVENT_SOUND 5 // Followed by int soundum
#define ND_EVENT_SOUND_ONCE 6 // Followed by int soundum #define ND_EVENT_SOUND_ONCE 6 // Followed by int soundum
#define ND_EVENT_SOUND_3D 7 // Followed by int soundum, int angle, int volume #define ND_EVENT_SOUND_3D 7 // Followed by int soundum, int angle, int volume
#define ND_EVENT_WALL_HIT_PROCESS 8 // Followed by int segnum, int side, fix damage #define ND_EVENT_WALL_HIT_PROCESS 8 // Followed by int segnum, int side, fix damage
#define ND_EVENT_TRIGGER 9 // Followed by int segnum, int side, int objnum #define ND_EVENT_TRIGGER 9 // Followed by int segnum, int side, int objnum
#define ND_EVENT_HOSTAGE_RESCUED 10 // Followed by int hostage_type #define ND_EVENT_HOSTAGE_RESCUED 10 // Followed by int hostage_type
#define ND_EVENT_SOUND_3D_ONCE 11 // Followed by int soundum, int angle, int volume #define ND_EVENT_SOUND_3D_ONCE 11 // Followed by int soundum, int angle, int volume
@ -254,13 +254,7 @@ int newdemo_write( void *buffer, int elsize, int nelem )
Newdemo_num_written += total_size; Newdemo_num_written += total_size;
Assert(outfile != NULL); Assert(outfile != NULL);
num_written = PHYSFS_write(outfile, buffer, elsize, nelem); num_written = PHYSFS_write(outfile, buffer, elsize, nelem);
//if ((Newdemo_num_written > Newdemo_size) && !Newdemo_no_space) {
// Newdemo_no_space=1;
// newdemo_stop_recording();
// return -1;
//}
if ((Newdemo_num_written > Newdemo_size) && !Newdemo_no_space)
Newdemo_no_space=1;
if (num_written == nelem && !Newdemo_no_space) if (num_written == nelem && !Newdemo_no_space)
return num_written; return num_written;
@ -1335,7 +1329,7 @@ void newdemo_record_oneframeevent_update(int wallupdate)
{ {
int side, cside; int side, cside;
segment *seg, *csegp; segment *seg, *csegp;
seg = &Segments[Walls[i].segnum]; seg = &Segments[Walls[i].segnum];
side = Walls[i].sidenum; side = Walls[i].sidenum;
csegp = &Segments[seg->children[side]]; csegp = &Segments[seg->children[side]];
@ -1394,7 +1388,7 @@ int newdemo_read_demo_start(enum purpose_type purpose)
} }
nd_read_fix(&GameTime); nd_read_fix(&GameTime);
nd_read_int(&Newdemo_game_mode); nd_read_int(&Newdemo_game_mode);
#ifndef NETWORK #ifndef NETWORK
if (Newdemo_game_mode & GM_MULTI) { if (Newdemo_game_mode & GM_MULTI) {
nm_messagebox( NULL, 1, "Ok", "can't playback net game\nwith this version of code\n" ); nm_messagebox( NULL, 1, "Ok", "can't playback net game\nwith this version of code\n" );
@ -2035,7 +2029,7 @@ int newdemo_read_frame_information(int rewrite)
nd_write_int(Players[Player_num].flags); nd_write_int(Players[Player_num].flags);
break; break;
} }
oflags = Players[Player_num].flags >> 16; oflags = Players[Player_num].flags >> 16;
Players[Player_num].flags &= 0xffff; Players[Player_num].flags &= 0xffff;
@ -2080,7 +2074,7 @@ int newdemo_read_frame_information(int rewrite)
nd_write_byte(weapon_num); nd_write_byte(weapon_num);
break; break;
} }
if (weapon_type == 0) if (weapon_type == 0)
Primary_weapon = (int)weapon_num; Primary_weapon = (int)weapon_num;
else else
@ -2258,7 +2252,7 @@ int newdemo_read_frame_information(int rewrite)
nd_write_byte(pnum); nd_write_byte(pnum);
break; break;
} }
if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD)) { if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD)) {
Players[pnum].flags |= PLAYER_FLAGS_CLOAKED; Players[pnum].flags |= PLAYER_FLAGS_CLOAKED;
Players[pnum].cloak_time = GameTime - (CLOAK_TIME_MAX / 2); Players[pnum].cloak_time = GameTime - (CLOAK_TIME_MAX / 2);
@ -2440,7 +2434,7 @@ int newdemo_read_frame_information(int rewrite)
nd_write_short(new_ammo); nd_write_short(new_ammo);
break; break;
} }
if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD)) if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Players[Player_num].primary_ammo[Primary_weapon] = old_ammo; Players[Player_num].primary_ammo[Primary_weapon] = old_ammo;
else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD)) else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD))
@ -2459,7 +2453,7 @@ int newdemo_read_frame_information(int rewrite)
nd_write_short(new_ammo); nd_write_short(new_ammo);
break; break;
} }
if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD)) if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Players[Player_num].secondary_ammo[Secondary_weapon] = old_ammo; Players[Player_num].secondary_ammo[Secondary_weapon] = old_ammo;
else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD)) else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD))
@ -2597,7 +2591,7 @@ int newdemo_read_frame_information(int rewrite)
if (PlayerCfg.CockpitMode[1] != PlayerCfg.CockpitMode[0]) if (PlayerCfg.CockpitMode[1] != PlayerCfg.CockpitMode[0])
select_cockpit(PlayerCfg.CockpitMode[0]); select_cockpit(PlayerCfg.CockpitMode[0]);
} }
if (nd_bad_read) { if (nd_bad_read) {
nm_messagebox( NULL, 1, TXT_OK, "%s %s", TXT_DEMO_ERR_READING, TXT_DEMO_OLD_CORRUPT ); nm_messagebox( NULL, 1, TXT_OK, "%s %s", TXT_DEMO_ERR_READING, TXT_DEMO_OLD_CORRUPT );
} }
@ -2685,7 +2679,7 @@ void newdemo_goto_end(int to_rewrite)
nd_read_byte(&bbyte); nd_read_byte(&bbyte);
nd_read_short(&bshort); nd_read_short(&bshort);
nd_read_int(&bint); nd_read_int(&bint);
nd_read_byte((sbyte *)&energy); nd_read_byte((sbyte *)&energy);
nd_read_byte((sbyte *)&shield); nd_read_byte((sbyte *)&shield);
Players[Player_num].energy = i2f(energy); Players[Player_num].energy = i2f(energy);
@ -2699,9 +2693,9 @@ void newdemo_goto_end(int to_rewrite)
nd_read_byte((sbyte *)&Primary_weapon); nd_read_byte((sbyte *)&Primary_weapon);
nd_read_byte((sbyte *)&Secondary_weapon); nd_read_byte((sbyte *)&Secondary_weapon);
for (i = 0; i < MAX_PRIMARY_WEAPONS; i++) for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
nd_read_short((short *)&(Players[Player_num].primary_ammo[i])); nd_read_short((short *)&(Players[Player_num].primary_ammo[i]));
for (i = 0; i < MAX_SECONDARY_WEAPONS; i++) for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
nd_read_short((short *)&(Players[Player_num].secondary_ammo[i])); nd_read_short((short *)&(Players[Player_num].secondary_ammo[i]));
nd_read_byte(&laser_level); nd_read_byte(&laser_level);
if (laser_level != Players[Player_num].laser_level) { if (laser_level != Players[Player_num].laser_level) {
Players[Player_num].laser_level = laser_level; Players[Player_num].laser_level = laser_level;
@ -2808,7 +2802,7 @@ void interpolate_frame(fix d_play, fix d_recorded)
} }
InterpolStep -= FrameTime; InterpolStep -= FrameTime;
// This interpolating looks just more crappy on high FPS, so let's not even waste performance on it. // This interpolating looks just more crappy on high FPS, so let's not even waste performance on it.
if (InterpolStep <= 0) if (InterpolStep <= 0)
{ {
@ -3082,22 +3076,6 @@ void newdemo_playback_one_frame()
void newdemo_start_recording() void newdemo_start_recording()
{ {
Newdemo_size = PHYSFSX_getFreeDiskSpace();
con_printf(CON_VERBOSE, "Free space = %d\n", Newdemo_size);
Newdemo_size -= 100000;
if ((Newdemo_size+100000) < 2000000000) {
if (((int)(Newdemo_size)) < 500000) {
#if !(defined(__APPLE__) || defined(macintosh))
nm_messagebox(NULL, 1, TXT_OK, TXT_DEMO_NO_SPACE);
#else
nm_messagebox(NULL, 1, TXT_OK, "Not enough space on current\ndrive to start demo recording.");
#endif
return;
}
}
Newdemo_num_written = 0; Newdemo_num_written = 0;
Newdemo_no_space=0; Newdemo_no_space=0;
Newdemo_state = ND_STATE_RECORDING; Newdemo_state = ND_STATE_RECORDING;
@ -3135,28 +3113,28 @@ void newdemo_write_end()
} }
nd_write_short(ND_EVENT_EOF); nd_write_short(ND_EVENT_EOF);
nd_write_int(ND_EVENT_EOF); nd_write_int(ND_EVENT_EOF);
if (!shareware) if (!shareware)
{ {
byte_count += 10; // from frame_bytes_written byte_count += 10; // from frame_bytes_written
nd_write_byte((sbyte)(f2ir(Players[Player_num].energy))); nd_write_byte((sbyte)(f2ir(Players[Player_num].energy)));
nd_write_byte((sbyte)(f2ir(Players[Player_num].shields))); nd_write_byte((sbyte)(f2ir(Players[Player_num].shields)));
nd_write_int(Players[Player_num].flags); // be sure players flags are set nd_write_int(Players[Player_num].flags); // be sure players flags are set
nd_write_byte((sbyte)Primary_weapon); nd_write_byte((sbyte)Primary_weapon);
nd_write_byte((sbyte)Secondary_weapon); nd_write_byte((sbyte)Secondary_weapon);
byte_count += 8; byte_count += 8;
for (i = 0; i < MAX_PRIMARY_WEAPONS; i++) for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
nd_write_short((short)Players[Player_num].primary_ammo[i]); nd_write_short((short)Players[Player_num].primary_ammo[i]);
for (i = 0; i < MAX_SECONDARY_WEAPONS; i++) for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
nd_write_short((short)Players[Player_num].secondary_ammo[i]); nd_write_short((short)Players[Player_num].secondary_ammo[i]);
byte_count += (sizeof(short) * (MAX_PRIMARY_WEAPONS + MAX_SECONDARY_WEAPONS)); byte_count += (sizeof(short) * (MAX_PRIMARY_WEAPONS + MAX_SECONDARY_WEAPONS));
nd_write_byte(Players[Player_num].laser_level); nd_write_byte(Players[Player_num].laser_level);
byte_count++; byte_count++;
if (Game_mode & GM_MULTI) { if (Game_mode & GM_MULTI) {
nd_write_byte((sbyte)N_players); nd_write_byte((sbyte)N_players);
byte_count++; byte_count++;
@ -3179,7 +3157,7 @@ void newdemo_write_end()
} }
nd_write_short(byte_count); nd_write_short(byte_count);
} }
nd_write_byte(Current_level_num); nd_write_byte(Current_level_num);
nd_write_byte(ND_EVENT_EOF); nd_write_byte(ND_EVENT_EOF);
} }
@ -3195,10 +3173,11 @@ void newdemo_stop_recording()
exit = 0; exit = 0;
newdemo_record_oneframeevent_update(0);
if (!Newdemo_no_space) if (!Newdemo_no_space)
{
newdemo_record_oneframeevent_update(0);
newdemo_write_end(); newdemo_write_end();
}
PHYSFS_close(outfile); PHYSFS_close(outfile);
outfile = NULL; outfile = NULL;
@ -3230,10 +3209,6 @@ try_again:
if (!Newdemo_no_space) { if (!Newdemo_no_space) {
m[0].type=NM_TYPE_INPUT; m[0].text_len = PATH_MAX - 1; m[0].text = filename; m[0].type=NM_TYPE_INPUT; m[0].text_len = PATH_MAX - 1; m[0].text = filename;
exit = newmenu_do( NULL, TXT_SAVE_DEMO_AS, 1, &(m[0]), NULL, NULL ); exit = newmenu_do( NULL, TXT_SAVE_DEMO_AS, 1, &(m[0]), NULL, NULL );
} else if (Newdemo_no_space == 1) {
m[ 0].type = NM_TYPE_TEXT; m[ 0].text = TXT_DEMO_SAVE_BAD;
m[ 1].type = NM_TYPE_INPUT;m[ 1].text_len = PATH_MAX - 1; m[1].text = filename;
exit = newmenu_do( NULL, NULL, 2, m, NULL, NULL );
} else if (Newdemo_no_space == 2) { } else if (Newdemo_no_space == 2) {
m[ 0].type = NM_TYPE_TEXT; m[ 0].text = TXT_DEMO_SAVE_NOSPACE; m[ 0].type = NM_TYPE_TEXT; m[ 0].text = TXT_DEMO_SAVE_NOSPACE;
m[ 1].type = NM_TYPE_INPUT;m[ 1].text_len = PATH_MAX - 1; m[1].text = filename; m[ 1].type = NM_TYPE_INPUT;m[ 1].text_len = PATH_MAX - 1; m[1].text = filename;
@ -3402,11 +3377,11 @@ int newdemo_swap_endian(char *filename)
strcat(inpath, filename); strcat(inpath, filename);
else else
return 0; return 0;
infile = PHYSFSX_openReadBuffered(inpath); infile = PHYSFSX_openReadBuffered(inpath);
if (infile==NULL) if (infile==NULL)
goto read_error; goto read_error;
Newdemo_size = PHYSFS_fileLength(infile); // should be exactly the same size Newdemo_size = PHYSFS_fileLength(infile); // should be exactly the same size
outfile = PHYSFSX_openWriteBuffered(DEMO_FILENAME); outfile = PHYSFSX_openWriteBuffered(DEMO_FILENAME);
if (outfile==NULL) if (outfile==NULL)
@ -3414,31 +3389,31 @@ int newdemo_swap_endian(char *filename)
PHYSFS_close(infile); PHYSFS_close(infile);
goto read_error; goto read_error;
} }
Newdemo_num_written = 0; Newdemo_num_written = 0;
nd_bad_read = 0; nd_bad_read = 0;
swap_endian = 1; swap_endian = 1;
Newdemo_at_eof = 0; Newdemo_at_eof = 0;
Newdemo_state = ND_STATE_NORMAL; // not doing anything special really Newdemo_state = ND_STATE_NORMAL; // not doing anything special really
if (newdemo_read_demo_start(PURPOSE_REWRITE)) { if (newdemo_read_demo_start(PURPOSE_REWRITE)) {
PHYSFS_close(infile); PHYSFS_close(infile);
PHYSFS_close(outfile); PHYSFS_close(outfile);
swap_endian = 0; swap_endian = 0;
return 0; return 0;
} }
while (newdemo_read_frame_information(1) == 1) {} // rewrite all frames while (newdemo_read_frame_information(1) == 1) {} // rewrite all frames
newdemo_goto_end(1); // get end of demo data newdemo_goto_end(1); // get end of demo data
newdemo_write_end(); // and write it newdemo_write_end(); // and write it
swap_endian = 0; swap_endian = 0;
complete = Newdemo_size == Newdemo_num_written; complete = Newdemo_size == Newdemo_num_written;
PHYSFS_close(infile); PHYSFS_close(infile);
PHYSFS_close(outfile); PHYSFS_close(outfile);
outfile = NULL; outfile = NULL;
if (complete) if (complete)
{ {
char bakpath[PATH_MAX+FILENAME_LEN]; char bakpath[PATH_MAX+FILENAME_LEN];
@ -3449,7 +3424,7 @@ int newdemo_swap_endian(char *filename)
} }
else else
PHYSFS_delete(DEMO_FILENAME); // clean up the mess PHYSFS_delete(DEMO_FILENAME); // clean up the mess
read_error: read_error:
{ {
nm_messagebox( NULL, 1, TXT_OK, complete ? "Demo %s converted%s" : "Error converting demo\n%s\n%s", filename, nm_messagebox( NULL, 1, TXT_OK, complete ? "Demo %s converted%s" : "Error converting demo\n%s\n%s", filename,