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 General Public License as published by 00007 the Free Software Foundation; either version 2 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 General Public License for more details. 00014 00015 You should have received a copy of the GNU General Public License 00016 along with this program; if not, write to the Free Software 00017 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 00019 */ 00020 00021 #ifndef __JackFrameTimer__ 00022 #define __JackFrameTimer__ 00023 00024 #include "JackAtomicState.h" 00025 #include "types.h" 00026 00027 namespace Jack 00028 { 00029 00034 struct JackTimer 00035 { 00036 jack_nframes_t fFrames; 00037 jack_time_t fCurrentWakeup; 00038 jack_time_t fCurrentCallback; 00039 jack_time_t fNextWakeUp; 00040 float fSecondOrderIntegrator; 00041 bool fInitialized; 00042 00043 /* not accessed by clients */ 00044 00045 float fFilterCoefficient; /* set once, never altered */ 00046 00047 JackTimer(); 00048 ~JackTimer() 00049 {} 00050 00051 }; 00052 00057 class JackFrameTimer : public JackAtomicState<JackTimer> 00058 { 00059 private: 00060 00061 bool fFirstWakeUp; 00062 void IncFrameTimeAux(jack_nframes_t nframes, jack_time_t callback_usecs, jack_time_t period_usecs); 00063 void InitFrameTimeAux(jack_time_t callback_usecs, jack_time_t period_usecs); 00064 00065 public: 00066 00067 JackFrameTimer(): fFirstWakeUp(true) 00068 {} 00069 ~JackFrameTimer() 00070 {} 00071 00072 void InitFrameTime(); 00073 void ResetFrameTime(jack_nframes_t frames_rate, jack_time_t callback_usecs, jack_time_t period_usecs); 00074 void IncFrameTime(jack_nframes_t nframes, jack_time_t callback_usecs, jack_time_t period_usecs); 00075 void ReadFrameTime(JackTimer* timer); 00076 }; 00077 00078 00079 } // end of namespace 00080 00081 #endif