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)
   129         timer->fCurrentWakeup = callback_usecs;
   130         timer->fCurrentCallback = callback_usecs;
   141 void JackFrameTimer::ReadFrameTime(JackTimer* timer)
   146         cur_index = next_index;
   149     } 
while (cur_index != next_index); 
   154 void JackFrameTimer::InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t period_usecs)
   190     timer->fPeriodUsecs = (float)period_usecs;
   191     timer->fCurrentCallback = callback_usecs;
   192     timer->fNextWakeUp = callback_usecs;
   193     timer->fFilterOmega = period_usecs * 7.854e-7f;
   198 void JackFrameTimer::IncFrameTimeAux(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs)
   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;
 JackTimer * ReadCurrentState()
Returns the current state : only valid in the RT reader thread.
void WriteNextStateStop()
Stop write operation : make the next state ready to be used by the RT thread.
JackTimer * WriteNextStateStart()
Start write operation : setup and returns the next state to update, check for recursive write calls.
UInt16 GetCurrentIndex()
Returns the current state index.
JackTimer * TrySwitchState()
Tries to switch to the next state and returns the new current state (either the same as before if cas...