From baf65bc87227b353cd2aac4cb661b8b9fb0aa0cc Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sat, 6 Aug 2011 11:25:51 +0100 Subject: RECORDER: Added stub for delayMillis() processing --- common/EventRecorder.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'common/EventRecorder.cpp') diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp index 4441070050..a43455af93 100644 --- a/common/EventRecorder.cpp +++ b/common/EventRecorder.cpp @@ -304,6 +304,10 @@ void EventRecorder::processMillis(uint32 &millis) { g_system->unlockMutex(_timeMutex); } +bool EventRecorder::processDelayMillis(uint32 &msecs) { + return false; +} + bool EventRecorder::notifyEvent(const Event &ev) { if (_recordMode != kRecorderRecord) return false; -- cgit v1.2.3 From df3bc62a3a3e5e69c43301ffba1dab120c2e34c2 Mon Sep 17 00:00:00 2001 From: Alyssa Milburn Date: Sat, 6 Aug 2011 18:14:28 +0200 Subject: COMMON: Change param type of processDelayMillis to fix build. --- common/EventRecorder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'common/EventRecorder.cpp') diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp index a43455af93..eda6a45ab1 100644 --- a/common/EventRecorder.cpp +++ b/common/EventRecorder.cpp @@ -304,7 +304,7 @@ void EventRecorder::processMillis(uint32 &millis) { g_system->unlockMutex(_timeMutex); } -bool EventRecorder::processDelayMillis(uint32 &msecs) { +bool EventRecorder::processDelayMillis(uint &msecs) { return false; } -- cgit v1.2.3 From 23a0f5318c50cdf3dce19e4de0c98fb5ae1c2618 Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Sun, 7 Aug 2011 11:39:54 +0200 Subject: JANITORIAL: Remove trailing empty lines. --- common/EventRecorder.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'common/EventRecorder.cpp') diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp index eda6a45ab1..201043f52e 100644 --- a/common/EventRecorder.cpp +++ b/common/EventRecorder.cpp @@ -364,4 +364,3 @@ bool EventRecorder::pollEvent(Event &ev) { } } // End of namespace Common - -- cgit v1.2.3 From 4144fef5a7404bfab8dd127cc9d09694de89e997 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 8 Aug 2011 13:16:49 +0100 Subject: RECORDER: Add some debug output --- common/EventRecorder.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'common/EventRecorder.cpp') diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp index 201043f52e..f5d8641bd3 100644 --- a/common/EventRecorder.cpp +++ b/common/EventRecorder.cpp @@ -111,11 +111,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"); } } @@ -194,6 +198,8 @@ void EventRecorder::init() { } void EventRecorder::deinit() { + debug(3, "EventRecorder: deinit"); + g_system->getEventManager()->getEventDispatcher()->unregisterSource(this); g_system->getEventManager()->getEventDispatcher()->unregisterObserver(this); -- cgit v1.2.3 From a4029a8e94a3dbbe03c0aa4571215e9a5b00058d Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 8 Aug 2011 15:38:27 +0100 Subject: RECORDER: Restore event recorder functionality. It was badly broken after refactoring into EventObserver. Fitst, deinit() method was never called which lead to bad record files. Then, the concept of counting pollEvent() calls was ignored. Introduced dispatchPoll() method of EventObserver which is implemented in EventRecorder. It counts calls so is able to inject events at more proper time. Additionally now event times are recorded. --- common/EventRecorder.cpp | 67 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 18 deletions(-) (limited to 'common/EventRecorder.cpp') diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp index f5d8641bd3..4be3ca41ec 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(); @@ -61,7 +82,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); @@ -99,6 +122,7 @@ EventRecorder::EventRecorder() { _eventCount = 0; _lastEventCount = 0; _lastMillis = 0; + _lastEventMillis = 0; _recordMode = kPassthrough; } @@ -177,6 +201,7 @@ void EventRecorder::init() { _recordCount = _playbackFile->readUint32LE(); _recordTimeCount = _playbackFile->readUint32LE(); + randomSourceCount = _playbackFile->readUint32LE(); for (uint i = 0; i < randomSourceCount; ++i) { RandomSourceRecord rec; @@ -194,7 +219,7 @@ void EventRecorder::init() { } g_system->getEventManager()->getEventDispatcher()->registerSource(this, false); - g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 1, false); + g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 1, false, true); } void EventRecorder::deinit() { @@ -242,8 +267,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(); @@ -284,23 +310,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++; } @@ -321,15 +340,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; @@ -338,7 +369,7 @@ bool EventRecorder::pollEvent(Event &ev) { if (!_hasPlaybackEvent) { if (_recordCount > _playbackCount) { - readRecord(_playbackFile, const_cast(_playbackDiff), _playbackEvent); + readRecord(_playbackFile, const_cast(_playbackDiff), _playbackEvent, millis); _playbackCount++; _hasPlaybackEvent = true; } -- cgit v1.2.3 From 1d50a318301f69f86e4fbeda38e6fb59a12cbd0d Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Mon, 8 Aug 2011 19:59:08 +0100 Subject: RECORDER: Give name to recoder priority. Added middle button storing. --- common/EventRecorder.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'common/EventRecorder.cpp') diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp index 4be3ca41ec..cf3c8b391f 100644 --- a/common/EventRecorder.cpp +++ b/common/EventRecorder.cpp @@ -74,6 +74,8 @@ void readRecord(SeekableReadStream *inFile, uint32 &diff, Event &event, uint32 & 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; @@ -103,6 +105,8 @@ void writeRecord(WriteStream *outFile, uint32 diff, const Event &event, uint32 m 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; @@ -219,7 +223,7 @@ void EventRecorder::init() { } g_system->getEventManager()->getEventDispatcher()->registerSource(this, false); - g_system->getEventManager()->getEventDispatcher()->registerObserver(this, 1, false, true); + g_system->getEventManager()->getEventDispatcher()->registerObserver(this, EventManager::kEventRecorderPriority, false, true); } void EventRecorder::deinit() { -- cgit v1.2.3 From 83eb8e7ab64949f1c039e9b73abf2ae11698148a Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Tue, 9 Aug 2011 08:35:47 +0100 Subject: RECORDER: Implement time compensation for playback --- common/EventRecorder.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'common/EventRecorder.cpp') diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp index cf3c8b391f..73832482f2 100644 --- a/common/EventRecorder.cpp +++ b/common/EventRecorder.cpp @@ -324,6 +324,13 @@ void EventRecorder::processMillis(uint32 &millis) { if (_recordTimeCount > _playbackTimeCount) { d = readTime(_playbackTimeFile); + while ((_lastMillis + d > millis) && (_lastMillis + d - millis > 50)) { + _recordMode = kPassthrough; + g_system->delayMillis(50); + millis = g_system->getMillis(); + _recordMode = kRecorderPlayback; + } + millis = _lastMillis + d; _playbackTimeCount++; } @@ -334,6 +341,19 @@ void EventRecorder::processMillis(uint32 &millis) { } bool EventRecorder::processDelayMillis(uint &msecs) { + if (_recordMode == kRecorderPlayback) { + _recordMode = kPassthrough; + + uint32 millis = g_system->getMillis(); + + _recordMode = kRecorderPlayback; + + if (_lastMillis > millis) { + // Skip delay if we're getting late + return true; + } + } + return false; } -- cgit v1.2.3 From 00d25a77a9d8297fdc356c7a10f9dc2d94903a5f Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 9 Aug 2011 15:04:26 +0200 Subject: RECORDER: Defer mutex deletion to destructor. Since we now call deinit after a game has been run, otherwise RTL would be broken. See bug report #3388982 "valgrind errors when doing multiple RTL". --- common/EventRecorder.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'common/EventRecorder.cpp') diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp index 73832482f2..3be3161203 100644 --- a/common/EventRecorder.cpp +++ b/common/EventRecorder.cpp @@ -133,6 +133,9 @@ EventRecorder::EventRecorder() { EventRecorder::~EventRecorder() { deinit(); + + g_system->deleteMutex(_timeMutex); + g_system->deleteMutex(_recorderMutex); } void EventRecorder::init() { @@ -282,9 +285,6 @@ void EventRecorder::deinit() { //TODO: remove recordTempFileName'ed file } - - g_system->deleteMutex(_timeMutex); - g_system->deleteMutex(_recorderMutex); } void EventRecorder::registerRandomSource(RandomSource &rnd, const String &name) { -- cgit v1.2.3 From dfcefb3c2231c46eba3c4ac5cd24ef09cb8b17d1 Mon Sep 17 00:00:00 2001 From: Eugene Sandulenko Date: Sun, 14 Aug 2011 12:19:14 +0100 Subject: RECORDER: Lower I/O in recorder --- common/EventRecorder.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'common/EventRecorder.cpp') diff --git a/common/EventRecorder.cpp b/common/EventRecorder.cpp index 3be3161203..5e24f128c3 100644 --- a/common/EventRecorder.cpp +++ b/common/EventRecorder.cpp @@ -22,6 +22,7 @@ #include "common/EventRecorder.h" +#include "common/bufferedstream.h" #include "common/config-manager.h" #include "common/random.h" #include "common/savefile.h" @@ -171,8 +172,8 @@ void EventRecorder::init() { if (_recordMode == kRecorderRecord) { _recordCount = 0; _recordTimeCount = 0; - _recordFile = g_system->getSavefileManager()->openForSaving(_recordTempFileName); - _recordTimeFile = g_system->getSavefileManager()->openForSaving(_recordTimeFileName); + _recordFile = wrapBufferedWriteStream(g_system->getSavefileManager()->openForSaving(_recordTempFileName), 128 * 1024); + _recordTimeFile = wrapBufferedWriteStream(g_system->getSavefileManager()->openForSaving(_recordTimeFileName), 128 * 1024); _recordSubtitles = ConfMan.getBool("subtitles"); } @@ -181,8 +182,8 @@ void EventRecorder::init() { if (_recordMode == kRecorderPlayback) { _playbackCount = 0; _playbackTimeCount = 0; - _playbackFile = g_system->getSavefileManager()->openForLoading(_recordFileName); - _playbackTimeFile = g_system->getSavefileManager()->openForLoading(_recordTimeFileName); + _playbackFile = wrapBufferedSeekableReadStream(g_system->getSavefileManager()->openForLoading(_recordFileName), 128 * 1024, DisposeAfterUse::YES); + _playbackTimeFile = wrapBufferedSeekableReadStream(g_system->getSavefileManager()->openForLoading(_recordTimeFileName), 128 * 1024, DisposeAfterUse::YES); if (!_playbackFile) { warning("Cannot open playback file %s. Playback was switched off", _recordFileName.c_str()); -- cgit v1.2.3