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()
50 jack_nframes_t JackTimer::Time2Frames(jack_time_t usecs, jack_nframes_t buffer_size)
63 int64_t du = usecs - fCurrentWakeup;
64 int64_t dp = fNextWakeUp - fCurrentWakeup;
65 return fFrames + (int32_t)rint((
double)du / (
double)dp * buffer_size);
71 jack_time_t JackTimer::Frames2Time(jack_nframes_t frames, jack_nframes_t buffer_size)
84 int32_t df = frames - fFrames;
85 int64_t dp = fNextWakeUp - fCurrentWakeup;
86 return fCurrentWakeup + (int64_t)rint((
double) df * (
double) dp / buffer_size);
92 int JackTimer::GetCycleTimes(jack_nframes_t* current_frames, jack_time_t* current_usecs, jack_time_t* next_usecs,
float* period_usecs)
95 *current_frames = fFrames;
96 *current_usecs = fCurrentWakeup;
97 *next_usecs = fNextWakeUp;
98 *period_usecs = fPeriodUsecs;
105 jack_nframes_t JackTimer::FramesSinceCycleStart(jack_time_t cur_time, jack_nframes_t frames_rate)
107 return (jack_nframes_t) floor((((
float)frames_rate) / 1000000.0f) * (cur_time - fCurrentCallback));
110 void JackFrameTimer::InitFrameTime()
115 void JackFrameTimer::IncFrameTime(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs)
118 InitFrameTimeAux(callback_usecs, period_usecs);
119 fFirstWakeUp =
false;
122 IncFrameTimeAux(buffer_size, callback_usecs, period_usecs);
125 void JackFrameTimer::ResetFrameTime(jack_time_t callback_usecs)
128 JackTimer* timer = WriteNextStateStart();
129 timer->fCurrentWakeup = callback_usecs;
130 timer->fCurrentCallback = callback_usecs;
131 WriteNextStateStop();
141 void JackFrameTimer::ReadFrameTime(JackTimer* timer)
143 UInt16 next_index = GetCurrentIndex();
146 cur_index = next_index;
147 memcpy(timer, ReadCurrentState(),
sizeof(JackTimer));
148 next_index = GetCurrentIndex();
149 }
while (cur_index != next_index);
154 void JackFrameTimer::InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t period_usecs)
189 JackTimer* timer = WriteNextStateStart();
190 timer->fPeriodUsecs = (float)period_usecs;
191 timer->fCurrentCallback = callback_usecs;
192 timer->fNextWakeUp = callback_usecs;
193 timer->fFilterOmega = period_usecs * 7.854e-7f;
194 WriteNextStateStop();
198 void JackFrameTimer::IncFrameTimeAux(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs)
200 JackTimer* timer = WriteNextStateStart();
224 float delta = (float)((int64_t)callback_usecs - (int64_t)timer->fNextWakeUp);
225 delta *= timer->fFilterOmega;
226 timer->fCurrentWakeup = timer->fNextWakeUp;
227 timer->fCurrentCallback = callback_usecs;
228 timer->fFrames += buffer_size;
229 timer->fPeriodUsecs += timer->fFilterOmega * delta;
230 timer->fNextWakeUp += (int64_t)floorf(timer->fPeriodUsecs + 1.41f * delta + 0.5f);
231 timer->fInitialized =
true;
233 WriteNextStateStop();