Jack2  1.9.8
JackClient.h
1 /*
2 Copyright (C) 2001 Paul Davis
3 Copyright (C) 2004-2008 Grame
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
14 
15 You should have received a copy of the GNU Lesser General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 
19 */
20 
21 #ifndef __JackClient__
22 #define __JackClient__
23 
24 #include "JackClientInterface.h"
25 #include "JackThread.h"
26 #include "JackConstants.h"
27 #include "JackSynchro.h"
28 #include "JackPlatformPlug.h"
29 #include "JackChannel.h"
30 #include "varargs.h"
31 #include <list>
32 
33 namespace Jack
34 {
35 
36 class JackGraphManager;
37 class JackServer;
38 class JackEngine;
39 struct JackClientControl;
40 struct JackEngineControl;
41 
46 class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnableInterface
47 {
48  friend class JackDebugClient;
49 
50  protected:
51 
52  JackProcessCallback fProcess;
53  JackGraphOrderCallback fGraphOrder;
54  JackXRunCallback fXrun;
55  JackShutdownCallback fShutdown;
56  JackInfoShutdownCallback fInfoShutdown;
57  JackThreadInitCallback fInit;
58  JackBufferSizeCallback fBufferSize;
59  JackSampleRateCallback fSampleRate;
60  JackClientRegistrationCallback fClientRegistration;
61  JackFreewheelCallback fFreewheel;
62  JackPortRegistrationCallback fPortRegistration;
63  JackPortConnectCallback fPortConnect;
64  JackPortRenameCallback fPortRename;
65  JackTimebaseCallback fTimebase;
66  JackSyncCallback fSync;
67  JackThreadCallback fThreadFun;
68  JackSessionCallback fSession;
69  JackLatencyCallback fLatency;
70 
71  void* fProcessArg;
72  void* fGraphOrderArg;
73  void* fXrunArg;
74  void* fShutdownArg;
75  void* fInfoShutdownArg;
76  void* fInitArg;
77  void* fBufferSizeArg;
78  void* fSampleRateArg;
79  void* fClientRegistrationArg;
80  void* fFreewheelArg;
81  void* fPortRegistrationArg;
82  void* fPortConnectArg;
83  void* fPortRenameArg;
84  void* fTimebaseArg;
85  void* fSyncArg;
86  void* fThreadFunArg;
87  void* fSessionArg;
88  void* fLatencyArg;
89  char fServerName[64];
90 
91  JackThread fThread;
93  JackSynchro* fSynchroTable;
94  std::list<jack_port_id_t> fPortList;
95 
96  JackSessionReply fSessionReply;
97 
98  int StartThread();
99  void SetupDriverSync(bool freewheel);
100  bool IsActive();
101 
102  void CallSyncCallback();
103  void CallTimebaseCallback();
104 
105  virtual int ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value);
106 
107  inline void DummyCycle();
108  inline void ExecuteThread();
109  inline bool WaitSync();
110  inline void SignalSync();
111  inline int CallProcessCallback();
112  inline void End();
113  inline void Error();
114  inline jack_nframes_t CycleWaitAux();
115  inline void CycleSignalAux(int status);
116  inline void CallSyncCallbackAux();
117  inline void CallTimebaseCallbackAux();
118  inline int ActivateAux();
119  inline void InitAux();
120 
121  int HandleLatencyCallback(int status);
122 
123  public:
124 
125  JackClient();
126  JackClient(JackSynchro* table);
127  virtual ~JackClient();
128 
129  virtual int Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status) = 0;
130  virtual int Close();
131 
132  virtual JackGraphManager* GetGraphManager() const = 0;
133  virtual JackEngineControl* GetEngineControl() const = 0;
134 
135  // Notifications
136  virtual int ClientNotify(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2);
137 
138  virtual int Activate();
139  virtual int Deactivate();
140 
141  // Context
142  virtual int SetBufferSize(jack_nframes_t buffer_size);
143  virtual int SetFreeWheel(int onoff);
144  virtual int ComputeTotalLatencies();
145  virtual void ShutDown();
146  virtual jack_native_thread_t GetThreadID();
147 
148  // Port management
149  virtual int PortRegister(const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size);
150  virtual int PortUnRegister(jack_port_id_t port);
151 
152  virtual int PortConnect(const char* src, const char* dst);
153  virtual int PortDisconnect(const char* src, const char* dst);
154  virtual int PortDisconnect(jack_port_id_t src);
155 
156  virtual int PortIsMine(jack_port_id_t port_index);
157  virtual int PortRename(jack_port_id_t port_index, const char* name);
158 
159  // Transport
160  virtual int ReleaseTimebase();
161  virtual int SetSyncCallback(JackSyncCallback sync_callback, void* arg);
162  virtual int SetSyncTimeout(jack_time_t timeout);
163  virtual int SetTimebaseCallback(int conditional, JackTimebaseCallback timebase_callback, void* arg);
164  virtual void TransportLocate(jack_nframes_t frame);
165  virtual jack_transport_state_t TransportQuery(jack_position_t* pos);
166  virtual jack_nframes_t GetCurrentTransportFrame();
167  virtual int TransportReposition(const jack_position_t* pos);
168  virtual void TransportStart();
169  virtual void TransportStop();
170 
171  // Callbacks
172  virtual void OnShutdown(JackShutdownCallback callback, void *arg);
173  virtual void OnInfoShutdown(JackInfoShutdownCallback callback, void *arg);
174  virtual int SetProcessCallback(JackProcessCallback callback, void* arg);
175  virtual int SetXRunCallback(JackXRunCallback callback, void* arg);
176  virtual int SetInitCallback(JackThreadInitCallback callback, void* arg);
177  virtual int SetGraphOrderCallback(JackGraphOrderCallback callback, void* arg);
178  virtual int SetBufferSizeCallback(JackBufferSizeCallback callback, void* arg);
179  virtual int SetSampleRateCallback(JackBufferSizeCallback callback, void* arg);
180  virtual int SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg);
181  virtual int SetFreewheelCallback(JackFreewheelCallback callback, void* arg);
182  virtual int SetPortRegistrationCallback(JackPortRegistrationCallback callback, void* arg);
183  virtual int SetPortConnectCallback(JackPortConnectCallback callback, void *arg);
184  virtual int SetPortRenameCallback(JackPortRenameCallback callback, void *arg);
185  virtual int SetSessionCallback(JackSessionCallback callback, void *arg);
186  virtual int SetLatencyCallback(JackLatencyCallback callback, void *arg);
187 
188  // Internal clients
189  virtual char* GetInternalClientName(int ref);
190  virtual int InternalClientHandle(const char* client_name, jack_status_t* status);
191  virtual int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va);
192  virtual void InternalClientUnload(int ref, jack_status_t* status);
193 
194  // RT Thread
195  jack_nframes_t CycleWait();
196  void CycleSignal(int status);
197  virtual int SetProcessThread(JackThreadCallback fun, void *arg);
198 
199  // Session API
200  virtual jack_session_command_t* SessionNotify(const char* target, jack_session_event_type_t type, const char* path);
201  virtual int SessionReply(jack_session_event_t* ev);
202  virtual char* GetUUIDForClientName(const char* client_name);
203  virtual char* GetClientNameByUUID(const char* uuid);
204  virtual int ReserveClientName(const char* client_name, const char* uuid);
205  virtual int ClientHasSessionCallback(const char* client_name);
206 
207  // JackRunnableInterface interface
208  bool Init();
209  bool Execute();
210 };
211 
212 } // end of namespace
213 
214 #endif