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 }