1 //////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // Nestopia - NES/Famicom emulator written in C++ 4 // 5 // Copyright (C) 2003-2008 Martin Freij 6 // 7 // This file is part of Nestopia. 8 // 9 // Nestopia is free software; you can redistribute it and/or modify 10 // it under the terms of the GNU General Public License as published by 11 // the Free Software Foundation; either version 2 of the License, or 12 // (at your option) any later version. 13 // 14 // Nestopia is distributed in the hope that it will be useful, 15 // but WITHOUT ANY WARRANTY; without even the implied warranty of 16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 // GNU General Public License for more details. 18 // 19 // You should have received a copy of the GNU General Public License 20 // along with Nestopia; if not, write to the Free Software 21 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 // 23 //////////////////////////////////////////////////////////////////////////////////////// 24 25 #ifndef NST_MANAGER_FRAMECLOCK_H 26 #define NST_MANAGER_FRAMECLOCK_H 27 28 #pragma once 29 30 #include "NstSystemTimer.hpp" 31 32 namespace Nestopia 33 { 34 namespace Window 35 { 36 class FrameClock; 37 } 38 39 namespace Managers 40 { 41 class FrameClock : Manager 42 { 43 public: 44 45 FrameClock(Window::Menu&,Emulator&,const Configuration&,bool); 46 ~FrameClock(); 47 48 void Save(Configuration&) const; 49 50 private: 51 52 void OnEmuEvent(Emulator::Event,Emulator::Data); 53 void OnMenuOptionsTiming(uint); 54 uint Synchronize(bool,uint); 55 void UpdateRewinderState(bool=true) const; 56 void UpdateSettings(); 57 void ResetTimer(); 58 59 System::Timer timer; 60 System::Timer::Value clkMul; 61 uint counter; 62 uint clkDiv; 63 64 struct 65 { 66 uchar autoFrameSkip; 67 uchar maxFrameSkips; 68 ushort refreshRate; 69 } settings; 70 71 Object::Heap<Window::FrameClock> dialog; 72 73 public: 74 GameSynchronize(bool throttle)75 uint GameSynchronize(bool throttle) 76 { 77 return (uint(throttle) | settings.autoFrameSkip) ? Synchronize( throttle, ~0U ) : 0; 78 } 79 SoundSynchronize()80 void SoundSynchronize() 81 { 82 Synchronize( true, 0 ); 83 } 84 StartEmulation()85 void StartEmulation() 86 { 87 ResetTimer(); 88 } 89 StopEmulation()90 void StopEmulation() 91 { 92 ResetTimer(); 93 } 94 GetRefreshRate() const95 uint GetRefreshRate() const 96 { 97 return settings.refreshRate; 98 } 99 }; 100 } 101 } 102 103 #endif 104