00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __JackTransportEngine__
00022 #define __JackTransportEngine__
00023
00024 #include "JackAtomicArrayState.h"
00025 #include "JackCompilerDeps.h"
00026 #include "types.h"
00027
00028 namespace Jack
00029 {
00030
00031 typedef enum {
00032 TransportCommandNone = 0,
00033 TransportCommandStart = 1,
00034 TransportCommandStop = 2,
00035 } transport_command_t;
00036
00090 class JackClientInterface;
00091
00092 class SERVER_EXPORT JackTransportEngine : public JackAtomicArrayState<jack_position_t>
00093 {
00094
00095 private:
00096
00097 jack_transport_state_t fTransportState;
00098 volatile transport_command_t fTransportCmd;
00099 transport_command_t fPreviousCmd;
00100 jack_time_t fSyncTimeout;
00101 int fSyncTimeLeft;
00102 int fTimeBaseMaster;
00103 bool fPendingPos;
00104 bool fNetworkSync;
00105 bool fConditionnal;
00106 SInt32 fWriteCounter;
00107
00108 bool CheckAllRolling(JackClientInterface** table);
00109 void MakeAllStartingLocating(JackClientInterface** table);
00110 void MakeAllStopping(JackClientInterface** table);
00111 void MakeAllLocating(JackClientInterface** table);
00112
00113 void SyncTimeout(jack_nframes_t frame_rate, jack_nframes_t buffer_size);
00114
00115 public:
00116
00117 JackTransportEngine();
00118
00119 ~JackTransportEngine()
00120 {}
00121
00122 void SetCommand(transport_command_t state)
00123 {
00124 fTransportCmd = state;
00125 }
00126
00127 jack_transport_state_t GetState() const
00128 {
00129 return fTransportState;
00130 }
00131
00132 void SetState(jack_transport_state_t state)
00133 {
00134 fTransportState = state;
00135 }
00136
00137
00138
00139
00140 int ResetTimebase(int refnum);
00141
00142
00143
00144
00145 int SetTimebaseMaster(int refnum, bool conditionnal);
00146
00147 void GetTimebaseMaster(int& refnum, bool& conditionnal);
00148
00149
00150
00151
00152 void CycleBegin(jack_nframes_t frame_rate, jack_time_t time);
00153
00154
00155
00156
00157 void CycleEnd(JackClientInterface** table, jack_nframes_t frame_rate, jack_nframes_t buffer_size);
00158
00159
00160
00161
00162 void SetSyncTimeout(jack_time_t timeout)
00163 {
00164 fSyncTimeout = timeout;
00165 }
00166
00167 void ReadCurrentPos(jack_position_t* pos);
00168
00169 jack_unique_t GenerateUniqueID()
00170 {
00171 return (jack_unique_t)INC_ATOMIC(&fWriteCounter);
00172 }
00173
00174 void RequestNewPos(jack_position_t* pos);
00175
00176 jack_transport_state_t Query(jack_position_t* pos);
00177
00178 jack_nframes_t GetCurrentFrame();
00179
00180 static void CopyPosition(jack_position_t* from, jack_position_t* to);
00181
00182 bool GetNetworkSync() const
00183 {
00184 return fNetworkSync;
00185 }
00186
00187 void SetNetworkSync(bool sync)
00188 {
00189 fNetworkSync = sync;
00190 }
00191
00192 };
00193
00194
00195 }
00196
00197 #endif