diff options
author | Matthew Hoops | 2011-08-08 21:36:50 -0400 |
---|---|---|
committer | Matthew Hoops | 2011-08-08 21:36:50 -0400 |
commit | 677aa783707c566feea50608e2f0ba669037888b (patch) | |
tree | 8bed08790a96c7c25a5355a20fe00e7be30aed69 /common/EventRecorder.cpp | |
parent | 9c52724ce56c16c7fe1e9fdd3532d7e14b53c238 (diff) | |
parent | dbceb0a77d64d6e16b0186417ab92c425eddb173 (diff) | |
download | scummvm-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.cpp | 77 |
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; } |