jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
7.3KB

  1. /*
  2. Copyright (C) 2001 Paul Davis
  3. Copyright (C) 2004-2008 Grame
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 2.1 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. #ifndef __JackClient__
  17. #define __JackClient__
  18. #include "JackClientInterface.h"
  19. #include "JackThread.h"
  20. #include "JackConstants.h"
  21. #include "JackSynchro.h"
  22. #include "JackPlatformPlug.h"
  23. #include "JackChannel.h"
  24. #include "types.h"
  25. #include "varargs.h"
  26. #include <list>
  27. namespace Jack
  28. {
  29. class JackGraphManager;
  30. class JackServer;
  31. class JackEngine;
  32. struct JackClientControl;
  33. struct JackEngineControl;
  34. typedef void (*JackShutdownCallback)(void *arg);
  35. /*!
  36. \brief The base class for clients: share part of the implementation for JackInternalClient and JackLibClient.
  37. */
  38. class JackClient : public JackClientInterface, public JackRunnableInterface
  39. {
  40. friend class JackDebugClient;
  41. protected:
  42. JackProcessCallback fProcess;
  43. JackGraphOrderCallback fGraphOrder;
  44. JackXRunCallback fXrun;
  45. JackShutdownCallback fShutdown;
  46. JackThreadInitCallback fInit;
  47. JackBufferSizeCallback fBufferSize;
  48. JackSampleRateCallback fSampleRate;
  49. JackClientRegistrationCallback fClientRegistration;
  50. JackFreewheelCallback fFreewheel;
  51. JackPortRegistrationCallback fPortRegistration;
  52. JackPortConnectCallback fPortConnect;
  53. JackPortRenameCallback fPortRename;
  54. JackTimebaseCallback fTimebase;
  55. JackSyncCallback fSync;
  56. JackThreadCallback fThreadFun;
  57. void* fProcessArg;
  58. void* fGraphOrderArg;
  59. void* fXrunArg;
  60. void* fShutdownArg;
  61. void* fInitArg;
  62. void* fBufferSizeArg;
  63. void* fSampleRateArg;
  64. void* fClientRegistrationArg;
  65. void* fFreewheelArg;
  66. void* fPortRegistrationArg;
  67. void* fPortConnectArg;
  68. void* fPortRenameArg;
  69. void* fTimebaseArg;
  70. void* fSyncArg;
  71. void* fThreadFunArg;
  72. char fServerName[64];
  73. JackThread fThread; /*! Thread to execute the Process function */
  74. detail::JackClientChannelInterface* fChannel;
  75. JackSynchro* fSynchroTable;
  76. std::list<jack_port_id_t> fPortList;
  77. bool fServerRunning;
  78. int StartThread();
  79. void SetupDriverSync(bool freewheel);
  80. bool IsActive();
  81. void CallSyncCallback();
  82. void CallTimebaseCallback();
  83. virtual int ClientNotifyImp(int refnum, const char* name, int notify, int sync, int value1, int value);
  84. // Fons Adriaensen thread model
  85. inline bool WaitFirstSync();
  86. inline void ExecuteThread();
  87. inline bool WaitSync();
  88. inline void SignalSync();
  89. inline int CallProcessCallback();
  90. inline int End();
  91. inline int Error();
  92. public:
  93. JackClient();
  94. JackClient(JackSynchro* table);
  95. virtual ~JackClient();
  96. virtual int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) = 0;
  97. virtual int Close();
  98. virtual JackGraphManager* GetGraphManager() const = 0;
  99. virtual JackEngineControl* GetEngineControl() const = 0;
  100. // Notifications
  101. virtual int ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2);
  102. virtual int Activate();
  103. virtual int Deactivate();
  104. // Context
  105. virtual int SetBufferSize(jack_nframes_t buffer_size);
  106. virtual int SetFreeWheel(int onoff);
  107. virtual void ShutDown();
  108. virtual pthread_t GetThreadID();
  109. // Port management
  110. virtual int PortRegister(const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size);
  111. virtual int PortUnRegister(jack_port_id_t port);
  112. virtual int PortConnect(const char* src, const char* dst);
  113. virtual int PortDisconnect(const char* src, const char* dst);
  114. virtual int PortDisconnect(jack_port_id_t src);
  115. virtual int PortIsMine(jack_port_id_t port_index);
  116. virtual int PortRename(jack_port_id_t port_index, const char* name);
  117. // Transport
  118. virtual int ReleaseTimebase();
  119. virtual int SetSyncCallback(JackSyncCallback sync_callback, void* arg);
  120. virtual int SetSyncTimeout(jack_time_t timeout);
  121. virtual int SetTimebaseCallback(int conditional, JackTimebaseCallback timebase_callback, void* arg);
  122. virtual void TransportLocate(jack_nframes_t frame);
  123. virtual jack_transport_state_t TransportQuery(jack_position_t* pos);
  124. virtual jack_nframes_t GetCurrentTransportFrame();
  125. virtual int TransportReposition(jack_position_t* pos);
  126. virtual void TransportStart();
  127. virtual void TransportStop();
  128. // Callbacks
  129. virtual void OnShutdown(JackShutdownCallback callback, void *arg);
  130. virtual int SetProcessCallback(JackProcessCallback callback, void* arg);
  131. virtual int SetXRunCallback(JackXRunCallback callback, void* arg);
  132. virtual int SetInitCallback(JackThreadInitCallback callback, void* arg);
  133. virtual int SetGraphOrderCallback(JackGraphOrderCallback callback, void* arg);
  134. virtual int SetBufferSizeCallback(JackBufferSizeCallback callback, void* arg);
  135. virtual int SetSampleRateCallback(JackBufferSizeCallback callback, void* arg);
  136. virtual int SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg);
  137. virtual int SetFreewheelCallback(JackFreewheelCallback callback, void* arg);
  138. virtual int SetPortRegistrationCallback(JackPortRegistrationCallback callback, void* arg);
  139. virtual int SetPortConnectCallback(JackPortConnectCallback callback, void *arg);
  140. virtual int SetPortRenameCallback(JackPortRenameCallback callback, void *arg);
  141. // Internal clients
  142. virtual char* GetInternalClientName(int ref);
  143. virtual int InternalClientHandle(const char* client_name, jack_status_t* status);
  144. virtual int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va);
  145. virtual void InternalClientUnload(int ref, jack_status_t* status);
  146. // Fons Adriaensen thread model
  147. virtual jack_nframes_t Wait(int status);
  148. virtual jack_nframes_t CycleWait();
  149. void CycleSignal(int status);
  150. int SetProcessThread(JackThreadCallback fun, void *arg);
  151. // JackRunnableInterface interface
  152. bool Init();
  153. bool Execute();
  154. static JackClient* fClientTable[CLIENT_NUM];
  155. };
  156. // Each "side" server and client will implement this to get the shared graph manager, engine control and inter-process synchro table.
  157. extern JackGraphManager* GetGraphManager();
  158. extern JackEngineControl* GetEngineControl();
  159. extern JackSynchro* GetSynchroTable();
  160. } // end of namespace
  161. #endif