All Classes Namespaces Files Functions Variables Enumerations Enumerator
libs/system/ManagedTicks.cpp
Go to the documentation of this file.
00001 
00010 #include "ManagedTicks.h"
00011 #include "ticks.h"
00012 #include <boost/function.hpp>
00013 
00014 using namespace qrk;
00015 using namespace boost;
00016 
00017 
00018 struct ManagedTicks::pImpl
00019 {
00020     enum {
00021         InvalidTicks = -1,
00022     };
00023     TicksFunction ticks_function_;
00024     double speed_rate_;
00025     long elapsed_msec_;
00026     bool is_playing_;
00027     long last_ticks_;
00028 
00029 
00030     pImpl(void)
00031         : ticks_function_(qrk::ticks),
00032           speed_rate_(1.0), elapsed_msec_(0), is_playing_(false),
00033           last_ticks_(InvalidTicks)
00034     {
00035     }
00036 
00037 
00038     void restart(void)
00039     {
00040         last_ticks_ = ticks_function_();
00041     }
00042 
00043 
00044     void updateElapsed(void)
00045     {
00046         elapsed_msec_ +=
00047             static_cast<long>((ticks_function_() - last_ticks_) * speed_rate_);
00048     }
00049 
00050 
00051     long ticks(void) const
00052     {
00053         long ticks = elapsed_msec_;
00054         if (is_playing_) {
00055             ticks += static_cast<long>((ticks_function_() -
00056                                         last_ticks_) * speed_rate_);
00057         }
00058         return ticks;
00059     }
00060 
00061 
00062     void play(void)
00063     {
00064         if (is_playing_) {
00065             updateElapsed();
00066             speed_rate_ = 1.0;
00067         }
00068 
00069         resume();
00070     }
00071 
00072 
00073     void pause(void)
00074     {
00075         if (! is_playing_) {
00076             return;
00077         }
00078         updateElapsed();
00079         is_playing_ = false;
00080     }
00081 
00082 
00083     void resume(void)
00084     {
00085         is_playing_ = true;
00086         restart();
00087     }
00088 
00089 
00090     void moreFaster(void)
00091     {
00092         if (is_playing_) {
00093             updateElapsed();
00094         }
00095         speed_rate_ *= 2.0;
00096         restart();
00097     }
00098 
00099 
00100     void moreSlower(void)
00101     {
00102         if (is_playing_) {
00103             updateElapsed();
00104         }
00105         speed_rate_ /= 2.0;
00106         restart();
00107     }
00108 };
00109 
00110 
00111 ManagedTicks::ManagedTicks(void) : pimpl(new pImpl)
00112 {
00113 }
00114 
00115 
00116 ManagedTicks::~ManagedTicks(void)
00117 {
00118 }
00119 
00120 
00121 void ManagedTicks::setTicksFunction(TicksFunction function)
00122 {
00123     pimpl->ticks_function_ = function;
00124 }
00125 
00126 
00127 long ManagedTicks::ticks(void) const
00128 {
00129     return pimpl->ticks();
00130 }
00131 
00132 
00133 void ManagedTicks::play(void)
00134 {
00135     if (pimpl->last_ticks_ == pImpl::InvalidTicks) {
00136         pimpl->last_ticks_ = pimpl->ticks_function_();
00137     }
00138     pimpl->play();
00139 }
00140 
00141 
00142 void ManagedTicks::pause(void)
00143 {
00144     pimpl->pause();
00145 }
00146 
00147 
00148 void ManagedTicks::resume(void)
00149 {
00150     pimpl->resume();
00151 }
00152 
00153 
00154 void ManagedTicks::moreFaster(void)
00155 {
00156     pimpl->moreFaster();
00157 }
00158 
00159 
00160 void ManagedTicks::moreSlower(void)
00161 {
00162     pimpl->moreSlower();
00163 }