private bool ProcessEvents(MegaDriveHost host, uint ticks) { var quit = false; while (SDL_PollEvent(out var e) != 0) { switch (e.type) { case SDL_EventType.SDL_QUIT: quit = true; break; case SDL_EventType.SDL_MOUSEMOTION: _lastCursorMoveTick = ticks; break; case SDL_EventType.SDL_KEYDOWN: var keysym = e.key.keysym; switch (keysym.scancode) { case SDL_Scancode.SDL_SCANCODE_R: if ((keysym.mod & SDL_Keymod.KMOD_LCTRL) != 0 || (keysym.mod & SDL_Keymod.KMOD_RCTRL) != 0) { host.Reset(); } break; case SDL_Scancode.SDL_SCANCODE_RETURN: if (GetKeyState(SDL_Scancode.SDL_SCANCODE_LALT) || GetKeyState(SDL_Scancode.SDL_SCANCODE_RALT)) { ToggleFullscreen(); } break; } break; } } return(quit); }
public void Run(Sram sram, MegaDriveHost host, CancellationToken ct = default) { InitialiseAudio((int)host.SampleRate); _host = host; host.Client = this; var tickWait = (uint)Math.Floor(1000.0 / host.FPS); var lastTicks = 0U; var lastRefreshVideo = 0U; var quit = false; var ff = false; while (!quit && !ct.IsCancellationRequested) { var ticks = SDL_GetTicks(); var diff = ticks - lastTicks; if (diff >= tickWait || ff) { lastTicks = ticks; if (!ff || ticks > lastRefreshVideo + 30) { RefreshVideo = true; lastRefreshVideo = ticks; } else { RefreshVideo = false; } if (_lastCursorMoveTick + CURSOR_HIDE_DELAY < ticks) { SDL_ShowCursor(0); } else { SDL_ShowCursor(1); } if (_lastControllerCheck + CONTROLLER_CHECK_INTERVAL < ticks) { _lastControllerCheck = ticks; RecheckControllers(); } if (_lastSramSaveTick + SRAM_SAVE_INTERVAL < ticks) { _lastSramSaveTick = ticks; if (sram.Update()) { sram.Save(); } } SDL_PumpEvents(); UpdateKeyboardState(); OnUpdate(); ff = FastForward || GetKeyState(SDL_Scancode.SDL_SCANCODE_BACKSPACE); if (ff) { SDL_ClearQueuedAudio(_audioDevice); } quit = ProcessEvents(host, ticks); } else { SDL_Delay(tickWait - diff); } } }
public Sram(MegaDriveHost host, string path) { _host = host; _path = path; }