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.

239 lines
9.1KB

  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. #if defined(HAVE_CONFIG_H)
  16. #include "config.h"
  17. #endif
  18. #include "JackServer.h"
  19. #include "JackEngine.h"
  20. #include "JackRPCEngine.h"
  21. #include "JackMachServerChannel.h"
  22. #include <assert.h>
  23. using namespace Jack;
  24. //-------------------
  25. // Client management
  26. //-------------------
  27. #define rpc_type kern_return_t // for astyle
  28. 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)
  29. {
  30. jack_log("rpc_jack_client_check");
  31. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  32. assert(channel);
  33. channel->ClientCheck((char*)name, (char*)name_res, protocol, options, status, result);
  34. return KERN_SUCCESS;
  35. }
  36. 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)
  37. {
  38. jack_log("rpc_jack_client_new %s", name);
  39. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[server_port];
  40. assert(channel);
  41. channel->ClientOpen((char*)name, pid, private_port, shared_engine, shared_client, shared_graph, result);
  42. return KERN_SUCCESS;
  43. }
  44. rpc_type server_rpc_jack_client_close(mach_port_t private_port, int refnum, int* result)
  45. {
  46. jack_log("rpc_jack_client_close");
  47. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  48. assert(channel);
  49. channel->ClientClose(private_port, refnum);
  50. *result = 0;
  51. return KERN_SUCCESS;
  52. }
  53. rpc_type server_rpc_jack_client_activate(mach_port_t private_port, int refnum, int state, int* result)
  54. {
  55. jack_log("rpc_jack_client_activate");
  56. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  57. assert(channel);
  58. *result = channel->GetEngine()->ClientActivate(refnum, state);
  59. return KERN_SUCCESS;
  60. }
  61. rpc_type server_rpc_jack_client_deactivate(mach_port_t private_port, int refnum, int* result)
  62. {
  63. jack_log("rpc_jack_client_deactivate");
  64. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  65. assert(channel);
  66. *result = channel->GetEngine()->ClientDeactivate(refnum);
  67. return KERN_SUCCESS;
  68. }
  69. //-----------------
  70. // Port management
  71. //-----------------
  72. 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)
  73. {
  74. jack_log("rpc_jack_port_register %ld %s", refnum, name);
  75. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  76. assert(channel);
  77. *result = channel->GetEngine()->PortRegister(refnum, name, type, flags, buffer_size, port_index);
  78. return KERN_SUCCESS;
  79. }
  80. rpc_type server_rpc_jack_port_unregister(mach_port_t private_port, int refnum, int port, int* result)
  81. {
  82. jack_log("rpc_jack_port_unregister %ld %ld ", refnum, port);
  83. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  84. assert(channel);
  85. *result = channel->GetEngine()->PortUnRegister(refnum, port);
  86. return KERN_SUCCESS;
  87. }
  88. 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)
  89. {
  90. jack_log("rpc_jack_port_connect_name");
  91. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  92. assert(channel);
  93. *result = channel->GetEngine()->PortConnect(refnum, src, dst);
  94. return KERN_SUCCESS;
  95. }
  96. 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)
  97. {
  98. jack_log("rpc_jack_port_disconnect_name");
  99. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  100. assert(channel);
  101. *result = channel->GetEngine()->PortDisconnect(refnum, src, dst);
  102. return KERN_SUCCESS;
  103. }
  104. rpc_type server_rpc_jack_port_connect(mach_port_t private_port, int refnum, int src, int dst, int* result)
  105. {
  106. jack_log("rpc_jack_port_connect");
  107. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  108. assert(channel);
  109. *result = channel->GetEngine()->PortConnect(refnum, src, dst);
  110. return KERN_SUCCESS;
  111. }
  112. rpc_type server_rpc_jack_port_disconnect(mach_port_t private_port, int refnum, int src, int dst, int* result)
  113. {
  114. jack_log("rpc_jack_port_disconnect");
  115. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  116. assert(channel);
  117. *result = channel->GetEngine()->PortDisconnect(refnum, src, dst);
  118. return KERN_SUCCESS;
  119. }
  120. //------------------------
  121. // Buffer size, freewheel
  122. //------------------------
  123. rpc_type server_rpc_jack_set_buffer_size(mach_port_t private_port, int buffer_size, int* result)
  124. {
  125. jack_log("server_rpc_jack_set_buffer_size");
  126. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  127. assert(channel);
  128. *result = channel->GetServer()->SetBufferSize(buffer_size);
  129. return KERN_SUCCESS;
  130. }
  131. rpc_type server_rpc_jack_set_freewheel(mach_port_t private_port, int onoff, int* result)
  132. {
  133. jack_log("server_rpc_jack_set_freewheel");
  134. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  135. assert(channel);
  136. *result = channel->GetServer()->SetFreewheel(onoff);
  137. return KERN_SUCCESS;
  138. }
  139. //----------------------
  140. // Transport management
  141. //----------------------
  142. rpc_type server_rpc_jack_release_timebase(mach_port_t private_port, int refnum, int* result)
  143. {
  144. jack_log("server_rpc_jack_release_timebase");
  145. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  146. assert(channel);
  147. *result = channel->GetServer()->ReleaseTimebase(refnum);
  148. return KERN_SUCCESS;
  149. }
  150. rpc_type server_rpc_jack_set_timebase_callback(mach_port_t private_port, int refnum, int conditional, int* result)
  151. {
  152. jack_log("server_rpc_jack_set_timebase_callback");
  153. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  154. assert(channel);
  155. *result = channel->GetServer()->SetTimebaseCallback(refnum, conditional);
  156. return KERN_SUCCESS;
  157. }
  158. //------------------
  159. // Internal clients
  160. //------------------
  161. 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)
  162. {
  163. jack_log("server_rpc_jack_get_internal_clientname");
  164. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  165. assert(channel);
  166. *result = channel->GetServer()->GetEngine()->GetInternalClientName(int_ref, (char*)name_res);
  167. return KERN_SUCCESS;
  168. }
  169. 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)
  170. {
  171. jack_log("server_rpc_jack_internal_clienthandle");
  172. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  173. assert(channel);
  174. *result = channel->GetServer()->GetEngine()->InternalClientHandle(client_name, status, int_ref);
  175. return KERN_SUCCESS;
  176. }
  177. 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)
  178. {
  179. jack_log("server_rpc_jack_internal_clientload");
  180. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  181. assert(channel);
  182. *result = channel->GetServer()->InternalClientLoad(client_name, so_name, objet_data, options, int_ref, status);
  183. return KERN_SUCCESS;
  184. }
  185. rpc_type server_rpc_jack_internal_clientunload(mach_port_t private_port, int refnum, int int_ref, int* status, int* result)
  186. {
  187. jack_log("server_rpc_jack_internal_clientunload");
  188. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port];
  189. assert(channel);
  190. *result = channel->GetServer()->GetEngine()->InternalClientUnload(int_ref, status);
  191. return KERN_SUCCESS;
  192. }
  193. //-----------------
  194. // RT notification
  195. //-----------------
  196. rpc_type server_rpc_jack_client_rt_notify(mach_port_t server_port, int refnum, int notify, int value)
  197. {
  198. jack_log("rpc_jack_client_rt_notify ref = %ld notify = %ld value = %ld", refnum, notify, value);
  199. JackMachServerChannel* channel = JackMachServerChannel::fPortTable[server_port];
  200. assert(channel);
  201. assert(channel->GetServer());
  202. channel->GetServer()->Notify(refnum, notify, value);
  203. return KERN_SUCCESS;
  204. }