Merge branch 'master' into develop
[jack2.git] / common / JackClient.h
bloba0e506e7d8948643e2f006975c86aaba2677041d
1 /*
2 Copyright (C) 2001 Paul Davis
3 Copyright (C) 2004-2008 Grame
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.
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.
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.
21 #ifndef __JackClient__
22 #define __JackClient__
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 "JackRequest.h"
31 #include "JackMetadata.h"
32 #include "varargs.h"
33 #include <list>
35 namespace Jack
38 class JackGraphManager;
39 class JackServer;
40 class JackEngine;
41 struct JackClientControl;
42 struct JackEngineControl;
44 /*!
45 \brief The base class for clients: share part of the implementation for JackInternalClient and JackLibClient.
48 class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnableInterface
50 friend class JackDebugClient;
52 protected:
54 JackProcessCallback fProcess;
55 JackGraphOrderCallback fGraphOrder;
56 JackXRunCallback fXrun;
57 JackShutdownCallback fShutdown;
58 JackInfoShutdownCallback fInfoShutdown;
59 JackThreadInitCallback fInit;
60 JackBufferSizeCallback fBufferSize;
61 JackSampleRateCallback fSampleRate;
62 JackClientRegistrationCallback fClientRegistration;
63 JackFreewheelCallback fFreewheel;
64 JackPortRegistrationCallback fPortRegistration;
65 JackPortConnectCallback fPortConnect;
66 JackPortRenameCallback fPortRename;
67 JackTimebaseCallback fTimebase;
68 JackSyncCallback fSync;
69 JackThreadCallback fThreadFun;
70 JackSessionCallback fSession;
71 JackLatencyCallback fLatency;
72 JackPropertyChangeCallback fPropertyChange;
74 void* fProcessArg;
75 void* fGraphOrderArg;
76 void* fXrunArg;
77 void* fShutdownArg;
78 void* fInfoShutdownArg;
79 void* fInitArg;
80 void* fBufferSizeArg;
81 void* fSampleRateArg;
82 void* fClientRegistrationArg;
83 void* fFreewheelArg;
84 void* fPortRegistrationArg;
85 void* fPortConnectArg;
86 void* fPortRenameArg;
87 void* fTimebaseArg;
88 void* fSyncArg;
89 void* fThreadFunArg;
90 void* fSessionArg;
91 void* fLatencyArg;
92 void* fPropertyChangeArg;
94 char fServerName[JACK_SERVER_NAME_SIZE+1];
96 JackThread fThread; /*! Thread to execute the Process function */
97 detail::JackClientChannelInterface* fChannel;
98 JackSynchro* fSynchroTable;
99 std::list<jack_port_id_t> fPortList;
101 JackSessionReply fSessionReply;
103 int StartThread();
104 void SetupDriverSync(bool freewheel);
105 bool IsActive();
107 void CallSyncCallback();
108 void CallTimebaseCallback();
110 virtual int ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value);
112 inline void DummyCycle();
113 inline void ExecuteThread();
114 inline bool WaitSync();
115 inline void SignalSync();
116 inline int CallProcessCallback();
117 inline void End();
118 inline void Error();
119 inline jack_nframes_t CycleWaitAux();
120 inline void CycleSignalAux(int status);
121 inline void CallSyncCallbackAux();
122 inline void CallTimebaseCallbackAux();
123 inline int ActivateAux();
124 inline void InitAux();
125 inline void SetupRealTime();
127 int HandleLatencyCallback(int status);
129 public:
131 JackClient(JackSynchro* table);
132 virtual ~JackClient();
134 char* GetServerName() { return fServerName; }
136 virtual int Open(const char* server_name, const char* name, jack_uuid_t uuid, jack_options_t options, jack_status_t* status) = 0;
137 virtual int Close();
139 virtual JackGraphManager* GetGraphManager() const = 0;
140 virtual JackEngineControl* GetEngineControl() const = 0;
142 // Notifications
143 virtual int ClientNotify(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2);
145 virtual int Activate();
146 virtual int Deactivate();
148 // Context
149 virtual int SetBufferSize(jack_nframes_t buffer_size);
150 virtual int SetFreeWheel(int onoff);
151 virtual int ComputeTotalLatencies();
152 virtual void ShutDown(jack_status_t code, const char* message);
153 virtual jack_native_thread_t GetThreadID();
155 // Port management
156 virtual int PortRegister(const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size);
157 virtual int PortUnRegister(jack_port_id_t port);
159 virtual int PortConnect(const char* src, const char* dst);
160 virtual int PortDisconnect(const char* src, const char* dst);
161 virtual int PortDisconnect(jack_port_id_t src);
163 virtual int PortIsMine(jack_port_id_t port_index);
164 virtual int PortRename(jack_port_id_t port_index, const char* name);
166 // Transport
167 virtual int ReleaseTimebase();
168 virtual int SetSyncCallback(JackSyncCallback sync_callback, void* arg);
169 virtual int SetSyncTimeout(jack_time_t timeout);
170 virtual int SetTimebaseCallback(int conditional, JackTimebaseCallback timebase_callback, void* arg);
171 virtual void TransportLocate(jack_nframes_t frame);
172 virtual jack_transport_state_t TransportQuery(jack_position_t* pos);
173 virtual jack_nframes_t GetCurrentTransportFrame();
174 virtual int TransportReposition(const jack_position_t* pos);
175 virtual void TransportStart();
176 virtual void TransportStop();
178 // Callbacks
179 virtual void OnShutdown(JackShutdownCallback callback, void *arg);
180 virtual void OnInfoShutdown(JackInfoShutdownCallback callback, void *arg);
181 virtual int SetProcessCallback(JackProcessCallback callback, void* arg);
182 virtual int SetXRunCallback(JackXRunCallback callback, void* arg);
183 virtual int SetInitCallback(JackThreadInitCallback callback, void* arg);
184 virtual int SetGraphOrderCallback(JackGraphOrderCallback callback, void* arg);
185 virtual int SetBufferSizeCallback(JackBufferSizeCallback callback, void* arg);
186 virtual int SetSampleRateCallback(JackBufferSizeCallback callback, void* arg);
187 virtual int SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg);
188 virtual int SetFreewheelCallback(JackFreewheelCallback callback, void* arg);
189 virtual int SetPortRegistrationCallback(JackPortRegistrationCallback callback, void* arg);
190 virtual int SetPortConnectCallback(JackPortConnectCallback callback, void *arg);
191 virtual int SetPortRenameCallback(JackPortRenameCallback callback, void *arg);
192 virtual int SetSessionCallback(JackSessionCallback callback, void *arg);
193 virtual int SetLatencyCallback(JackLatencyCallback callback, void *arg);
194 virtual int SetPropertyChangeCallback(JackPropertyChangeCallback callback, void* arg);
196 // Internal clients
197 virtual char* GetInternalClientName(int ref);
198 virtual int InternalClientHandle(const char* client_name, jack_status_t* status);
199 virtual int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va);
200 virtual void InternalClientUnload(int ref, jack_status_t* status);
202 // RT Thread
203 jack_nframes_t CycleWait();
204 void CycleSignal(int status);
205 virtual int SetProcessThread(JackThreadCallback fun, void *arg);
207 // Session API
208 virtual jack_session_command_t* SessionNotify(const char* target, jack_session_event_type_t type, const char* path);
209 virtual int SessionReply(jack_session_event_t* ev);
210 virtual char* GetUUIDForClientName(const char* client_name);
211 virtual char* GetClientNameByUUID(const char* uuid);
212 virtual int ReserveClientName(const char* client_name, const char* uuid);
213 virtual int ClientHasSessionCallback(const char* client_name);
215 // Metadata API
216 virtual int PropertyChangeNotify(jack_uuid_t subject, const char* key, jack_property_change_t change);
218 // JackRunnableInterface interface
219 bool Init();
220 bool Execute();
223 } // end of namespace
225 #endif