1
//============================================================================
5
// SS tttttt eeee ll ll aaaa
6
// SSSS tt ee ee ll ll aa
7
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
8
// SS SS tt ee ll ll aa aa
9
// SSSS ttt eeeee llll llll aaaaa
11
// Copyright (c) 1995-2005 by Bradford W. Mott and the Stella team
13
// See the file "license" for information on usage and redistribution of
14
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
16
// $Id: EventStreamer.cxx,v 1.6 2006/03/05 01:18:42 stephena Exp $
17
//============================================================================
21
#include "OSystem.hxx"
23
#include "EventHandler.hxx"
24
#include "EventStreamer.hxx"
27
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
28
EventStreamer::EventStreamer(OSystem* osystem)
30
myEventWriteFlag(false),
31
myEventReadFlag(false),
37
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
38
EventStreamer::~EventStreamer()
42
myEventHistory.clear();
43
myStreamReader.close();
44
myStreamWriter.close();
47
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
48
void EventStreamer::reset()
50
//cerr << "EventStreamer::reset()\n";
51
myEventWriteFlag = false;
52
myEventReadFlag = false;
57
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
58
bool EventStreamer::startRecording()
60
string eventfile = /*myOSystem->baseDir() + BSPF_PATH_SEPARATOR +*/ "test.inp";
61
if(!myStreamWriter.open(eventfile))
64
// And save the current state to it
65
string md5 = myOSystem->console().properties().get(Cartridge_MD5);
66
if(!myOSystem->console().system().saveState(md5, myStreamWriter))
68
myEventHistory.clear();
71
return myEventWriteFlag = true;
74
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
75
bool EventStreamer::stopRecording()
77
if(!myStreamWriter.isOpen() || !myEventWriteFlag)
80
// Append the event history to the eventstream
81
int size = myEventHistory.size();
85
myStreamWriter.putString("EventStream");
86
myStreamWriter.putInt(size);
87
for(int i = 0; i < size; ++i)
88
myStreamWriter.putInt(myEventHistory[i]);
97
cerr << "Error saving eventstream" << endl;
101
myStreamWriter.close();
105
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
106
bool EventStreamer::loadRecording()
108
cerr << "EventStreamer::loadRecording()\n";
109
string eventfile = /*myOSystem->baseDir() + BSPF_PATH_SEPARATOR +*/ "test.inp";
110
if(!myStreamReader.open(eventfile))
114
string md5 = myOSystem->console().properties().get(Cartridge_MD5);
115
if(!myOSystem->console().system().loadState(md5, myStreamReader))
120
if(myStreamReader.getString() != "EventStream")
123
// Now load the event stream
124
myEventHistory.clear();
125
int size = myStreamReader.getInt();
126
for(int i = 0; i < size; ++i)
127
myEventHistory.push_back(myStreamReader.getInt());
136
cerr << "Error loading eventstream" << endl;
141
myEventReadFlag = myEventHistory.size() > 0;
146
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
147
void EventStreamer::addEvent(int type, int value)
151
myEventHistory.push_back(type);
152
myEventHistory.push_back(value);
156
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
157
bool EventStreamer::pollEvent(int& type, int& value)
164
// Read a new event from the stream when we've waited the appropriate
167
if(myFrameCounter >= 0)
169
int first = myEventHistory[myEventPos++];
172
myFrameCounter = first;
173
cerr << "wait " << -myFrameCounter << " frames\n";
175
else if(myEventPos < (int)myEventHistory.size())
178
value = myEventHistory[myEventPos++];
179
cerr << "type = " << type << ", value = " << value << endl;
184
myEventReadFlag = myEventPos < (int)myEventHistory.size() - 2;
188
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
189
void EventStreamer::nextFrame()
193
int idx = myEventHistory.size() - 1;
194
if(idx >= 0 && myEventHistory[idx] < 0)
195
--myEventHistory[idx];
197
myEventHistory.push_back(-1);