Files
flightgear/src/Aircraft/replay.hxx
T
2022-10-20 20:29:11 +08:00

107 lines
3.6 KiB
C++

// replay.hxx - a system to record and replay FlightGear flights
//
// Written by Curtis Olson, started July 2003.
//
// Copyright (C) 2003 Curtis L. Olson - http://www.flightgear.org/~curt
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
#pragma once
#include <simgear/structure/subsystem_mgr.hxx>
#include <simgear/io/iostreams/gzcontainerfile.hxx>
#include <simgear/io/HTTPFileRequest.hxx>
#include <MultiPlayer/multiplaymgr.hxx>
/* A recording/replay module for FlightGear flights. */
struct FGReplay : SGSubsystem
{
FGReplay ();
virtual ~FGReplay();
/* Subsystem API. */
void bind() override;
void init() override;
void reinit() override;
void unbind() override;
void update(double dt) override;
/* Subsystem identification. */
static const char* staticSubsystemClassId() { return "replay"; }
/* For built-in 'replay' command - replay using in-memory Normal recording.
new_tape: If true, we start at beginning of tape, otherwise we start at
loop interval.
*/
bool start(bool new_tape=false);
/* For save and load tape operations from Flightgear GUI. */
bool saveTape(const SGPropertyNode* ConfigData);
bool loadTape(const SGPropertyNode* ConfigData);
/* Attempts to load Continuous recording header properties into
<properties>. If in is null we use internal std::fstream, otherwise we use
*in.
Returns 0 on success, +1 if we may succeed after further download, or -1 if
recording is not a Continuous recording.
For command line --load-tape=...
*/
static int loadContinuousHeader(const std::string& path, std::istream* in, SGPropertyNode* properties);
/* Start replaying a flight recorder tape from disk.
filename
Path of recording.
preview
If true we read the header (and return it in <meta_meta> but do not
start replaying.
create_video
If true we automatically encode a video while replaying.
fixed_dt
If non-zero we set /sim/time/fixed-dt while replaying.
meta_meta
Filled in with contents of recording header's "meta" tree.
filerequest
If not null we use this to get called back as download of file
progresses, so that we can index the recording. Only useful for
Continuous recordings.
*/
bool loadTape(
const SGPath& filename,
bool preview,
bool create_video,
double fixed_dt,
SGPropertyNode& meta_meta,
simgear::HTTP::FileRequestRef file_request=nullptr
);
/* Prepends /sim/replay/tape-directory and/or appends .fgtape etc.
For command line --load-tape=... */
static std::string makeTapePath(const std::string& tape_name);
/* Resets out static property nodes; to be called by fgStartNewReset(). */
static void resetStatisticsProperties();
std::unique_ptr<struct FGReplayInternal> m_internal;
};