21 #include "JackFrameTimer.h"
22 #include "JackError.h"
29 #if defined(WIN32) && !defined(__MINGW32__)
31 inline double rint(
double nr)
35 return (((c -nr) >= (nr - f)) ? f : c);
39 JackTimer::JackTimer()
46 fFilterCoefficient = 0.01f;
47 fSecondOrderIntegrator = 0.0f;
50 jack_nframes_t JackTimer::Time2Frames(jack_time_t time, jack_nframes_t buffer_size)
53 return fFrames + (long)rint(((
double) ((
long long)(time - fCurrentWakeup)) / ((
long long)(fNextWakeUp - fCurrentWakeup))) * buffer_size);
59 jack_time_t JackTimer::Frames2Time(jack_nframes_t frames, jack_nframes_t buffer_size)
62 return fCurrentWakeup + (long)rint(((
double) ((
long long)(frames - fFrames)) * ((
long long)(fNextWakeUp - fCurrentWakeup))) / buffer_size);
68 jack_nframes_t JackTimer::FramesSinceCycleStart(jack_time_t cur_time, jack_nframes_t frames_rate)
70 return (jack_nframes_t) floor((((
float)frames_rate) / 1000000.0f) * (cur_time - fCurrentCallback));
73 void JackFrameTimer::InitFrameTime()
78 void JackFrameTimer::IncFrameTime(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs)
81 InitFrameTimeAux(callback_usecs, period_usecs);
84 IncFrameTimeAux(buffer_size, callback_usecs, period_usecs);
88 void JackFrameTimer::ResetFrameTime(jack_nframes_t frames_rate, jack_time_t callback_usecs, jack_time_t period_usecs)
92 jack_nframes_t period_size_guess = (jack_nframes_t)(frames_rate * ((timer->fNextWakeUp - timer->fCurrentWakeup) / 1000000.0));
93 timer->fFrames += ((callback_usecs - timer->fNextWakeUp) / period_size_guess) * period_size_guess;
94 timer->fCurrentWakeup = callback_usecs;
95 timer->fCurrentCallback = callback_usecs;
96 timer->fNextWakeUp = callback_usecs + period_usecs;
107 void JackFrameTimer::ReadFrameTime(JackTimer* timer)
112 cur_index = next_index;
115 }
while (cur_index != next_index);
120 void JackFrameTimer::InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t period_usecs)
123 timer->fSecondOrderIntegrator = 0.0f;
124 timer->fCurrentCallback = callback_usecs;
125 timer->fNextWakeUp = callback_usecs + period_usecs;
130 void JackFrameTimer::IncFrameTimeAux(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs)
133 float delta = (int64_t)callback_usecs - (int64_t)timer->fNextWakeUp;
134 timer->fCurrentWakeup = timer->fNextWakeUp;
135 timer->fCurrentCallback = callback_usecs;
136 timer->fFrames += buffer_size;
137 timer->fSecondOrderIntegrator += 0.5f * timer->fFilterCoefficient * delta;
138 timer->fNextWakeUp = timer->fCurrentWakeup + period_usecs + (int64_t) floorf((timer->fFilterCoefficient * (delta + timer->fSecondOrderIntegrator)));
139 timer->fInitialized =
true;