| #ifndef WIN32 |
| #include <sys/time.h> |
| #else |
| #endif /** !WIN32 */ |
| #include <stdlib.h> |
| |
| #include "TimeKeeper.hpp" |
| #include "RandomNumberGenerators.hpp" |
| |
| TimeKeeper::TimeKeeper(double presetDuration, double smoothDuration, double easterEgg) |
| { |
| _smoothDuration = smoothDuration; |
| _presetDuration = presetDuration; |
| _easterEgg = easterEgg; |
| |
| #ifndef WIN32 |
| gettimeofday ( &this->startTime, NULL ); |
| #else |
| startTime = GetTickCount(); |
| #endif /** !WIN32 */ |
| |
| UpdateTimers(); |
| } |
| |
| void TimeKeeper::UpdateTimers() |
| { |
| #ifndef WIN32 |
| _currentTime = getTicks ( &startTime ) * 0.001; |
| #else |
| _currentTime = getTicks ( startTime ) * 0.001; |
| #endif /** !WIN32 */ |
| |
| _presetFrameA++; |
| _presetFrameB++; |
| |
| } |
| |
| void TimeKeeper::StartPreset() |
| { |
| _isSmoothing = false; |
| _presetTimeA = _currentTime; |
| _presetFrameA = 1; |
| _presetDurationA = sampledPresetDuration(); |
| } |
| void TimeKeeper::StartSmoothing() |
| { |
| _isSmoothing = true; |
| _presetTimeB = _currentTime; |
| _presetFrameB = 1; |
| _presetDurationB = sampledPresetDuration(); |
| } |
| void TimeKeeper::EndSmoothing() |
| { |
| _isSmoothing = false; |
| _presetTimeA = _presetTimeB; |
| _presetFrameA = _presetFrameB; |
| _presetDurationA = _presetDurationB; |
| } |
| |
| bool TimeKeeper::CanHardCut() |
| { |
| return ((_currentTime - _presetTimeA) > HARD_CUT_DELAY); |
| } |
| |
| double TimeKeeper::SmoothRatio() |
| { |
| return (_currentTime - _presetTimeB) / _smoothDuration; |
| } |
| bool TimeKeeper::IsSmoothing() |
| { |
| return _isSmoothing; |
| } |
| |
| double TimeKeeper::GetRunningTime() |
| { |
| return _currentTime; |
| } |
| |
| double TimeKeeper::PresetProgressA() |
| { |
| if (_isSmoothing) return 1.0; |
| else return (_currentTime - _presetTimeA) / _presetDurationA; |
| } |
| double TimeKeeper::PresetProgressB() |
| { |
| return (_currentTime - _presetTimeB) / _presetDurationB; |
| } |
| |
| int TimeKeeper::PresetFrameB() |
| { |
| return _presetFrameB; |
| } |
| |
| int TimeKeeper::PresetFrameA() |
| { |
| return _presetFrameA; |
| } |
| |
| double TimeKeeper::sampledPresetDuration() { |
| #ifdef WIN32 |
| return _presetDuration; |
| #else |
| return fmax(1, fmin(60, RandomNumberGenerators::gaussian |
| (_presetDuration, _easterEgg))); |
| #endif |
| } |