00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __JackEngineControl__
00022 #define __JackEngineControl__
00023
00024 #include "JackShmMem.h"
00025 #include "JackFrameTimer.h"
00026 #include "JackTransportEngine.h"
00027 #include "JackConstants.h"
00028 #include "types.h"
00029 #include <stdio.h>
00030
00031 #ifdef JACK_MONITOR
00032 #include "JackEngineProfiling.h"
00033 #endif
00034
00035 namespace Jack
00036 {
00037
00038 class JackClientInterface;
00039 class JackGraphManager;
00040
00041 #define JACK_ENGINE_ROLLING_COUNT 32
00042 #define JACK_ENGINE_ROLLING_INTERVAL 1024
00043
00048 struct SERVER_EXPORT JackEngineControl : public JackShmMem
00049 {
00050
00051 jack_nframes_t fBufferSize;
00052 jack_nframes_t fSampleRate;
00053 bool fSyncMode;
00054 bool fTemporary;
00055 jack_time_t fPeriodUsecs;
00056 jack_time_t fTimeOutUsecs;
00057 float fMaxDelayedUsecs;
00058 float fXrunDelayedUsecs;
00059 bool fTimeOut;
00060 bool fRealTime;
00061 int fServerPriority;
00062 int fClientPriority;
00063 int fMaxClientPriority;
00064 char fServerName[64];
00065 JackTransportEngine fTransport;
00066 jack_timer_type_t fClockSource;
00067 int fDriverNum;
00068 bool fVerbose;
00069
00070
00071 jack_time_t fPrevCycleTime;
00072 jack_time_t fCurCycleTime;
00073 jack_time_t fSpareUsecs;
00074 jack_time_t fMaxUsecs;
00075 jack_time_t fRollingClientUsecs[JACK_ENGINE_ROLLING_COUNT];
00076 int fRollingClientUsecsCnt;
00077 int fRollingClientUsecsIndex;
00078 int fRollingInterval;
00079 float fCPULoad;
00080
00081
00082 UInt64 fPeriod;
00083 UInt64 fComputation;
00084 UInt64 fConstraint;
00085
00086
00087 JackFrameTimer fFrameTimer;
00088
00089 #ifdef JACK_MONITOR
00090 JackEngineProfiling fProfiler;
00091 #endif
00092
00093 JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, jack_timer_type_t clock, const char* server_name)
00094 {
00095 fBufferSize = 512;
00096 fSampleRate = 48000;
00097 fPeriodUsecs = jack_time_t(1000000.f / fSampleRate * fBufferSize);
00098 fSyncMode = sync;
00099 fTemporary = temporary;
00100 fTimeOut = (timeout > 0);
00101 fTimeOutUsecs = timeout * 1000;
00102 fRealTime = rt;
00103 fServerPriority = priority;
00104 fClientPriority = (rt) ? priority - 5 : 0;
00105 fMaxClientPriority = (rt) ? priority - 1 : 0;
00106 fVerbose = verbose;
00107 fPrevCycleTime = 0;
00108 fCurCycleTime = 0;
00109 fSpareUsecs = 0;
00110 fMaxUsecs = 0;
00111 ResetRollingUsecs();
00112 strncpy(fServerName, server_name, sizeof(fServerName));
00113 fPeriod = 0;
00114 fComputation = 0;
00115 fConstraint = 0;
00116 fMaxDelayedUsecs = 0.f;
00117 fXrunDelayedUsecs = 0.f;
00118 fClockSource = clock;
00119 fDriverNum = 0;
00120 }
00121
00122 ~JackEngineControl()
00123 {}
00124
00125
00126 void CycleIncTime(jack_time_t callback_usecs)
00127 {
00128
00129 fFrameTimer.IncFrameTime(fBufferSize, callback_usecs, fPeriodUsecs);
00130 }
00131
00132 void CycleBegin(JackClientInterface** table, JackGraphManager* manager, jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end)
00133 {
00134 fTransport.CycleBegin(fSampleRate, cur_cycle_begin);
00135 CalcCPULoad(table, manager, cur_cycle_begin, prev_cycle_end);
00136 #ifdef JACK_MONITOR
00137 fProfiler.Profile(table, manager, fPeriodUsecs, cur_cycle_begin, prev_cycle_end);
00138 #endif
00139 }
00140
00141 void CycleEnd(JackClientInterface** table)
00142 {
00143 fTransport.CycleEnd(table, fSampleRate, fBufferSize);
00144 }
00145
00146
00147 void InitFrameTime()
00148 {
00149 fFrameTimer.InitFrameTime();
00150 }
00151
00152 void ResetFrameTime(jack_time_t callback_usecs)
00153 {
00154 fFrameTimer.ResetFrameTime(fSampleRate, callback_usecs, fPeriodUsecs);
00155 }
00156
00157 void ReadFrameTime(JackTimer* timer)
00158 {
00159 fFrameTimer.ReadFrameTime(timer);
00160 }
00161
00162
00163 void NotifyXRun(float delayed_usecs);
00164 void ResetXRun()
00165 {
00166 fMaxDelayedUsecs = 0.f;
00167 }
00168
00169
00170 void CalcCPULoad(JackClientInterface** table, JackGraphManager* manager, jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end);
00171 void ResetRollingUsecs();
00172
00173 } POST_PACKED_STRUCTURE;
00174
00175 }
00176
00177 #endif