diff options
author | Tim Mayberry <mojofunk@gmail.com> | 2014-12-25 22:02:00 +0700 |
---|---|---|
committer | Tim Mayberry <mojofunk@gmail.com> | 2015-01-01 19:04:14 +0700 |
commit | b5c9a92a584b70b2af172e7240d4a58b007e0608 (patch) | |
tree | 67b84500f6e7a516d684b9b52d4cf6784246240c /gtk2_ardour/timers.cc | |
parent | d606a37204a0603144cd3592bc9825f82e144741 (diff) |
Move Timers/Timeouts from ARDOUR_UI into functions in timers.h and use PBD::Timers
Diffstat (limited to 'gtk2_ardour/timers.cc')
-rw-r--r-- | gtk2_ardour/timers.cc | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/gtk2_ardour/timers.cc b/gtk2_ardour/timers.cc new file mode 100644 index 0000000000..13f2cfdbd7 --- /dev/null +++ b/gtk2_ardour/timers.cc @@ -0,0 +1,210 @@ +/* + Copyright (C) 2014 Tim Mayberry + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "timers.h" + +#include "pbd/timer.h" +#include "pbd/debug.h" +#include "pbd/compose.h" + +#include "debug.h" + +namespace { + +class StandardTimer : public PBD::StandardTimer +{ +public: + StandardTimer (unsigned int interval) + : PBD::StandardTimer(interval) + { } + + virtual bool on_elapsed () { + DEBUG_TIMING_ADD_ELAPSED(PBD::DEBUG::GUITiming, timing_interval_data); + DEBUG_TIMING_START(PBD::DEBUG::GUITiming, timing_exec_data); + + bool ret_val = PBD::StandardTimer::on_elapsed (); + + DEBUG_TIMING_ADD_ELAPSED(PBD::DEBUG::GUITiming, timing_exec_data); + DEBUG_TIMING_START(PBD::DEBUG::GUITiming, timing_interval_data); + return ret_val; + } + +#ifndef NDEBUG + PBD::TimingData timing_interval_data; + PBD::TimingData timing_exec_data; +#endif +}; + +class BlinkTimer : public PBD::BlinkTimer +{ +public: + BlinkTimer (unsigned int interval) + : PBD::BlinkTimer(interval) + { } + + virtual bool on_elapsed () { + DEBUG_TIMING_ADD_ELAPSED(PBD::DEBUG::GUITiming, timing_interval_data); + DEBUG_TIMING_START(PBD::DEBUG::GUITiming, timing_exec_data); + + bool ret_val = PBD::BlinkTimer::on_elapsed (); + + DEBUG_TIMING_ADD_ELAPSED(PBD::DEBUG::GUITiming, timing_exec_data); + DEBUG_TIMING_START(PBD::DEBUG::GUITiming, timing_interval_data); + return ret_val; + } + +#ifndef NDEBUG + PBD::TimingData timing_interval_data; + PBD::TimingData timing_exec_data; +#endif +}; + + +class UITimers +{ + +public: + + UITimers () + : blink(240) + , second(1000) + , rapid(100) + , super_rapid(40) + , fps(40) + { +#ifndef NDEBUG + second.connect (sigc::mem_fun (*this, &UITimers::on_second_timer)); +#endif + } + + BlinkTimer blink; + StandardTimer second; + StandardTimer rapid; + StandardTimer super_rapid; + StandardTimer fps; + +#ifndef NDEBUG + std::vector<uint64_t> rapid_eps_count; + std::vector<uint64_t> super_rapid_eps_count; + std::vector<uint64_t> fps_eps_count; + +private: + + void debug_rapid_timer () { + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Rapid Connections: %1\n", rapid.connection_count ())); + + rapid_eps_count.push_back (rapid.timing_exec_data.size()); + + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Rapid Exec Totals: %1", PBD::timing_summary (rapid_eps_count))); + + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Rapid Interval: %1", rapid.timing_interval_data.summary())); + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Rapid Exec: %1", rapid.timing_exec_data.summary())); + DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, rapid.timing_interval_data); + DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, rapid.timing_exec_data); + } + + void debug_super_rapid_timer () { + // we don't use this timer on windows so don't display empty data for it +#ifndef PLATFORM_WINDOWS + + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Super Rapid Connections: %1\n", super_rapid.connection_count ())); + + super_rapid_eps_count.push_back (super_rapid.timing_exec_data.size()); + + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Super Rapid Exec Totals: %1", PBD::timing_summary (super_rapid_eps_count))); + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Super Rapid Interval: %1", super_rapid.timing_interval_data.summary())); + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("Super Rapid Exec: %1", super_rapid.timing_exec_data.summary())); + DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, super_rapid.timing_interval_data); + DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, super_rapid.timing_exec_data); +#endif + } + + void debug_fps_timer () { + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("FPS Connections: %1\n", fps.connection_count ())); + + fps_eps_count.push_back (fps.timing_exec_data.size()); + + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("FPS Exec Totals: %1", PBD::timing_summary (fps_eps_count))); + + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("FPS Interval: %1", fps.timing_interval_data.summary())); + DEBUG_TRACE(PBD::DEBUG::GUITiming, string_compose ("FPS Exec: %1", fps.timing_exec_data.summary())); + DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, fps.timing_interval_data); + DEBUG_TIMING_RESET(PBD::DEBUG::GUITiming, fps.timing_exec_data); + } + + void on_second_timer () { + debug_rapid_timer (); + debug_super_rapid_timer (); + debug_fps_timer (); + } +#endif +}; + +UITimers& +get_timers () +{ + static UITimers timers; + return timers; +} + +} // anon namespace + +namespace Timers { + +sigc::connection +blink_connect(const sigc::slot<void,bool>& slot) +{ + return get_timers().blink.connect (slot); +} + +sigc::connection +second_connect(const sigc::slot<void>& slot) +{ + return get_timers().second.connect (slot); +} + +sigc::connection +rapid_connect(const sigc::slot<void>& slot) +{ + return get_timers().rapid.connect (slot); +} + +sigc::connection +super_rapid_connect(const sigc::slot<void>& slot) +{ +#ifdef PLATFORM_WINDOWS + return get_timers().fps.connect (slot); +#else + return get_timers().super_rapid.connect (slot); +#endif +} + +void +set_fps_interval (unsigned int interval) +{ + get_timers().fps.set_interval (interval); +} + +sigc::connection +fps_connect(const sigc::slot<void>& slot) +{ + return get_timers().fps.connect (slot); +} + +} // namespace Timers |