From: S?bastien G. <kx...@us...> - 2004-04-15 03:58:54
|
Update of /cvsroot/vba/VisualBoyAdvance/src/gtk In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12997/src/gtk Modified Files: configfile.cpp configfile.h filters.h vba.glade window.cpp window.h Log Message: Added auto frameskip and throttle support. Config file has been modified, and now old and corrupted config files are fixed at loading time. Index: configfile.h =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/gtk/configfile.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** configfile.h 2 Apr 2004 01:22:17 -0000 1.1 --- configfile.h 15 Apr 2004 03:58:45 -0000 1.2 *************** *** 89,92 **** --- 89,93 ---- inline std::string sGetName() const { return m_sName; } + bool bKeyExists(const std::string & _rsKey); void vSetKey(const std::string & _rsKey, const std::string & _rsValue); std::string sGetKey(const std::string & _rsKey) const; *************** *** 130,137 **** virtual ~File(); Section * poAddSection(const std::string & _rsName); Section * poGetSection(const std::string & _rsName); void vRemoveSection(const std::string & _rsName); ! void vLoad(const std::string & _rsFilename); void vSave(const std::string & _rsFilename); void vClear(); --- 131,141 ---- virtual ~File(); + bool bSectionExists(const std::string & _rsName); Section * poAddSection(const std::string & _rsName); Section * poGetSection(const std::string & _rsName); void vRemoveSection(const std::string & _rsName); ! void vLoad(const std::string & _rsFilename, ! bool _bAddSection = true, ! bool _bAddKey = true); void vSave(const std::string & _rsFilename); void vClear(); Index: filters.h =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/gtk/filters.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** filters.h 2 Apr 2004 01:22:17 -0000 1.2 --- filters.h 15 Apr 2004 03:58:45 -0000 1.3 *************** *** 65,69 **** enum EFilter2x { ! FilterNone, Filter2xSaI, FilterSuper2xSaI, --- 65,70 ---- enum EFilter2x { ! FirstFilter, ! FilterNone = FirstFilter, Filter2xSaI, FilterSuper2xSaI, *************** *** 78,89 **** FilterScanlinesTV, FilterHq2x, ! FilterLq2x }; enum EFilterIB { ! FilterIBNone, FilterIBSmart, ! FilterIBMotionBlur }; --- 79,93 ---- FilterScanlinesTV, FilterHq2x, ! FilterLq2x, ! LastFilter = FilterLq2x }; enum EFilterIB { ! FirstFilterIB, ! FilterIBNone = FirstFilterIB, FilterIBSmart, ! FilterIBMotionBlur, ! LastFilterIB = FilterIBMotionBlur }; Index: configfile.cpp =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/gtk/configfile.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** configfile.cpp 2 Apr 2004 01:22:17 -0000 1.1 --- configfile.cpp 15 Apr 2004 03:58:45 -0000 1.2 *************** *** 45,48 **** --- 45,60 ---- } + bool Section::bKeyExists(const string & _rsKey) + { + for (iterator it = begin(); it != end(); it++) + { + if (it->m_sKey == _rsKey) + { + return true; + } + } + return false; + } + void Section::vSetKey(const string & _rsKey, const string & _rsValue) { *************** *** 95,98 **** --- 107,122 ---- } + bool File::bSectionExists(const string & _rsName) + { + for (iterator it = begin(); it != end(); it++) + { + if (it->sGetName() == _rsName) + { + return true; + } + } + return false; + } + Section * File::poAddSection(const string & _rsName) { *************** *** 137,141 **** } ! void File::vLoad(const string & _rsFilename) { string sBuffer = Glib::file_get_contents(_rsFilename); --- 161,167 ---- } ! void File::vLoad(const string & _rsFilename, ! bool _bAddSection, ! bool _bAddKey) { string sBuffer = Glib::file_get_contents(_rsFilename); *************** *** 151,155 **** { *tmp = '\0'; ! poSection = poAddSection(&lines[i][1]); } } --- 177,195 ---- { *tmp = '\0'; ! if (_bAddSection) ! { ! poSection = poAddSection(&lines[i][1]); ! } ! else ! { ! try ! { ! poSection = poGetSection(&lines[i][1]); ! } ! catch (...) ! { ! poSection = NULL; ! } ! } } } *************** *** 160,164 **** *tmp = '\0'; tmp++; ! poSection->vSetKey(lines[i], tmp); } } --- 200,207 ---- *tmp = '\0'; tmp++; ! if (_bAddKey || poSection->bKeyExists(lines[i])) ! { ! poSection->vSetKey(lines[i], tmp); ! } } } Index: window.h =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/gtk/window.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** window.h 12 Apr 2004 22:59:24 -0000 1.3 --- window.h 15 Apr 2004 03:58:45 -0000 1.4 *************** *** 83,90 **** static Window * m_poInstance; std::string m_sUserDataDir; std::string m_sConfigFile; Config::File m_oConfig; ! Config::Section * m_poScreenConfig; Gtk::FileSelection * m_poFileOpenDialog; --- 83,93 ---- static Window * m_poInstance; + Glib::RefPtr<Gnome::Glade::Xml> m_poXml; + std::string m_sUserDataDir; std::string m_sConfigFile; Config::File m_oConfig; ! Config::Section * m_poCoreConfig; ! Config::Section * m_poDisplayConfig; Gtk::FileSelection * m_poFileOpenDialog; *************** *** 94,98 **** SigC::Connection m_oEmuSig; ! bool m_bPaused; std::string m_sRomFile; ECartridge m_eCartridge; --- 97,103 ---- SigC::Connection m_oEmuSig; ! int m_iScreenWidth; ! int m_iScreenHeight; ! std::string m_sRomFile; ECartridge m_eCartridge; *************** *** 100,111 **** Keymap m_oKeymap; u32 m_uiJoypadState; bool m_bAutoFrameskip; ! ! int m_iScreenWidth; ! int m_iScreenHeight; void vInitSystem(); void vInitSDL(); void vInitConfig(); void vLoadConfig(const std::string & _sFilename); void vSaveConfig(const std::string & _sFilename); --- 105,118 ---- Keymap m_oKeymap; u32 m_uiJoypadState; + bool m_bWasEmulating; bool m_bAutoFrameskip; ! int m_iThrottle; ! u32 m_uiThrottleLastTime; ! u32 m_uiThrottleDelay; void vInitSystem(); void vInitSDL(); void vInitConfig(); + void vCheckConfig(); void vLoadConfig(const std::string & _sFilename); void vSaveConfig(const std::string & _sFilename); *************** *** 121,124 **** --- 128,132 ---- void vStopEmu(); void vSetThrottle(int _iPercent); + void vSelectBestThrottleItem(); }; Index: window.cpp =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/gtk/window.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** window.cpp 12 Apr 2004 22:59:24 -0000 1.3 --- window.cpp 15 Apr 2004 03:58:45 -0000 1.4 *************** *** 46,49 **** --- 46,50 ---- Window * Window::m_poInstance = NULL; + // GB/GBA screen sizes const int iGBScreenWidth = 160; const int iGBScreenHeight = 144; *************** *** 53,63 **** const int iGBAScreenHeight = 160; Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr<Xml> & _poXml) : Gtk::Window(_pstWindow), m_poFileOpenDialog(NULL), - m_eCartridge(NO_CARTRIDGE), - m_uiJoypadState(0), m_iScreenWidth(iGBAScreenWidth), ! m_iScreenHeight(iGBAScreenHeight) { vInitSystem(); --- 54,77 ---- const int iGBAScreenHeight = 160; + // Config limits + const int iFrameskipMin = 0; + const int iFrameskipMax = 9; + const int iThrottleMin = 5; + const int iThrottleMax = 1000; + const int iScaleMin = 1; + const int iScaleMax = 6; + const int iFilter2xMin = (int)FirstFilter; + const int iFilter2xMax = (int)LastFilter; + const int iFilterIBMin = (int)FirstFilterIB; + const int iFilterIBMax = (int)LastFilterIB; + Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr<Xml> & _poXml) : Gtk::Window(_pstWindow), + m_poXml(_poXml), m_poFileOpenDialog(NULL), m_iScreenWidth(iGBAScreenWidth), ! m_iScreenHeight(iGBAScreenHeight), ! m_eCartridge(NO_CARTRIDGE), ! m_uiJoypadState(0) { vInitSystem(); *************** *** 85,88 **** --- 99,103 ---- { vLoadConfig(m_sConfigFile); + vCheckConfig(); } else *************** *** 118,122 **** { const char * m_csName; ! int m_iFrameskip; } astFrameskip[] = --- 133,137 ---- { const char * m_csName; ! const int m_iFrameskip; } astFrameskip[] = *************** *** 135,139 **** }; int iDefaultFrameskip; ! if (m_poScreenConfig->sGetKey("frameskip") == "auto") { iDefaultFrameskip = -1; --- 150,154 ---- }; int iDefaultFrameskip; ! if (m_poCoreConfig->sGetKey("frameskip") == "auto") { iDefaultFrameskip = -1; *************** *** 141,145 **** else { ! iDefaultFrameskip = m_poScreenConfig->oGetKey<int>("frameskip"); } for (guint i = 0; i < sizeof(astFrameskip) / sizeof(astFrameskip[0]); i++) --- 156,160 ---- else { ! iDefaultFrameskip = m_poCoreConfig->oGetKey<int>("frameskip"); } for (guint i = 0; i < sizeof(astFrameskip) / sizeof(astFrameskip[0]); i++) *************** *** 161,165 **** { const char * m_csName; ! int m_iThrottle; } astThrottle[] = --- 176,180 ---- { const char * m_csName; ! const int m_iThrottle; } astThrottle[] = *************** *** 178,182 **** poCMI)); ! int iDefaultThrottle = m_poScreenConfig->oGetKey<int>("throttle"); for (guint i = 0; i < sizeof(astThrottle) / sizeof(astThrottle[0]); i++) { --- 193,197 ---- poCMI)); ! int iDefaultThrottle = m_poCoreConfig->oGetKey<int>("throttle"); for (guint i = 0; i < sizeof(astThrottle) / sizeof(astThrottle[0]); i++) { *************** *** 197,201 **** { const char * m_csName; ! int m_iScale; } astVideoScale[] = --- 212,216 ---- { const char * m_csName; ! const int m_iScale; } astVideoScale[] = *************** *** 208,212 **** { "Video6x", 6 } }; ! int iDefaultScale = m_poScreenConfig->oGetKey<int>("scale"); for (guint i = 0; i < sizeof(astVideoScale) / sizeof(astVideoScale[0]); i++) { --- 223,227 ---- { "Video6x", 6 } }; ! int iDefaultScale = m_poDisplayConfig->oGetKey<int>("scale"); for (guint i = 0; i < sizeof(astVideoScale) / sizeof(astVideoScale[0]); i++) { *************** *** 227,243 **** { const char * m_csName; ! int m_iLayer; ! bool m_bChecked; } astLayer[] = { ! { "LayersBg0", 0, m_poScreenConfig->oGetKey<bool>("layer_bg0") }, ! { "LayersBg1", 1, m_poScreenConfig->oGetKey<bool>("layer_bg1") }, ! { "LayersBg2", 2, m_poScreenConfig->oGetKey<bool>("layer_bg2") }, ! { "LayersBg3", 3, m_poScreenConfig->oGetKey<bool>("layer_bg3") }, ! { "LayersObj", 4, m_poScreenConfig->oGetKey<bool>("layer_obj") }, ! { "LayersWin0", 5, m_poScreenConfig->oGetKey<bool>("layer_win0") }, ! { "LayersWin1", 6, m_poScreenConfig->oGetKey<bool>("layer_win1") }, ! { "LayersObjWin", 7, m_poScreenConfig->oGetKey<bool>("layer_objwin") } }; for (guint i = 0; i < sizeof(astLayer) / sizeof(astLayer[0]); i++) --- 242,258 ---- { const char * m_csName; ! const int m_iLayer; ! const bool m_bChecked; } astLayer[] = { ! { "LayersBg0", 0, m_poCoreConfig->oGetKey<bool>("layer_bg0") }, ! { "LayersBg1", 1, m_poCoreConfig->oGetKey<bool>("layer_bg1") }, ! { "LayersBg2", 2, m_poCoreConfig->oGetKey<bool>("layer_bg2") }, ! { "LayersBg3", 3, m_poCoreConfig->oGetKey<bool>("layer_bg3") }, ! { "LayersObj", 4, m_poCoreConfig->oGetKey<bool>("layer_obj") }, ! { "LayersWin0", 5, m_poCoreConfig->oGetKey<bool>("layer_win0") }, ! { "LayersWin1", 6, m_poCoreConfig->oGetKey<bool>("layer_win1") }, ! { "LayersObjWin", 7, m_poCoreConfig->oGetKey<bool>("layer_objwin") } }; for (guint i = 0; i < sizeof(astLayer) / sizeof(astLayer[0]); i++) *************** *** 255,260 **** struct { ! const char * m_csName; ! EFilter2x m_eFilter2x; } astFilter2x[] = --- 270,275 ---- struct { ! const char * m_csName; ! const EFilter2x m_eFilter2x; } astFilter2x[] = *************** *** 275,279 **** { "FilterLq2x", FilterLq2x } }; ! EFilter2x eDefaultFilter2x = (EFilter2x)m_poScreenConfig->oGetKey<int>("filter2x"); for (guint i = 0; i < sizeof(astFilter2x) / sizeof(astFilter2x[0]); i++) { --- 290,294 ---- { "FilterLq2x", FilterLq2x } }; ! EFilter2x eDefaultFilter2x = (EFilter2x)m_poDisplayConfig->oGetKey<int>("filter2x"); for (guint i = 0; i < sizeof(astFilter2x) / sizeof(astFilter2x[0]); i++) { *************** *** 291,295 **** poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget("FilterDisableMmx")); #ifdef MMX ! poCMI->set_active(m_poScreenConfig->oGetKey<bool>("filter_disable_mmx")); vOnDisableMMXToggled(poCMI); poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *>( --- 306,310 ---- poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget("FilterDisableMmx")); #ifdef MMX ! poCMI->set_active(m_poDisplayConfig->oGetKey<bool>("filter_disable_mmx")); vOnDisableMMXToggled(poCMI); poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *>( *************** *** 305,310 **** struct { ! const char * m_csName; ! EFilterIB m_eFilterIB; } astFilterIB[] = --- 320,325 ---- struct { ! const char * m_csName; ! const EFilterIB m_eFilterIB; } astFilterIB[] = *************** *** 314,318 **** { "IFBMotionBlur", FilterIBMotionBlur } }; ! EFilterIB eDefaultFilterIB = (EFilterIB)m_poScreenConfig->oGetKey<int>("filterIB"); for (guint i = 0; i < sizeof(astFilterIB) / sizeof(astFilterIB[0]); i++) { --- 329,333 ---- { "IFBMotionBlur", FilterIBMotionBlur } }; ! EFilterIB eDefaultFilterIB = (EFilterIB)m_poDisplayConfig->oGetKey<int>("filterIB"); for (guint i = 0; i < sizeof(astFilterIB) / sizeof(astFilterIB[0]); i++) { *************** *** 408,414 **** return; ! int iFlags = (SDL_INIT_AUDIO ! | SDL_INIT_TIMER // useful for SDL_GetTicks ? ! | SDL_INIT_NOPARACHUTE); if (SDL_Init(iFlags) < 0) --- 423,427 ---- return; ! int iFlags = (SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE); if (SDL_Init(iFlags) < 0) *************** *** 425,452 **** m_oConfig.vClear(); ! m_poScreenConfig = m_oConfig.poAddSection("Screen"); ! m_poScreenConfig->vSetKey ("frameskip", "auto" ); ! m_poScreenConfig->vSetKey ("throttle", 0 ); ! m_poScreenConfig->vSetKey ("scale", 1 ); ! m_poScreenConfig->vSetKey ("layer_bg0", true ); ! m_poScreenConfig->vSetKey ("layer_bg1", true ); ! m_poScreenConfig->vSetKey ("layer_bg2", true ); ! m_poScreenConfig->vSetKey ("layer_bg3", true ); ! m_poScreenConfig->vSetKey ("layer_obj", true ); ! m_poScreenConfig->vSetKey ("layer_win0", true ); ! m_poScreenConfig->vSetKey ("layer_win1", true ); ! m_poScreenConfig->vSetKey ("layer_objwin", true ); ! m_poScreenConfig->vSetKey<int>("filter2x", FilterNone ); ! m_poScreenConfig->vSetKey<int>("filterIB", FilterIBNone ); #ifdef MMX ! m_poScreenConfig->vSetKey ("filter_disable_mmx", false ); #endif // MMX } void Window::vLoadConfig(const std::string & _sFilename) { try { ! m_oConfig.vLoad(_sFilename); } catch (const Glib::Error & e) --- 438,518 ---- m_oConfig.vClear(); ! // Core section ! // ! m_poCoreConfig = m_oConfig.poAddSection("Core"); ! m_poCoreConfig->vSetKey("frameskip", "auto" ); ! m_poCoreConfig->vSetKey("throttle", 0 ); ! m_poCoreConfig->vSetKey("layer_bg0", true ); ! m_poCoreConfig->vSetKey("layer_bg1", true ); ! m_poCoreConfig->vSetKey("layer_bg2", true ); ! m_poCoreConfig->vSetKey("layer_bg3", true ); ! m_poCoreConfig->vSetKey("layer_obj", true ); ! m_poCoreConfig->vSetKey("layer_win0", true ); ! m_poCoreConfig->vSetKey("layer_win1", true ); ! m_poCoreConfig->vSetKey("layer_objwin", true ); ! ! // Display section ! // ! m_poDisplayConfig = m_oConfig.poAddSection("Display"); ! m_poDisplayConfig->vSetKey ("scale", 1 ); ! m_poDisplayConfig->vSetKey<int>("filter2x", FilterNone ); ! m_poDisplayConfig->vSetKey<int>("filterIB", FilterIBNone ); #ifdef MMX ! m_poDisplayConfig->vSetKey ("filter_disable_mmx", false ); #endif // MMX } + void Window::vCheckConfig() + { + int iValue; + int iAdjusted; + + if (m_poCoreConfig->sGetKey("frameskip") != "auto") + { + iValue = m_poCoreConfig->oGetKey<int>("frameskip"); + iAdjusted = CLAMP(iValue, iFrameskipMin, iFrameskipMax); + if (iValue != iAdjusted) + { + m_poCoreConfig->vSetKey("frameskip", iAdjusted); + } + } + + iValue = m_poCoreConfig->oGetKey<int>("throttle"); + if (iValue != 0) + { + iAdjusted = CLAMP(iValue, iThrottleMin, iThrottleMax); + if (iValue != iAdjusted) + { + m_poCoreConfig->vSetKey("throttle", iAdjusted); + } + } + + iValue = m_poDisplayConfig->oGetKey<int>("scale"); + iAdjusted = CLAMP(iValue, iScaleMin, iScaleMax); + if (iValue != iAdjusted) + { + m_poDisplayConfig->vSetKey("scale", iAdjusted); + } + + iValue = m_poDisplayConfig->oGetKey<int>("filter2x"); + iAdjusted = CLAMP(iValue, iFilter2xMin, iFilter2xMax); + if (iValue != iAdjusted) + { + m_poDisplayConfig->vSetKey("filter2x", iAdjusted); + } + + iValue = m_poDisplayConfig->oGetKey<int>("filterIB"); + iAdjusted = CLAMP(iValue, iFilterIBMin, iFilterIBMax); + if (iValue != iAdjusted) + { + m_poDisplayConfig->vSetKey("filterIB", iAdjusted); + } + } + void Window::vLoadConfig(const std::string & _sFilename) { try { ! m_oConfig.vLoad(_sFilename, false, false); } catch (const Glib::Error & e) *************** *** 458,463 **** oDialog.run(); } - - // TODO : check that values are valid } --- 524,527 ---- *************** *** 505,509 **** m_poScreenArea->vSetSize(m_iScreenWidth, m_iScreenHeight); ! m_poScreenArea->vSetScale(m_poScreenConfig->oGetKey<int>("scale")); resize(1, 1); --- 569,573 ---- m_poScreenArea->vSetSize(m_iScreenWidth, m_iScreenHeight); ! m_poScreenArea->vSetScale(m_poDisplayConfig->oGetKey<int>("scale")); resize(1, 1); *************** *** 531,594 **** void Window::vComputeFrameskip(int _iRate) { ! #if 0 ! u32 time = SDL_GetTicks(); ! if(!wasPaused && autoFrameSkip && !throttle) { ! u32 diff = time - autoFrameSkipLastTime; ! int speed = 100; ! if(diff) ! speed = (1000000/rate)/diff; ! ! if(speed >= 98) { ! frameskipadjust++; ! if(frameskipadjust >= 3) { ! frameskipadjust=0; ! if(systemFrameSkip > 0) ! systemFrameSkip--; } ! } else { ! if(speed < 80) ! frameskipadjust -= (90 - speed)/5; ! else if(systemFrameSkip < 9) ! frameskipadjust--; ! if(frameskipadjust <= -2) { ! frameskipadjust += 2; ! if(systemFrameSkip < 9) ! systemFrameSkip++; } ! } ! } ! if(!wasPaused && throttle) { ! if(!speedup) { ! u32 diff = time - throttleLastTime; ! ! int target = (1000000/(rate*throttle)); ! int d = (target - diff); ! ! if(d > 0) { ! SDL_Delay(d); } ! } ! throttleLastTime = systemGetClock(); ! } ! if(rewindMemory) { ! if(++rewindCounter >= rewindTimer) { ! rewindSaveNeeded = true; ! rewindCounter = 0; ! } ! } ! if(systemSaveUpdateCounter) { ! if(--systemSaveUpdateCounter <= SYSTEM_SAVE_NOT_UPDATED) { ! sdlWriteBattery(); ! systemSaveUpdateCounter = SYSTEM_SAVE_NOT_UPDATED; } } ! wasPaused = false; ! autoFrameSkipLastTime = time; ! #endif // 0 } --- 595,673 ---- void Window::vComputeFrameskip(int _iRate) { ! static u32 uiLastTime = 0; ! static int iFrameskipAdjust = 0; ! u32 uiTime = SDL_GetTicks(); ! if (m_bWasEmulating) ! { ! int iWantedSpeed = 100; ! ! if (m_iThrottle > 0) ! { ! if (! speedup) ! { ! u32 uiDiff = uiTime - m_uiThrottleLastTime; ! int iTarget = 1000000 / (_iRate * m_iThrottle); ! int iDelay = iTarget - uiDiff; ! if (iDelay > 0) ! { ! m_uiThrottleDelay = iDelay; ! } } ! iWantedSpeed = m_iThrottle; ! } ! if (m_bAutoFrameskip) ! { ! u32 uiDiff = uiTime - uiLastTime; ! int iSpeed = iWantedSpeed; ! ! if (uiDiff != 0) ! { ! iSpeed = (1000000 / _iRate) / uiDiff; } ! ! if (iSpeed >= iWantedSpeed - 2) ! { ! iFrameskipAdjust++; ! if (iFrameskipAdjust >= 3) ! { ! iFrameskipAdjust = 0; ! if (systemFrameSkip > 0) ! { ! systemFrameSkip--; ! } ! } } ! else ! { ! if (iSpeed < iWantedSpeed - 20) ! { ! iFrameskipAdjust -= ((iWantedSpeed - 10) - iSpeed) / 5; ! } ! else if (systemFrameSkip < 9) ! { ! iFrameskipAdjust--; ! } ! if (iFrameskipAdjust <= -2) ! { ! iFrameskipAdjust += 2; ! if (systemFrameSkip < 9) ! { ! systemFrameSkip++; ! } ! } ! } } } + else + { + m_bWasEmulating = true; + } ! uiLastTime = uiTime; ! m_uiThrottleLastTime = uiTime; } *************** *** 684,687 **** --- 763,768 ---- emulating = 1; + m_bWasEmulating = false; + m_uiThrottleDelay = 0; if (m_poFilePauseItem->get_active()) *************** *** 743,752 **** { m_oEmuSig.disconnect(); } void Window::vSetThrottle(int _iPercent) { ! // TODO ! m_poScreenConfig->vSetKey("throttle", _iPercent); } --- 824,861 ---- { m_oEmuSig.disconnect(); + m_bWasEmulating = false; } void Window::vSetThrottle(int _iPercent) { ! m_iThrottle = _iPercent; ! m_poCoreConfig->vSetKey("throttle", _iPercent); ! } ! ! void Window::vSelectBestThrottleItem() ! { ! struct ! { ! const char * m_csName; ! const int m_iThrottle; ! } ! astThrottle[] = ! { ! { "ThrottleNoThrottle", 0 }, ! { "Throttle25", 25 }, ! { "Throttle50", 50 }, ! { "Throttle100", 100 }, ! { "Throttle150", 150 }, ! { "Throttle200", 200 } ! }; ! for (guint i = 0; i < sizeof(astThrottle) / sizeof(astThrottle[0]); i++) ! { ! Gtk::CheckMenuItem * poCMI; ! poCMI = dynamic_cast<Gtk::CheckMenuItem *>(m_poXml->get_widget(astThrottle[i].m_csName)); ! if (astThrottle[i].m_iThrottle == m_iThrottle) ! { ! poCMI->set_active(); ! } ! } } *************** *** 819,823 **** if (_iValue >= 0 && _iValue <= 9) { ! m_poScreenConfig->vSetKey("frameskip", _iValue); gbFrameSkip = _iValue; systemFrameSkip = _iValue; --- 928,932 ---- if (_iValue >= 0 && _iValue <= 9) { ! m_poCoreConfig->vSetKey("frameskip", _iValue); gbFrameSkip = _iValue; systemFrameSkip = _iValue; *************** *** 826,830 **** else { ! m_poScreenConfig->vSetKey("frameskip", "auto"); m_bAutoFrameskip = true; } --- 935,940 ---- else { ! m_poCoreConfig->vSetKey("frameskip", "auto"); ! systemFrameSkip = 0; m_bAutoFrameskip = true; } *************** *** 839,842 **** --- 949,958 ---- vSetThrottle(_iPercent); + + // Initialize the frameskip adjustment each time throttle is changed + if (m_bAutoFrameskip) + { + systemFrameSkip = 0; + } } *************** *** 848,852 **** } ! // TODO } --- 964,991 ---- } ! Glib::RefPtr<Xml> poXml; ! poXml = Xml::create(PKGDATADIR "/vba.glade", "ThrottleDialog"); ! ! Gtk::Dialog * poDialog = dynamic_cast<Gtk::Dialog *>(poXml->get_widget("ThrottleDialog")); ! Gtk::SpinButton * poSpin = dynamic_cast<Gtk::SpinButton *>(poXml->get_widget("ThrottleSpin")); ! ! poDialog->set_transient_for(*this); ! ! if (m_iThrottle != 0) ! { ! poSpin->set_value(m_iThrottle); ! } ! else ! { ! poSpin->set_value(100); ! } ! ! if (poDialog->run() == Gtk::RESPONSE_OK) ! { ! vSetThrottle(poSpin->get_value_as_int()); ! } ! ! delete poDialog; ! vSelectBestThrottleItem(); } *************** *** 858,862 **** } ! m_poScreenConfig->vSetKey("scale", _iScale); vUpdateScreen(); } --- 997,1001 ---- } ! m_poDisplayConfig->vSetKey("scale", _iScale); vUpdateScreen(); } *************** *** 886,890 **** "layer_objwin" }; ! m_poScreenConfig->vSetKey(acsLayers[_iLayer], _poCMI->get_active()); } --- 1025,1029 ---- "layer_objwin" }; ! m_poCoreConfig->vSetKey(acsLayers[_iLayer], _poCMI->get_active()); } *************** *** 901,905 **** vDrawScreen(); } ! m_poScreenConfig->vSetKey("filter2x", _iFilter2x); } --- 1040,1044 ---- vDrawScreen(); } ! m_poDisplayConfig->vSetKey("filter2x", _iFilter2x); } *************** *** 916,920 **** vDrawScreen(); } ! m_poScreenConfig->vSetKey("filterIB", _iFilterIB); } --- 1055,1059 ---- vDrawScreen(); } ! m_poDisplayConfig->vSetKey("filterIB", _iFilterIB); } *************** *** 923,927 **** { cpu_mmx = ! _poCMI->get_active(); ! m_poScreenConfig->vSetKey("filter_disable_mmx", _poCMI->get_active()); } #endif // MMX --- 1062,1066 ---- { cpu_mmx = ! _poCMI->get_active(); ! m_poDisplayConfig->vSetKey("filter_disable_mmx", _poCMI->get_active()); } #endif // MMX *************** *** 943,946 **** --- 1082,1099 ---- bool Window::bOnEmuIdle() { + if (m_uiThrottleDelay != 0) + { + u32 uiTime = SDL_GetTicks(); + if (uiTime - m_uiThrottleLastTime >= m_uiThrottleDelay) + { + m_uiThrottleDelay = 0; + m_uiThrottleLastTime = uiTime; + } + else + { + return true; + } + } + m_stEmulator.emuMain(m_stEmulator.emuCount); return true; Index: vba.glade =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/gtk/vba.glade,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** vba.glade 2 Apr 2004 01:22:17 -0000 1.2 --- vba.glade 15 Apr 2004 03:58:45 -0000 1.3 *************** *** 47,51 **** <child internal-child="image"> ! <widget class="GtkImage" id="image72"> <property name="visible">True</property> <property name="stock">gtk-open</property> --- 47,51 ---- <child internal-child="image"> ! <widget class="GtkImage" id="image74"> <property name="visible">True</property> <property name="stock">gtk-open</property> *************** *** 196,200 **** <child internal-child="image"> ! <widget class="GtkImage" id="image73"> <property name="visible">True</property> <property name="stock">gtk-close</property> --- 196,200 ---- <child internal-child="image"> ! <widget class="GtkImage" id="image75"> <property name="visible">True</property> <property name="stock">gtk-close</property> *************** *** 217,221 **** <child internal-child="image"> ! <widget class="GtkImage" id="image74"> <property name="visible">True</property> <property name="stock">gtk-quit</property> --- 217,221 ---- <child internal-child="image"> ! <widget class="GtkImage" id="image76"> <property name="visible">True</property> <property name="stock">gtk-quit</property> *************** *** 1671,1675 **** <property name="modal">False</property> <property name="resizable">True</property> ! <property name="destroy_with_parent">False</property> <property name="has_separator">True</property> --- 1671,1675 ---- <property name="modal">False</property> <property name="resizable">True</property> ! <property name="destroy_with_parent">True</property> <property name="has_separator">True</property> *************** *** 1774,1776 **** --- 1774,1905 ---- </widget> + <widget class="GtkDialog" id="ThrottleDialog"> + <property name="title" translatable="yes">Throttle</property> + <property name="type">GTK_WINDOW_TOPLEVEL</property> + <property name="window_position">GTK_WIN_POS_NONE</property> + <property name="modal">False</property> + <property name="resizable">True</property> + <property name="destroy_with_parent">True</property> + <property name="has_separator">True</property> + + <child internal-child="vbox"> + <widget class="GtkVBox" id="dialog-vbox2"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child internal-child="action_area"> + <widget class="GtkHButtonBox" id="dialog-action_area2"> + <property name="visible">True</property> + <property name="layout_style">GTK_BUTTONBOX_END</property> + + <child> + <widget class="GtkButton" id="cancelbutton1"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-cancel</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="response_id">-6</property> + </widget> + </child> + + <child> + <widget class="GtkButton" id="okbutton1"> + <property name="visible">True</property> + <property name="can_default">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-ok</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="response_id">-5</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">GTK_PACK_END</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="label" translatable="yes">Throttle : </property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">1</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkSpinButton" id="ThrottleSpin"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="climb_rate">1</property> + <property name="digits">0</property> + <property name="numeric">True</property> + <property name="update_policy">GTK_UPDATE_ALWAYS</property> + <property name="snap_to_ticks">True</property> + <property name="wrap">True</property> + <property name="adjustment">100 5 1000 1 25 25</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="label" translatable="yes"> %</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + </child> + </widget> + </glade-interface> |