Jack2 1.9.10

JackFrameTimer.h

00001 /*
00002 Copyright (C) 2001 Paul Davis
00003 Copyright (C) 2004-2008 Grame
00004 
00005 This program is free software; you can redistribute it and/or modify
00006 it under the terms of the GNU Lesser General Public License as published by
00007 the Free Software Foundation; either version 2.1 of the License, or
00008 (at your option) any later version.
00009 
00010 This program is distributed in the hope that it will be useful,
00011 but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 GNU Lesser General Public License for more details.
00014 
00015 You should have received a copy of the GNU Lesser General Public License
00016 along with this program; if not, write to the Free Software
00017 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00018 
00019 */
00020 
00021 #ifndef __JackFrameTimer__
00022 #define __JackFrameTimer__
00023 
00024 #include "JackAtomicState.h"
00025 #include "JackCompilerDeps.h"
00026 #include "types.h"
00027 
00028 namespace Jack
00029 {
00030 
00035 PRE_PACKED_STRUCTURE
00036 class SERVER_EXPORT JackTimer
00037 {
00038 
00039     friend class JackFrameTimer;
00040 
00041     private:
00042 
00043         jack_nframes_t fFrames;
00044         jack_time_t     fCurrentWakeup;
00045         jack_time_t     fCurrentCallback;
00046         jack_time_t     fNextWakeUp;
00047         float fPeriodUsecs;
00048         float fFilterOmega; /* set once, never altered */
00049         bool fInitialized;
00050 
00051     public:
00052 
00053         JackTimer();
00054         ~JackTimer()
00055         {}
00056 
00057         jack_nframes_t Time2Frames(jack_time_t time, jack_nframes_t buffer_size);
00058         jack_time_t Frames2Time(jack_nframes_t frames, jack_nframes_t buffer_size);
00059         jack_nframes_t FramesSinceCycleStart(jack_time_t cur_time, jack_nframes_t frames_rate);
00060         int GetCycleTimes(jack_nframes_t* current_frames, jack_time_t* current_usecs, jack_time_t* next_usecs, float* period_usecs);
00061 
00062         jack_nframes_t CurFrame()
00063         {
00064             return fFrames;
00065         }
00066 
00067         jack_time_t CurTime()
00068         {
00069             return fCurrentWakeup;
00070         }
00071 
00072 } POST_PACKED_STRUCTURE;
00073 
00078 PRE_PACKED_STRUCTURE
00079 class SERVER_EXPORT JackFrameTimer : public JackAtomicState<JackTimer>
00080 {
00081 
00082     private:
00083 
00084         bool fFirstWakeUp;
00085         void IncFrameTimeAux(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs);
00086         void InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t period_usecs);
00087 
00088     public:
00089 
00090         JackFrameTimer(): fFirstWakeUp(true)
00091         {}
00092         ~JackFrameTimer()
00093         {}
00094 
00095         void InitFrameTime();
00096         void ResetFrameTime(jack_time_t callback_usecs);
00097         void IncFrameTime(jack_nframes_t buffer_size, jack_time_t callback_usecs, jack_time_t period_usecs);
00098         void ReadFrameTime(JackTimer* timer);
00099 
00100 } POST_PACKED_STRUCTURE;
00101 
00102 
00103 } // end of namespace
00104 
00105 #endif