13 using std::make_shared;
23 , eventDistributor(eventDistributor_)
24 , msxEventDistributor(msxEventDistributor_)
26 , prevReal(Timer::getTime())
28 commandController,
"inputdelay",
29 "delay input to avoid key-skips", 0.0, 0.0, 10.0))
75 int EventDelay::signalEvent(
const EventPtr& event)
77 toBeScheduledEvents.push_back(event);
78 if (delaySetting->getValue() == 0.0) {
87 auto realDuration = curRealTime - prevReal;
88 prevReal = curRealTime;
89 auto emuDuration = curEmu - prevEmu;
92 double factor = emuDuration.toDouble() / realDuration;
114 std::vector<EventPtr> toBeRescheduledEvents;
117 EmuTime time = curEmu + extraDelay;
118 for (
auto& e : toBeScheduledEvents) {
122 auto keyEvent = checked_cast<
const KeyEvent*>(e.get());
123 int maskedKeyCode = int(keyEvent->getKeyCode()) &
int(
Keys::K_MASK);
125 nonMatchedKeyPresses[maskedKeyCode] = e;
127 auto nonMatchedKeyPressesIterator = nonMatchedKeyPresses.find(maskedKeyCode);
128 if (nonMatchedKeyPressesIterator != nonMatchedKeyPresses.end()) {
129 auto timedPressEvent = checked_cast<
const TimedEvent*>(nonMatchedKeyPressesIterator->second.get());
130 auto timedReleaseEvent = checked_cast<
const TimedEvent*>(e.get());
131 auto pressRealTime = timedPressEvent->
getRealTime();
132 auto releaseRealTime = timedReleaseEvent->getRealTime();
133 auto deltaTime = releaseRealTime - pressRealTime;
134 if (deltaTime <= 2000000 / 50) {
139 EventPtr newKeyupEvent = make_shared<KeyUpEvent>(keyEvent->getKeyCode(), keyEvent->getUnicode());
140 toBeRescheduledEvents.push_back(newKeyupEvent);
143 nonMatchedKeyPresses.erase(nonMatchedKeyPressesIterator);
148 scheduledEvents.push_back(e);
149 auto timedEvent = checked_cast<
const TimedEvent*>(e.get());
151 assert(eventRealTime <= curRealTime);
152 auto offset = curRealTime - eventRealTime;
154 auto schedTime = (emuOffset < extraDelay)
157 assert(curEmu <= schedTime);
160 toBeScheduledEvents.clear();
163 toBeScheduledEvents.insert(toBeScheduledEvents.end(),
164 make_move_iterator(toBeRescheduledEvents.begin()),
165 make_move_iterator(toBeRescheduledEvents.end()));
172 auto event = std::move(scheduledEvents.front());
173 scheduledEvents.pop_front();
175 }
catch (MSXException&) {
184 for (
auto& e : scheduledEvents) {
187 scheduledEvents.clear();
189 for (
auto& e : toBeScheduledEvents) {
192 toBeScheduledEvents.clear();