aboutsummaryrefslogtreecommitdiff
path: root/common/EventRecorder.cpp
diff options
context:
space:
mode:
authorMatthew Hoops2011-08-08 21:36:50 -0400
committerMatthew Hoops2011-08-08 21:36:50 -0400
commit677aa783707c566feea50608e2f0ba669037888b (patch)
tree8bed08790a96c7c25a5355a20fe00e7be30aed69 /common/EventRecorder.cpp
parent9c52724ce56c16c7fe1e9fdd3532d7e14b53c238 (diff)
parentdbceb0a77d64d6e16b0186417ab92c425eddb173 (diff)
downloadscummvm-rg350-677aa783707c566feea50608e2f0ba669037888b.tar.gz
scummvm-rg350-677aa783707c566feea50608e2f0ba669037888b.tar.bz2
scummvm-rg350-677aa783707c566feea50608e2f0ba669037888b.zip
Merge remote branch 'upstream/master' into soccer
Diffstat (limited to 'common/EventRecorder.cpp')
-rw-r--r--common/EventRecorder.cpp77
1 files changed, 59 insertions, 18 deletions
diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp
index 201043f52e..cf3c8b391f 100644
--- a/common/EventRecorder.cpp
+++ b/common/EventRecorder.cpp
@@ -34,7 +34,28 @@ DECLARE_SINGLETON(EventRecorder);
#define RECORD_SIGNATURE 0x54455354
#define RECORD_VERSION 1
-void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) {
+uint32 readTime(ReadStream *inFile) {
+ uint32 d = inFile->readByte();
+ if (d == 0xff) {
+ d = inFile->readUint32LE();
+ }
+
+ return d;
+}
+
+void writeTime(WriteStream *outFile, uint32 d) {
+ //Simple RLE compression
+ if (d >= 0xff) {
+ outFile->writeByte(0xff);
+ outFile->writeUint32LE(d);
+ } else {
+ outFile->writeByte(d);
+ }
+}
+
+void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event, uint32 &millis) {
+ millis = readTime(inFile);
+
diff = inFile->readUint32LE();
event.type = (EventType)inFile->readUint32LE();
@@ -53,6 +74,8 @@ void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) {
case EVENT_RBUTTONUP:
case EVENT_WHEELUP:
case EVENT_WHEELDOWN:
+ case EVENT_MBUTTONDOWN:
+ case EVENT_MBUTTONUP:
event.mouse.x = inFile->readSint16LE();
event.mouse.y = inFile->readSint16LE();
break;
@@ -61,7 +84,9 @@ void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event) {
}
}
-void writeRecord(WriteStream *outFile, uint32 diff, const Event &event) {
+void writeRecord(WriteStream *outFile, uint32 diff, const Event &event, uint32 millis) {
+ writeTime(outFile, millis);
+
outFile->writeUint32LE(diff);
outFile->writeUint32LE((uint32)event.type);
@@ -80,6 +105,8 @@ void writeRecord(WriteStream *outFile, uint32 diff, const Event &event) {
case EVENT_RBUTTONUP:
case EVENT_WHEELUP:
case EVENT_WHEELDOWN:
+ case EVENT_MBUTTONDOWN:
+ case EVENT_MBUTTONUP:
outFile->writeSint16LE(event.mouse.x);
outFile->writeSint16LE(event.mouse.y);
break;
@@ -99,6 +126,7 @@ EventRecorder::EventRecorder() {
_eventCount = 0;
_lastEventCount = 0;
_lastMillis = 0;
+ _lastEventMillis = 0;
_recordMode = kPassthrough;
}
@@ -111,11 +139,15 @@ void EventRecorder::init() {
String recordModeString = ConfMan.get("record_mode");
if (recordModeString.compareToIgnoreCase("record") == 0) {
_recordMode = kRecorderRecord;
+
+ debug(3, "EventRecorder: record");
} else {
if (recordModeString.compareToIgnoreCase("playback") == 0) {
_recordMode = kRecorderPlayback;
+ debug(3, "EventRecorder: playback");
} else {
_recordMode = kPassthrough;
+ debug(3, "EventRecorder: passthrough");
}
}
@@ -173,6 +205,7 @@ void EventRecorder::init() {
_recordCount = _playbackFile->readUint32LE();
_recordTimeCount = _playbackFile->readUint32LE();
+
randomSourceCount = _playbackFile->readUint32LE();
for (uint i = 0; i < randomSourceCount; ++i) {
RandomSourceRecord rec;
@@ -190,10 +223,12 @@ void EventRecorder::init() {
}
g_system->getEventManager()->getEventDispatcher()->registerSource(this, false);
- g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 1, false);
+ g_system->getEventManager()->getEventDispatcher()->registerObserver(this, EventManager::kEventRecorderPriority, false, true);
}
void EventRecorder::deinit() {
+ debug(3, "EventRecorder: deinit");
+
g_system->getEventManager()->getEventDispatcher()->unregisterSource(this);
g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this);
@@ -236,8 +271,9 @@ void EventRecorder::deinit() {
for (uint i = 0; i < _recordCount; ++i) {
uint32 tempDiff;
Event tempEvent;
- readRecord(_playbackFile, tempDiff, tempEvent);
- writeRecord(_recordFile, tempDiff, tempEvent);
+ uint32 millis;
+ readRecord(_playbackFile, tempDiff, tempEvent, millis);
+ writeRecord(_recordFile, tempDiff, tempEvent, millis);
}
_recordFile->finalize();
@@ -278,23 +314,16 @@ void EventRecorder::processMillis(uint32 &millis) {
g_system->lockMutex(_timeMutex);
if (_recordMode == kRecorderRecord) {
- //Simple RLE compression
d = millis - _lastMillis;
- if (d >= 0xff) {
- _recordTimeFile->writeByte(0xff);
- _recordTimeFile->writeUint32LE(d);
- } else {
- _recordTimeFile->writeByte(d);
- }
+ writeTime(_recordTimeFile, d);
+
_recordTimeCount++;
}
if (_recordMode == kRecorderPlayback) {
if (_recordTimeCount > _playbackTimeCount) {
- d = _playbackTimeFile->readByte();
- if (d == 0xff) {
- d = _playbackTimeFile->readUint32LE();
- }
+ d = readTime(_playbackTimeFile);
+
millis = _lastMillis + d;
_playbackTimeCount++;
}
@@ -315,15 +344,27 @@ bool EventRecorder::notifyEvent(const Event &ev) {
StackLock lock(_recorderMutex);
++_eventCount;
- writeRecord(_recordFile, _eventCount - _lastEventCount, ev);
+ writeRecord(_recordFile, _eventCount - _lastEventCount, ev, _lastMillis - _lastEventMillis);
_recordCount++;
_lastEventCount = _eventCount;
+ _lastEventMillis = _lastMillis;
+
+ return false;
+}
+
+bool EventRecorder::notifyPoll() {
+ if (_recordMode != kRecorderRecord)
+ return false;
+
+ ++_eventCount;
return false;
}
bool EventRecorder::pollEvent(Event &ev) {
+ uint32 millis;
+
if (_recordMode != kRecorderPlayback)
return false;
@@ -332,7 +373,7 @@ bool EventRecorder::pollEvent(Event &ev) {
if (!_hasPlaybackEvent) {
if (_recordCount > _playbackCount) {
- readRecord(_playbackFile, const_cast<uint32&>(_playbackDiff), _playbackEvent);
+ readRecord(_playbackFile, const_cast<uint32&>(_playbackDiff), _playbackEvent, millis);
_playbackCount++;
_hasPlaybackEvent = true;
}