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.

251 lines
9.6KB

  1. /*
  2. Copyright (C) 2004-2008 Grame
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14. */
  15. #include "JackServer.h"
  16. #include "JackNotification.h"
  17. #include "JackLockedEngine.h"
  18. #include "JackRPCEngine.h"
  19. #include "JackMachServerChannel.h"
  20. #include "JackException.h"
  21. #include <assert.h>
  22. using namespace Jack;
  23. //-------------------
  24. // Client management
  25. //-------------------
  26. #define rpc_type kern_return_t // for astyle
  27. rpc_type server_rpc_jack_client_check(mach_port_t private_port, client_name_t name, client_name_t name_res, int protocol, int options, int* status, int* result)
  28. {
  29. jack_log("rpc_jack_client_check");
  30. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  31. assert(channel);
  32. channel->ClientCheck((char*)name, (char*)name_res, protocol, options, status, result);
  33. return KERN_SUCCESS;
  34. }
  35. rpc_type server_rpc_jack_client_open(mach_port_t server_port, client_name_t name, int pid, mach_port_t* private_port, int* shared_engine, int* shared_client, int* shared_graph, int* result)
  36. {
  37. jack_log("rpc_jack_client_open name = %s", name);
  38. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[server_port];
  39. assert(channel);
  40. channel->ClientOpen((char*)name, pid, private_port, shared_engine, shared_client, shared_graph, result);
  41. return KERN_SUCCESS;
  42. }
  43. rpc_type server_rpc_jack_client_close(mach_port_t private_port, int refnum, int* result)
  44. {
  45. jack_log("rpc_jack_client_close");
  46. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  47. assert(channel);
  48. channel->ClientClose(private_port, refnum);
  49. *result = 0;
  50. return KERN_SUCCESS;
  51. }
  52. rpc_type server_rpc_jack_client_activate(mach_port_t private_port, int refnum, int is_real_time, int* result)
  53. {
  54. jack_log("rpc_jack_client_activate");
  55. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  56. assert(channel);
  57. *result = channel->GetEngine()->ClientActivate(refnum, is_real_time);
  58. return KERN_SUCCESS;
  59. }
  60. rpc_type server_rpc_jack_client_deactivate(mach_port_t private_port, int refnum, int* result)
  61. {
  62. jack_log("rpc_jack_client_deactivate");
  63. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  64. assert(channel);
  65. *result = channel->GetEngine()->ClientDeactivate(refnum);
  66. return KERN_SUCCESS;
  67. }
  68. //-----------------
  69. // Port management
  70. //-----------------
  71. rpc_type server_rpc_jack_port_register(mach_port_t private_port, int refnum, client_port_name_t name, client_port_type_t type, unsigned int flags, unsigned int buffer_size, unsigned int* port_index, int* result)
  72. {
  73. jack_log("rpc_jack_port_register ref = %d name = %s", refnum, name);
  74. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  75. assert(channel);
  76. *result = channel->GetEngine()->PortRegister(refnum, name, type, flags, buffer_size, port_index);
  77. return KERN_SUCCESS;
  78. }
  79. rpc_type server_rpc_jack_port_unregister(mach_port_t private_port, int refnum, int port, int* result)
  80. {
  81. jack_log("rpc_jack_port_unregister ref = %d port = %d ", refnum, port);
  82. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  83. assert(channel);
  84. *result = channel->GetEngine()->PortUnRegister(refnum, port);
  85. return KERN_SUCCESS;
  86. }
  87. rpc_type server_rpc_jack_port_connect_name(mach_port_t private_port, int refnum, client_port_name_t src, client_port_name_t dst, int* result)
  88. {
  89. jack_log("rpc_jack_port_connect_name");
  90. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  91. assert(channel);
  92. *result = channel->GetEngine()->PortConnect(refnum, src, dst);
  93. return KERN_SUCCESS;
  94. }
  95. rpc_type server_rpc_jack_port_disconnect_name(mach_port_t private_port, int refnum, client_port_name_t src, client_port_name_t dst, int* result)
  96. {
  97. jack_log("rpc_jack_port_disconnect_name");
  98. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  99. assert(channel);
  100. *result = channel->GetEngine()->PortDisconnect(refnum, src, dst);
  101. return KERN_SUCCESS;
  102. }
  103. rpc_type server_rpc_jack_port_connect(mach_port_t private_port, int refnum, int src, int dst, int* result)
  104. {
  105. jack_log("rpc_jack_port_connect");
  106. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  107. assert(channel);
  108. *result = channel->GetEngine()->PortConnect(refnum, src, dst);
  109. return KERN_SUCCESS;
  110. }
  111. rpc_type server_rpc_jack_port_disconnect(mach_port_t private_port, int refnum, int src, int dst, int* result)
  112. {
  113. jack_log("rpc_jack_port_disconnect");
  114. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  115. assert(channel);
  116. *result = channel->GetEngine()->PortDisconnect(refnum, src, dst);
  117. return KERN_SUCCESS;
  118. }
  119. rpc_type server_rpc_jack_port_rename(mach_port_t private_port, int refnum, int port, client_port_name_t name, int* result)
  120. {
  121. jack_log("server_rpc_jack_port_rename");
  122. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  123. assert(channel);
  124. *result = channel->GetEngine()->PortRename(refnum, port, name);
  125. return KERN_SUCCESS;
  126. }
  127. //------------------------
  128. // Buffer size, freewheel
  129. //------------------------
  130. rpc_type server_rpc_jack_set_buffer_size(mach_port_t private_port, int buffer_size, int* result)
  131. {
  132. jack_log("server_rpc_jack_set_buffer_size");
  133. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  134. assert(channel);
  135. *result = channel->GetServer()->SetBufferSize(buffer_size);
  136. return KERN_SUCCESS;
  137. }
  138. rpc_type server_rpc_jack_set_freewheel(mach_port_t private_port, int onoff, int* result)
  139. {
  140. jack_log("server_rpc_jack_set_freewheel");
  141. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  142. assert(channel);
  143. *result = channel->GetServer()->SetFreewheel(onoff);
  144. return KERN_SUCCESS;
  145. }
  146. //----------------------
  147. // Transport management
  148. //----------------------
  149. rpc_type server_rpc_jack_release_timebase(mach_port_t private_port, int refnum, int* result)
  150. {
  151. jack_log("server_rpc_jack_release_timebase");
  152. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  153. assert(channel);
  154. *result = channel->GetServer()->ReleaseTimebase(refnum);
  155. return KERN_SUCCESS;
  156. }
  157. rpc_type server_rpc_jack_set_timebase_callback(mach_port_t private_port, int refnum, int conditional, int* result)
  158. {
  159. jack_log("server_rpc_jack_set_timebase_callback");
  160. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  161. assert(channel);
  162. *result = channel->GetServer()->SetTimebaseCallback(refnum, conditional);
  163. return KERN_SUCCESS;
  164. }
  165. //------------------
  166. // Internal clients
  167. //------------------
  168. rpc_type server_rpc_jack_get_internal_clientname(mach_port_t private_port, int refnum, int int_ref, client_name_t name_res, int* result)
  169. {
  170. jack_log("server_rpc_jack_get_internal_clientname");
  171. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  172. assert(channel);
  173. *result = channel->GetServer()->GetEngine()->GetInternalClientName(int_ref, (char*)name_res);
  174. return KERN_SUCCESS;
  175. }
  176. rpc_type server_rpc_jack_internal_clienthandle(mach_port_t private_port, int refnum, client_name_t client_name, int* status, int* int_ref, int* result)
  177. {
  178. jack_log("server_rpc_jack_internal_clienthandle");
  179. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  180. assert(channel);
  181. *result = channel->GetServer()->GetEngine()->InternalClientHandle(client_name, status, int_ref);
  182. return KERN_SUCCESS;
  183. }
  184. rpc_type server_rpc_jack_internal_clientload(mach_port_t private_port, int refnum, client_name_t client_name, so_name_t so_name, objet_data_t objet_data, int options, int* status, int* int_ref, int* result)
  185. {
  186. jack_log("server_rpc_jack_internal_clientload");
  187. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  188. assert(channel);
  189. *result = channel->GetServer()->InternalClientLoad(client_name, so_name, objet_data, options, int_ref, status);
  190. return KERN_SUCCESS;
  191. }
  192. rpc_type server_rpc_jack_internal_clientunload(mach_port_t private_port, int refnum, int int_ref, int* status, int* result)
  193. {
  194. jack_log("server_rpc_jack_internal_clientunload");
  195. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  196. assert(channel);
  197. *result = channel->GetServer()->GetEngine()->InternalClientUnload(int_ref, status);
  198. return KERN_SUCCESS;
  199. }
  200. //-----------------
  201. // RT notification
  202. //-----------------
  203. rpc_type server_rpc_jack_client_rt_notify(mach_port_t server_port, int refnum, int notify, int value)
  204. {
  205. jack_log("rpc_jack_client_rt_notify ref = %d notify = %d value = %d", refnum, notify, value);
  206. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[server_port];
  207. assert(channel);
  208. assert(channel->GetServer());
  209. if (notify == kQUIT) {
  210. throw JackQuitException();
  211. } else {
  212. channel->GetServer()->Notify(refnum, notify, value);
  213. return KERN_SUCCESS;
  214. }
  215. }