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.

1272 lines
57KB

  1. /*
  2. Copyright (C) 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 "types.h"
  16. #include "jack.h"
  17. #include "JackExports.h"
  18. #include <dlfcn.h>
  19. #include <stdarg.h>
  20. #include <stdio.h>
  21. #include <dirent.h>
  22. #include <string.h>
  23. #ifdef __cplusplus
  24. extern "C"
  25. {
  26. #endif
  27. EXPORT int jack_client_name_size (void);
  28. EXPORT char* jack_get_client_name (jack_client_t *client);
  29. EXPORT int jack_internal_client_new (const char *client_name, // deprecated
  30. const char *load_name,
  31. const char *load_init);
  32. EXPORT void jack_internal_client_close (const char *client_name); // deprecated
  33. EXPORT int jack_is_realtime (jack_client_t *client);
  34. EXPORT void jack_on_shutdown (jack_client_t *client,
  35. void (*function)(void *arg), void *arg);
  36. EXPORT int jack_set_process_callback (jack_client_t *client,
  37. JackProcessCallback process_callback,
  38. void *arg);
  39. //
  40. EXPORT jack_nframes_t jack_thread_wait(jack_client_t *client, int status);
  41. // new
  42. EXPORT jack_nframes_t jack_cycle_wait (jack_client_t*);
  43. EXPORT void jack_cycle_signal (jack_client_t*, int status);
  44. EXPORT int jack_set_process_thread(jack_client_t* client, JackThreadCallback fun, void *arg);
  45. EXPORT int jack_set_thread_init_callback (jack_client_t *client,
  46. JackThreadInitCallback thread_init_callback,
  47. void *arg);
  48. EXPORT int jack_set_freewheel_callback (jack_client_t *client,
  49. JackFreewheelCallback freewheel_callback,
  50. void *arg);
  51. EXPORT int jack_set_freewheel(jack_client_t* client, int onoff);
  52. EXPORT int jack_set_buffer_size (jack_client_t *client, jack_nframes_t nframes);
  53. EXPORT int jack_set_buffer_size_callback (jack_client_t *client,
  54. JackBufferSizeCallback bufsize_callback,
  55. void *arg);
  56. EXPORT int jack_set_sample_rate_callback (jack_client_t *client,
  57. JackSampleRateCallback srate_callback,
  58. void *arg);
  59. EXPORT int jack_set_client_registration_callback (jack_client_t *,
  60. JackClientRegistrationCallback
  61. registration_callback, void *arg);
  62. EXPORT int jack_set_port_registration_callback (jack_client_t *,
  63. JackPortRegistrationCallback
  64. registration_callback, void *arg);
  65. EXPORT int jack_set_port_connect_callback (jack_client_t *,
  66. JackPortConnectCallback
  67. connect_callback, void *arg);
  68. EXPORT int jack_set_graph_order_callback (jack_client_t *,
  69. JackGraphOrderCallback graph_callback,
  70. void *);
  71. EXPORT int jack_set_xrun_callback (jack_client_t *,
  72. JackXRunCallback xrun_callback, void *arg);
  73. EXPORT int jack_activate (jack_client_t *client);
  74. EXPORT int jack_deactivate (jack_client_t *client);
  75. EXPORT jack_port_t * jack_port_register (jack_client_t *client,
  76. const char *port_name,
  77. const char *port_type,
  78. unsigned long flags,
  79. unsigned long buffer_size);
  80. EXPORT int jack_port_unregister (jack_client_t *, jack_port_t *);
  81. EXPORT void * jack_port_get_buffer (jack_port_t *, jack_nframes_t);
  82. EXPORT const char * jack_port_name (const jack_port_t *port);
  83. EXPORT const char * jack_port_short_name (const jack_port_t *port);
  84. EXPORT int jack_port_flags (const jack_port_t *port);
  85. EXPORT const char * jack_port_type (const jack_port_t *port);
  86. EXPORT int jack_port_is_mine (const jack_client_t *, const jack_port_t *port);
  87. EXPORT int jack_port_connected (const jack_port_t *port);
  88. EXPORT int jack_port_connected_to (const jack_port_t *port,
  89. const char *port_name);
  90. EXPORT const char ** jack_port_get_connections (const jack_port_t *port);
  91. EXPORT const char ** jack_port_get_all_connections (const jack_client_t *client,
  92. const jack_port_t *port);
  93. EXPORT int jack_port_tie (jack_port_t *src, jack_port_t *dst);
  94. EXPORT int jack_port_untie (jack_port_t *port);
  95. EXPORT jack_nframes_t jack_port_get_latency (jack_port_t *port);
  96. EXPORT jack_nframes_t jack_port_get_total_latency (jack_client_t *,
  97. jack_port_t *port);
  98. EXPORT void jack_port_set_latency (jack_port_t *, jack_nframes_t);
  99. EXPORT int jack_recompute_total_latency (jack_client_t*, jack_port_t* port);
  100. EXPORT int jack_recompute_total_latencies (jack_client_t*);
  101. EXPORT int jack_port_set_name (jack_port_t *port, const char *port_name);
  102. EXPORT int jack_port_set_alias (jack_port_t *port, const char *alias);
  103. EXPORT int jack_port_unset_alias (jack_port_t *port, const char *alias);
  104. EXPORT int jack_port_get_aliases (const jack_port_t *port, char* const aliases[2]);
  105. EXPORT int jack_port_request_monitor (jack_port_t *port, int onoff);
  106. EXPORT int jack_port_request_monitor_by_name (jack_client_t *client,
  107. const char *port_name, int onoff);
  108. EXPORT int jack_port_ensure_monitor (jack_port_t *port, int onoff);
  109. EXPORT int jack_port_monitoring_input (jack_port_t *port);
  110. EXPORT int jack_connect (jack_client_t *,
  111. const char *source_port,
  112. const char *destination_port);
  113. EXPORT int jack_disconnect (jack_client_t *,
  114. const char *source_port,
  115. const char *destination_port);
  116. EXPORT int jack_port_disconnect (jack_client_t *, jack_port_t *);
  117. EXPORT int jack_port_name_size(void);
  118. EXPORT int jack_port_type_size(void);
  119. EXPORT jack_nframes_t jack_get_sample_rate (jack_client_t *);
  120. EXPORT jack_nframes_t jack_get_buffer_size (jack_client_t *);
  121. EXPORT const char ** jack_get_ports (jack_client_t *,
  122. const char *port_name_pattern,
  123. const char *type_name_pattern,
  124. unsigned long flags);
  125. EXPORT jack_port_t * jack_port_by_name (jack_client_t *, const char *port_name);
  126. EXPORT jack_port_t * jack_port_by_id (jack_client_t *client,
  127. jack_port_id_t port_id);
  128. EXPORT int jack_engine_takeover_timebase (jack_client_t *);
  129. EXPORT jack_nframes_t jack_frames_since_cycle_start (const jack_client_t *);
  130. EXPORT jack_time_t jack_get_time();
  131. EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t time);
  132. EXPORT jack_time_t jack_frames_to_time(const jack_client_t *client, jack_nframes_t frames);
  133. EXPORT jack_nframes_t jack_frame_time (const jack_client_t *);
  134. EXPORT jack_nframes_t jack_last_frame_time (const jack_client_t *client);
  135. EXPORT float jack_cpu_load (jack_client_t *client);
  136. EXPORT pthread_t jack_client_thread_id (jack_client_t *);
  137. EXPORT void jack_set_error_function (void (*func)(const char *));
  138. EXPORT void jack_set_info_function (void (*func)(const char *));
  139. EXPORT float jack_get_max_delayed_usecs (jack_client_t *client);
  140. EXPORT float jack_get_xrun_delayed_usecs (jack_client_t *client);
  141. EXPORT void jack_reset_max_delayed_usecs (jack_client_t *client);
  142. EXPORT int jack_release_timebase (jack_client_t *client);
  143. EXPORT int jack_set_sync_callback (jack_client_t *client,
  144. JackSyncCallback sync_callback,
  145. void *arg);
  146. EXPORT int jack_set_sync_timeout (jack_client_t *client,
  147. jack_time_t timeout);
  148. EXPORT int jack_set_timebase_callback (jack_client_t *client,
  149. int conditional,
  150. JackTimebaseCallback timebase_callback,
  151. void *arg);
  152. EXPORT int jack_transport_locate (jack_client_t *client,
  153. jack_nframes_t frame);
  154. EXPORT jack_transport_state_t jack_transport_query (const jack_client_t *client,
  155. jack_position_t *pos);
  156. EXPORT jack_nframes_t jack_get_current_transport_frame (const jack_client_t *client);
  157. EXPORT int jack_transport_reposition (jack_client_t *client,
  158. jack_position_t *pos);
  159. EXPORT void jack_transport_start (jack_client_t *client);
  160. EXPORT void jack_transport_stop (jack_client_t *client);
  161. EXPORT void jack_get_transport_info (jack_client_t *client,
  162. jack_transport_info_t *tinfo);
  163. EXPORT void jack_set_transport_info (jack_client_t *client,
  164. jack_transport_info_t *tinfo);
  165. EXPORT int jack_acquire_real_time_scheduling (pthread_t thread, int priority);
  166. EXPORT int jack_client_create_thread (jack_client_t* client,
  167. pthread_t *thread,
  168. int priority,
  169. int realtime, // boolean
  170. void *(*start_routine)(void*),
  171. void *arg);
  172. EXPORT int jack_drop_real_time_scheduling (pthread_t thread);
  173. EXPORT char * jack_get_internal_client_name (jack_client_t *client,
  174. jack_intclient_t intclient);
  175. EXPORT jack_intclient_t jack_internal_client_handle (jack_client_t *client,
  176. const char *client_name,
  177. jack_status_t *status);
  178. EXPORT jack_intclient_t jack_internal_client_load (jack_client_t *client,
  179. const char *client_name,
  180. jack_options_t options,
  181. jack_status_t *status, ...);
  182. EXPORT jack_status_t jack_internal_client_unload (jack_client_t *client,
  183. jack_intclient_t intclient);
  184. EXPORT jack_client_t * jack_client_open (const char *client_name,
  185. jack_options_t options,
  186. jack_status_t *status, ...);
  187. EXPORT jack_client_t * jack_client_new (const char *client_name);
  188. EXPORT int jack_client_close (jack_client_t *client);
  189. #ifdef __cplusplus
  190. }
  191. #endif
  192. #define JACK_LIB "libjack.so.0.0"
  193. #define JACKMP_LIB "libjackmp.so"
  194. // client
  195. static bool gInitedLib = false;
  196. static void* gLibrary = 0;
  197. static bool init_library();
  198. static bool open_library();
  199. static void close_library();
  200. static void (*error_fun)(const char *) = 0;
  201. static void (*info_fun)(const char *) = 0;
  202. static void jack_log(const char *fmt,...)
  203. {
  204. /*
  205. va_list ap;
  206. va_start(ap, fmt);
  207. fprintf(stderr,"Jack: ");
  208. vfprintf(stderr, fmt, ap);
  209. fprintf(stderr,"\n");
  210. va_end(ap);
  211. */
  212. }
  213. // Function definition
  214. typedef void* (*jack_port_get_buffer_fun_def)(jack_port_t* port, jack_nframes_t frames);
  215. static jack_port_get_buffer_fun_def jack_port_get_buffer_fun = 0;
  216. EXPORT void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t frames)
  217. {
  218. jack_log("jack_port_get_buffer");
  219. return (*jack_port_get_buffer_fun)(port, frames);
  220. }
  221. typedef const char* (*jack_port_name_fun_def)(const jack_port_t* port);
  222. static jack_port_name_fun_def jack_port_name_fun = 0;
  223. EXPORT const char* jack_port_name(const jack_port_t* port)
  224. {
  225. jack_log("jack_port_name");
  226. return (*jack_port_name_fun)(port);
  227. }
  228. typedef const char* (*jack_port_short_name_fun_def) (const jack_port_t* port);
  229. static jack_port_short_name_fun_def jack_port_short_name_fun = 0;
  230. EXPORT const char* jack_port_short_name(const jack_port_t* port)
  231. {
  232. jack_log("jack_port_short_name");
  233. return (*jack_port_short_name_fun)(port);
  234. }
  235. typedef int (*jack_port_flags_fun_def)(const jack_port_t* port);
  236. static jack_port_flags_fun_def jack_port_flags_fun = 0;
  237. EXPORT int jack_port_flags(const jack_port_t* port)
  238. {
  239. jack_log("jack_port_flags");
  240. return (*jack_port_flags_fun)(port);
  241. }
  242. typedef const char* (*jack_port_type_fun_def)(const jack_port_t* port);
  243. static jack_port_type_fun_def jack_port_type_fun = 0;
  244. EXPORT const char* jack_port_type(const jack_port_t* port)
  245. {
  246. jack_log("jack_port_type");
  247. return (*jack_port_type_fun)(port);
  248. }
  249. typedef int (*jack_port_connected_fun_def)(const jack_port_t* port);
  250. static jack_port_connected_fun_def jack_port_connected_fun = 0;
  251. EXPORT int jack_port_connected(const jack_port_t* port)
  252. {
  253. jack_log("jack_port_connected");
  254. return (*jack_port_connected_fun)(port);
  255. }
  256. typedef int (*jack_port_connected_to_fun_def)(const jack_port_t* port, const char* portname);
  257. static jack_port_connected_to_fun_def jack_port_connected_to_fun = 0;
  258. EXPORT int jack_port_connected_to(const jack_port_t* port, const char* portname)
  259. {
  260. jack_log("jack_port_connected_to");
  261. return (*jack_port_connected_to_fun)(port, portname);
  262. }
  263. typedef int (*jack_port_tie_fun_def)(jack_port_t* src, jack_port_t* dst);
  264. static jack_port_tie_fun_def jack_port_tie_fun = 0;
  265. EXPORT int jack_port_tie(jack_port_t* src, jack_port_t* dst)
  266. {
  267. jack_log("jack_port_tie");
  268. return (*jack_port_tie_fun)(src, dst);
  269. }
  270. typedef int (*jack_port_untie_fun_def)(jack_port_t* port);
  271. static jack_port_untie_fun_def jack_port_untie_fun = 0;
  272. EXPORT int jack_port_untie(jack_port_t* port)
  273. {
  274. jack_log("jack_port_untie");
  275. return (*jack_port_untie_fun)(port);
  276. }
  277. typedef jack_nframes_t (*jack_port_get_latency_fun_def)(jack_port_t* port);
  278. static jack_port_get_latency_fun_def jack_port_get_latency_fun = 0;
  279. EXPORT jack_nframes_t jack_port_get_latency(jack_port_t* port)
  280. {
  281. jack_log("jack_port_get_latency");
  282. return (*jack_port_get_latency)(port);
  283. }
  284. typedef void (*jack_port_set_latency_fun_def)(jack_port_t* port, jack_nframes_t frames);
  285. static jack_port_set_latency_fun_def jack_port_set_latency_fun = 0;
  286. EXPORT void jack_port_set_latency(jack_port_t* port, jack_nframes_t frames)
  287. {
  288. jack_log("jack_port_set_latency");
  289. (*jack_port_set_latency_fun)(port, frames);
  290. }
  291. typedef int (*jack_recompute_total_latency_fun_def)(jack_client_t* ext_client, jack_port_t* port);
  292. static jack_recompute_total_latency_fun_def jack_recompute_total_latency_fun = 0;
  293. EXPORT int jack_recompute_total_latency(jack_client_t* ext_client, jack_port_t* port)
  294. {
  295. jack_log("jack_recompute_total_latency");
  296. return (*jack_recompute_total_latency_fun)(ext_client, port);
  297. }
  298. typedef int (*jack_recompute_total_latencies_fun_def)(jack_client_t* ext_client);
  299. static jack_recompute_total_latencies_fun_def jack_recompute_total_latencies_fun = 0;
  300. EXPORT int jack_recompute_total_latencies(jack_client_t* ext_client)
  301. {
  302. jack_log("jack_recompute_total_latencies");
  303. return (*jack_recompute_total_latencies_fun)(ext_client);
  304. }
  305. typedef int (*jack_port_set_name_fun_def)(jack_port_t* port, const char* name);
  306. static jack_port_set_name_fun_def jack_port_set_name_fun = 0;
  307. EXPORT int jack_port_set_name(jack_port_t* port, const char* name)
  308. {
  309. jack_log("jack_port_set_name");
  310. return (*jack_port_set_name_fun)(port, name);
  311. }
  312. typedef int (*jack_port_set_alias_fun_def)(jack_port_t* port, const char* alias);
  313. static jack_port_set_alias_fun_def jack_port_set_alias_fun = 0;
  314. EXPORT int jack_port_set_alias(jack_port_t* port, const char* alias)
  315. {
  316. jack_log("jack_port_set_alias");
  317. return (*jack_port_set_alias_fun)(port, alias);
  318. }
  319. typedef int (*jack_port_unset_alias_fun_def)(jack_port_t* port, const char* alias);
  320. static jack_port_unset_alias_fun_def jack_port_unset_alias_fun = 0;
  321. EXPORT int jack_port_unset_alias(jack_port_t* port, const char* alias)
  322. {
  323. jack_log("jack_port_unset_alias");
  324. return (*jack_port_unset_alias_fun)(port, alias);
  325. }
  326. typedef int (*jack_port_get_aliases_fun_def)(jack_port_t* port, char* const aliases[2]);
  327. static jack_port_get_aliases_fun_def jack_port_get_aliases_fun = 0;
  328. EXPORT int jack_port_get_aliases(jack_port_t* port, char* const aliases[2])
  329. {
  330. jack_log("jack_port_get_aliases");
  331. return (*jack_port_get_aliases_fun)(port, aliases);
  332. }
  333. typedef int (*jack_port_request_monitor_fun_def)(jack_port_t* port, int onoff);
  334. static jack_port_request_monitor_fun_def jack_port_request_monitor_fun = 0;
  335. EXPORT int jack_port_request_monitor(jack_port_t* port, int onoff)
  336. {
  337. jack_log("jack_port_request_monitor");
  338. return (*jack_port_request_monitor_fun)(port, onoff);
  339. }
  340. typedef int (*jack_port_request_monitor_by_name_fun_def)(jack_client_t* ext_client, const char* port_name, int onoff);
  341. static jack_port_request_monitor_by_name_fun_def jack_port_request_monitor_by_name_fun = 0;
  342. EXPORT int jack_port_request_monitor_by_name(jack_client_t* ext_client, const char* port_name, int onoff)
  343. {
  344. jack_log("jack_port_request_monitor_by_name");
  345. return (*jack_port_request_monitor_by_name_fun)(ext_client, port_name, onoff);
  346. }
  347. typedef int (*jack_port_ensure_monitor_fun_def)(jack_port_t* port, int onoff);
  348. static jack_port_ensure_monitor_fun_def jack_port_ensure_monitor_fun = 0;
  349. EXPORT int jack_port_ensure_monitor(jack_port_t* port, int onoff)
  350. {
  351. jack_log("jack_port_ensure_monitor");
  352. return (*jack_port_ensure_monitor_fun)(port, onoff);
  353. }
  354. typedef int (*jack_port_monitoring_input_fun_def)(jack_port_t* port);
  355. static jack_port_monitoring_input_fun_def jack_port_monitoring_input_fun = 0;
  356. EXPORT int jack_port_monitoring_input(jack_port_t* port)
  357. {
  358. jack_log("jack_port_monitoring_input");
  359. return (*jack_port_monitoring_input_fun)(port);
  360. }
  361. typedef int (*jack_is_realtime_fun_def)(jack_client_t* ext_client);
  362. static jack_is_realtime_fun_def jack_is_realtime_fun = 0;
  363. EXPORT int jack_is_realtime(jack_client_t* ext_client)
  364. {
  365. jack_log("jack_is_realtime");
  366. return (*jack_is_realtime_fun)(ext_client);
  367. }
  368. typedef void (*shutdown_fun)(void* arg);
  369. typedef void (*jack_on_shutdown_fun_def)(jack_client_t* ext_client, shutdown_fun callback, void* arg);
  370. static jack_on_shutdown_fun_def jack_on_shutdown_fun = 0;
  371. EXPORT void jack_on_shutdown(jack_client_t* ext_client, shutdown_fun callback, void* arg)
  372. {
  373. jack_log("jack_on_shutdown");
  374. (*jack_on_shutdown_fun)(ext_client, callback, arg);
  375. }
  376. typedef int (*jack_set_process_callback_fun_def)(jack_client_t* ext_client, JackProcessCallback callback, void* arg);
  377. static jack_set_process_callback_fun_def jack_set_process_callback_fun = 0;
  378. EXPORT int jack_set_process_callback(jack_client_t* ext_client, JackProcessCallback callback, void* arg)
  379. {
  380. jack_log("jack_set_process_callback");
  381. return (*jack_set_process_callback_fun)(ext_client, callback, arg);
  382. }
  383. typedef int (*jack_set_freewheel_callback_fun_def)(jack_client_t* ext_client, JackFreewheelCallback freewheel_callback, void* arg);
  384. static jack_set_freewheel_callback_fun_def jack_set_freewheel_callback_fun = 0;
  385. EXPORT int jack_set_freewheel_callback(jack_client_t* ext_client, JackFreewheelCallback freewheel_callback, void* arg)
  386. {
  387. jack_log("jack_set_freewheel_callback");
  388. return (*jack_set_freewheel_callback_fun)(ext_client, freewheel_callback, arg);
  389. }
  390. typedef int (*jack_set_freewheel_fun_def)(jack_client_t* ext_client, int onoff);
  391. static jack_set_freewheel_fun_def jack_set_freewheel_fun = 0;
  392. EXPORT int jack_set_freewheel(jack_client_t* ext_client, int onoff)
  393. {
  394. jack_log("jack_set_freewheel");
  395. return (*jack_set_freewheel_fun)(ext_client, onoff);
  396. }
  397. typedef int (*jack_set_buffer_size_fun_def)(jack_client_t* ext_client, jack_nframes_t buffer_size);
  398. static jack_set_buffer_size_fun_def jack_set_buffer_size_fun = 0;
  399. EXPORT int jack_set_buffer_size(jack_client_t* ext_client, jack_nframes_t buffer_size)
  400. {
  401. jack_log("jack_set_buffer_size");
  402. return (*jack_set_buffer_size_fun)(ext_client, buffer_size);
  403. }
  404. typedef int (*jack_set_buffer_size_callback_fun_def)(jack_client_t* ext_client, JackBufferSizeCallback bufsize_callback, void* arg);
  405. static jack_set_buffer_size_callback_fun_def jack_set_buffer_size_callback_fun = 0;
  406. EXPORT int jack_set_buffer_size_callback(jack_client_t* ext_client, JackBufferSizeCallback bufsize_callback, void* arg)
  407. {
  408. jack_log("jack_set_buffer_size_callback");
  409. return (*jack_set_buffer_size_callback_fun)(ext_client, bufsize_callback, arg);
  410. }
  411. typedef int (*jack_set_sample_rate_callback_fun_def)(jack_client_t* ext_client, JackSampleRateCallback srate_callback, void* arg);
  412. static jack_set_sample_rate_callback_fun_def jack_set_sample_rate_callback_fun = 0;
  413. EXPORT int jack_set_sample_rate_callback(jack_client_t* ext_client, JackSampleRateCallback srate_callback, void* arg)
  414. {
  415. jack_log("jack_set_sample_rate_callback");
  416. return (*jack_set_sample_rate_callback_fun)(ext_client, srate_callback, arg);
  417. }
  418. typedef int (*jack_set_client_registration_callback_fun_def)(jack_client_t* ext_client, JackClientRegistrationCallback registration_callback, void* arg);
  419. static jack_set_client_registration_callback_fun_def jack_set_client_registration_callback_fun = 0;
  420. EXPORT int jack_set_client_registration_callback(jack_client_t* ext_client, JackClientRegistrationCallback registration_callback, void* arg)
  421. {
  422. jack_log("jack_set_client_registration_callback");
  423. return (*jack_set_client_registration_callback_fun)(ext_client, registration_callback, arg);
  424. }
  425. typedef int (*jack_set_port_registration_callback_fun_def)(jack_client_t* ext_client, JackPortRegistrationCallback registration_callback, void* arg);
  426. static jack_set_port_registration_callback_fun_def jack_set_port_registration_callback_fun = 0;
  427. EXPORT int jack_set_port_registration_callback(jack_client_t* ext_client, JackPortRegistrationCallback registration_callback, void* arg)
  428. {
  429. jack_log("jack_set_port_registration_callback");
  430. return (*jack_set_port_registration_callback_fun)(ext_client, registration_callback, arg);
  431. }
  432. typedef int (*jack_set_port_connect_callback_fun_def)(jack_client_t* ext_client, JackPortConnectCallback connect_callback, void* arg);
  433. static jack_set_port_connect_callback_fun_def jack_set_port_connect_callback_fun = 0;
  434. EXPORT int jack_set_port_connect_callback(jack_client_t* ext_client, JackPortConnectCallback connect_callback, void* arg)
  435. {
  436. jack_log("jack_set_port_connect_callback");
  437. return (*jack_set_port_connect_callback_fun)(ext_client, connect_callback, arg);
  438. }
  439. typedef int (*jack_set_graph_order_callback_fun_def)(jack_client_t* ext_client, JackGraphOrderCallback graph_callback, void* arg);
  440. static jack_set_graph_order_callback_fun_def jack_set_graph_order_callback_fun = 0;
  441. EXPORT int jack_set_graph_order_callback(jack_client_t* ext_client, JackGraphOrderCallback graph_callback, void* arg)
  442. {
  443. jack_log("jack_set_graph_order_callback");
  444. return (*jack_set_graph_order_callback_fun)(ext_client, graph_callback, arg);
  445. }
  446. typedef int (*jack_set_xrun_callback_fun_def)(jack_client_t* ext_client, JackXRunCallback xrun_callback, void* arg);
  447. static jack_set_xrun_callback_fun_def jack_set_xrun_callback_fun = 0;
  448. EXPORT int jack_set_xrun_callback(jack_client_t* ext_client, JackXRunCallback xrun_callback, void* arg)
  449. {
  450. jack_log("jack_set_xrun_callback");
  451. return (*jack_set_xrun_callback_fun)(ext_client, xrun_callback, arg);
  452. }
  453. typedef int (*jack_set_thread_init_callback_fun_def)(jack_client_t* ext_client, JackThreadInitCallback init_callback, void *arg);
  454. static jack_set_thread_init_callback_fun_def jack_set_thread_init_callback_fun = 0;
  455. EXPORT int jack_set_thread_init_callback(jack_client_t* ext_client, JackThreadInitCallback init_callback, void *arg)
  456. {
  457. jack_log("jack_set_thread_init_callback");
  458. return (*jack_set_thread_init_callback_fun)(ext_client, init_callback, arg);
  459. }
  460. typedef int (*jack_activate_fun_def)(jack_client_t* ext_client);
  461. static jack_activate_fun_def jack_activate_fun = 0;
  462. EXPORT int jack_activate(jack_client_t* ext_client)
  463. {
  464. jack_log("jack_activate");
  465. return (*jack_activate_fun)(ext_client);
  466. }
  467. typedef int (*jack_deactivate_fun_def)(jack_client_t* ext_client);
  468. static jack_deactivate_fun_def jack_deactivate_fun = 0;
  469. EXPORT int jack_deactivate(jack_client_t* ext_client)
  470. {
  471. jack_log("jack_deactivate");
  472. return (*jack_deactivate_fun)(ext_client);
  473. }
  474. typedef jack_port_t* (*jack_port_register_fun_def)(jack_client_t* ext_client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size);
  475. static jack_port_register_fun_def jack_port_register_fun = 0;
  476. EXPORT jack_port_t* jack_port_register(jack_client_t* ext_client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size)
  477. {
  478. jack_log("jack_port_register");
  479. return (*jack_port_register_fun)(ext_client, port_name, port_type, flags, buffer_size);
  480. }
  481. typedef int (*jack_port_unregister_fun_def)(jack_client_t* ext_client, jack_port_t* port);
  482. static jack_port_unregister_fun_def jack_port_unregister_fun = 0;
  483. EXPORT int jack_port_unregister(jack_client_t* ext_client, jack_port_t* port)
  484. {
  485. jack_log("jack_port_unregister");
  486. return (*jack_port_unregister_fun)(ext_client, port);
  487. }
  488. typedef int (*jack_port_is_mine_fun_def)(const jack_client_t* ext_client, const jack_port_t* port);
  489. static jack_port_is_mine_fun_def jack_port_is_mine_fun = 0;
  490. EXPORT int jack_port_is_mine(const jack_client_t* ext_client, const jack_port_t* port)
  491. {
  492. jack_log("jack_port_is_mine");
  493. return (*jack_port_is_mine_fun)(ext_client, port);
  494. }
  495. typedef const char** (*jack_port_get_connections_fun_def)(const jack_port_t* port);
  496. static jack_port_get_connections_fun_def jack_port_get_connections_fun = 0;
  497. EXPORT const char** jack_port_get_connections(const jack_port_t* port)
  498. {
  499. jack_log("jack_port_get_connections");
  500. return (*jack_port_get_connections_fun)(port);
  501. }
  502. // Calling client does not need to "own" the port
  503. typedef const char** (*jack_port_get_all_connections_fun_def)(const jack_client_t* ext_client, const jack_port_t* port);
  504. static jack_port_get_all_connections_fun_def jack_port_get_all_connections_fun = 0;
  505. EXPORT const char** jack_port_get_all_connections(const jack_client_t* ext_client, const jack_port_t* port)
  506. {
  507. jack_log("jack_port_get_all_connections");
  508. return (*jack_port_get_all_connections_fun)(ext_client, port);
  509. }
  510. typedef jack_nframes_t (*jack_port_get_total_latency_fun_def)(jack_client_t* ext_client, jack_port_t* port);
  511. static jack_port_get_total_latency_fun_def jack_port_get_total_latency_fun = 0;
  512. EXPORT jack_nframes_t jack_port_get_total_latency(jack_client_t* ext_client, jack_port_t* port)
  513. {
  514. jack_log("jack_port_get_total_latency");
  515. return (*jack_port_get_total_latency_fun)(ext_client, port);
  516. }
  517. typedef int (*jack_connect_fun_def)(jack_client_t* ext_client, const char* src, const char* dst);
  518. static jack_connect_fun_def jack_connect_fun = 0;
  519. EXPORT int jack_connect(jack_client_t* ext_client, const char* src, const char* dst)
  520. {
  521. jack_log("jack_connect");
  522. return (*jack_connect_fun)(ext_client, src, dst);
  523. }
  524. typedef int (*jack_disconnect_fun_def)(jack_client_t* ext_client, const char* src, const char* dst);
  525. static jack_disconnect_fun_def jack_disconnect_fun = 0;
  526. EXPORT int jack_disconnect(jack_client_t* ext_client, const char* src, const char* dst)
  527. {
  528. jack_log("jack_disconnect");
  529. return (*jack_disconnect_fun)(ext_client, src, dst);
  530. }
  531. typedef int (*jack_port_disconnect_fun_def)(jack_client_t* ext_client, jack_port_t* src);
  532. static jack_port_disconnect_fun_def jack_port_disconnect_fun = 0;
  533. EXPORT int jack_port_disconnect(jack_client_t* ext_client, jack_port_t* src)
  534. {
  535. jack_log("jack_port_disconnect");
  536. return (*jack_port_disconnect_fun)(ext_client, src);
  537. }
  538. typedef jack_nframes_t (*jack_get_sample_rate_fun_def)(jack_client_t* ext_client);
  539. static jack_get_sample_rate_fun_def jack_get_sample_rate_fun = 0;
  540. EXPORT jack_nframes_t jack_get_sample_rate(jack_client_t* ext_client)
  541. {
  542. jack_log("jack_get_sample_rate");
  543. return (*jack_get_sample_rate_fun)(ext_client);
  544. }
  545. typedef jack_nframes_t (*jack_get_buffer_size_fun_def)(jack_client_t* ext_client);
  546. static jack_get_buffer_size_fun_def jack_get_buffer_size_fun = 0;
  547. EXPORT jack_nframes_t jack_get_buffer_size(jack_client_t* ext_client)
  548. {
  549. jack_log("jack_get_buffer_size");
  550. return (*jack_get_buffer_size_fun)(ext_client);
  551. }
  552. typedef const char** (*jack_get_ports_fun_def)(jack_client_t* ext_client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags);
  553. static jack_get_ports_fun_def jack_get_ports_fun = 0;
  554. EXPORT const char** jack_get_ports(jack_client_t* ext_client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags)
  555. {
  556. jack_log("jack_get_ports");
  557. return (*jack_get_ports_fun)(ext_client, port_name_pattern, type_name_pattern, flags);
  558. }
  559. typedef jack_port_t* (*jack_port_by_name_fun_def)(jack_client_t* ext_client, const char* portname);
  560. static jack_port_by_name_fun_def jack_port_by_name_fun = 0;
  561. EXPORT jack_port_t* jack_port_by_name(jack_client_t* ext_client, const char* portname)
  562. {
  563. jack_log("jack_port_by_name");
  564. return (*jack_port_by_name_fun)(ext_client, portname);
  565. }
  566. typedef jack_port_t* (*jack_port_by_id_fun_def)(const jack_client_t* ext_client, jack_port_id_t id);
  567. static jack_port_by_id_fun_def jack_port_by_id_fun = 0;
  568. EXPORT jack_port_t* jack_port_by_id(const jack_client_t* ext_client, jack_port_id_t id)
  569. {
  570. jack_log("jack_port_by_id");
  571. return (*jack_port_by_id_fun)(ext_client, id);
  572. }
  573. typedef int (*jack_engine_takeover_timebase_fun_def)(jack_client_t* ext_client);
  574. static jack_engine_takeover_timebase_fun_def jack_engine_takeover_timebase_fun = 0;
  575. EXPORT int jack_engine_takeover_timebase(jack_client_t* ext_client)
  576. {
  577. jack_log("jack_engine_takeover_timebase");
  578. return (*jack_engine_takeover_timebase_fun)(ext_client);
  579. }
  580. typedef jack_nframes_t (*jack_frames_since_cycle_start_fun_def)(const jack_client_t* ext_client);
  581. static jack_frames_since_cycle_start_fun_def jack_frames_since_cycle_start_fun = 0;
  582. EXPORT jack_nframes_t jack_frames_since_cycle_start(const jack_client_t* ext_client)
  583. {
  584. jack_log("jack_frames_since_cycle_start");
  585. return (*jack_frames_since_cycle_start_fun)(ext_client);
  586. }
  587. typedef jack_time_t (*jack_get_time_fun_def)();
  588. static jack_get_time_fun_def jack_get_time_fun = 0;
  589. EXPORT jack_time_t jack_get_time()
  590. {
  591. jack_log("jack_get_time");
  592. return (*jack_get_time_fun)();
  593. }
  594. typedef jack_nframes_t (*jack_time_to_frames_fun_def)(const jack_client_t* ext_client, jack_time_t time);
  595. static jack_time_to_frames_fun_def jack_time_to_frames_fun = 0;
  596. EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t* ext_client, jack_time_t time)
  597. {
  598. jack_log("jack_time_to_frames");
  599. return (*jack_time_to_frames_fun)(ext_client, time);
  600. }
  601. typedef jack_time_t (*jack_frames_to_time_fun_def)(const jack_client_t* ext_client, jack_nframes_t frames);
  602. static jack_frames_to_time_fun_def jack_frames_to_time_fun = 0;
  603. EXPORT jack_time_t jack_frames_to_time(const jack_client_t* ext_client, jack_nframes_t frames)
  604. {
  605. jack_log("jack_frames_to_time");
  606. return (*jack_frames_to_time_fun)(ext_client, frames);
  607. }
  608. typedef jack_nframes_t (*jack_frame_time_fun_def)(const jack_client_t* ext_client);
  609. static jack_frame_time_fun_def jack_frame_time_fun = 0;
  610. EXPORT jack_nframes_t jack_frame_time(const jack_client_t* ext_client)
  611. {
  612. jack_log("jack_frame_time");
  613. return (*jack_frame_time_fun)(ext_client);
  614. }
  615. typedef jack_nframes_t (*jack_last_frame_time_fun_def)(const jack_client_t* ext_client);
  616. static jack_last_frame_time_fun_def jack_last_frame_time_fun = 0;
  617. EXPORT jack_nframes_t jack_last_frame_time(const jack_client_t* ext_client)
  618. {
  619. jack_log("jack_last_frame_time");
  620. return (*jack_last_frame_time_fun)(ext_client);
  621. }
  622. typedef float (*jack_cpu_load_fun_def)(jack_client_t* ext_client);
  623. static jack_cpu_load_fun_def jack_cpu_load_fun = 0;
  624. EXPORT float jack_cpu_load(jack_client_t* ext_client)
  625. {
  626. jack_log("jack_cpu_load");
  627. return (*jack_cpu_load_fun)(ext_client);
  628. }
  629. typedef pthread_t (*jack_client_thread_id_fun_def)(jack_client_t* ext_client);
  630. static jack_client_thread_id_fun_def jack_client_thread_id_fun = 0;
  631. EXPORT pthread_t jack_client_thread_id(jack_client_t* ext_client)
  632. {
  633. jack_log("jack_client_thread_id");
  634. return (*jack_client_thread_id_fun)(ext_client);
  635. }
  636. typedef void (*jack_set_error_function_fun_def)(void (*func)(const char *));
  637. static jack_set_error_function_fun_def jack_set_error_function_fun = 0;
  638. EXPORT void jack_set_error_function(void (*func)(const char *))
  639. {
  640. jack_log("jack_set_error_function\n");
  641. if (gLibrary) {
  642. (*jack_set_error_function_fun)(func);
  643. } else {
  644. error_fun = func; // Keep the function
  645. }
  646. }
  647. typedef void (*jack_set_info_function_fun_def)(void (*func)(const char *));
  648. static jack_set_info_function_fun_def jack_set_info_function_fun = 0;
  649. EXPORT void jack_set_info_function(void (*func)(const char *))
  650. {
  651. jack_log("jack_set_info_function\n");
  652. if (gLibrary) {
  653. (*jack_set_error_function_fun)(func);
  654. } else {
  655. info_fun = func; // Keep the function
  656. }
  657. }
  658. typedef char* (*jack_get_client_name_fun_def)(jack_client_t* ext_client);
  659. static jack_get_client_name_fun_def jack_get_client_name_fun = 0;
  660. EXPORT char* jack_get_client_name (jack_client_t* ext_client)
  661. {
  662. jack_log("jack_get_client_name");
  663. return (*jack_get_client_name_fun)(ext_client);
  664. }
  665. typedef int (*jack_internal_client_new_fun_def)(const char *client_name,
  666. const char *load_name,
  667. const char *load_init);
  668. static jack_internal_client_new_fun_def jack_internal_client_new_fun = 0;
  669. EXPORT int jack_internal_client_new (const char *client_name,
  670. const char *load_name,
  671. const char *load_init)
  672. {
  673. jack_log("jack_internal_client_new");
  674. return (*jack_internal_client_new_fun)(client_name, load_name, load_init);
  675. }
  676. typedef void (*jack_internal_client_close_fun_def)(const char *client_name);
  677. static jack_internal_client_close_fun_def jack_internal_client_close_fun = 0;
  678. EXPORT void jack_internal_client_close (const char *client_name)
  679. {
  680. jack_log("jack_internal_client_close");
  681. (*jack_internal_client_close_fun)(client_name);
  682. }
  683. typedef int (*jack_client_name_size_fun_def)(void);
  684. static jack_client_name_size_fun_def jack_client_name_size_fun = 0;
  685. EXPORT int jack_client_name_size(void)
  686. {
  687. jack_log("jack_client_name_size");
  688. return (*jack_client_name_size_fun)();
  689. }
  690. typedef int (*jack_port_name_size_fun_def)(void);
  691. static jack_port_name_size_fun_def jack_port_name_size_fun = 0;
  692. EXPORT int jack_port_name_size(void)
  693. {
  694. jack_log("jack_port_name_size");
  695. return (*jack_port_name_size_fun)();
  696. }
  697. typedef int (*jack_port_type_size_fun_def)(void);
  698. static jack_port_type_size_fun_def jack_port_type_size_fun = 0;
  699. EXPORT int jack_port_type_size(void)
  700. {
  701. jack_log("jack_port_type_size");
  702. return (*jack_port_type_size_fun)();
  703. }
  704. // transport.h
  705. typedef int (*jack_release_timebase_fun_def)(jack_client_t* ext_client);
  706. static jack_release_timebase_fun_def jack_release_timebase_fun = 0;
  707. EXPORT int jack_release_timebase(jack_client_t* ext_client)
  708. {
  709. jack_log("jack_release_timebase");
  710. return (*jack_release_timebase_fun)(ext_client);
  711. }
  712. typedef int (*jack_set_sync_callback_fun_def)(jack_client_t* ext_client, JackSyncCallback sync_callback, void *arg);
  713. static jack_set_sync_callback_fun_def jack_set_sync_callback_fun = 0;
  714. EXPORT int jack_set_sync_callback(jack_client_t* ext_client, JackSyncCallback sync_callback, void *arg)
  715. {
  716. jack_log("jack_set_sync_callback");
  717. return (*jack_set_sync_callback_fun)(ext_client, sync_callback, arg);
  718. }
  719. typedef int (*jack_set_sync_timeout_fun_def)(jack_client_t* ext_client, jack_time_t timeout);
  720. static jack_set_sync_timeout_fun_def jack_set_sync_timeout_fun = 0;
  721. EXPORT int jack_set_sync_timeout(jack_client_t* ext_client, jack_time_t timeout)
  722. {
  723. jack_log("jack_set_sync_timeout");
  724. return (*jack_set_sync_timeout_fun)(ext_client, timeout);
  725. }
  726. typedef int (*jack_set_timebase_callback_fun_def)(jack_client_t* ext_client, int conditional, JackTimebaseCallback timebase_callback, void* arg);
  727. static jack_set_timebase_callback_fun_def jack_set_timebase_callback_fun = 0;
  728. EXPORT int jack_set_timebase_callback(jack_client_t* ext_client, int conditional, JackTimebaseCallback timebase_callback, void* arg)
  729. {
  730. jack_log("jack_set_timebase_callback");
  731. return (*jack_set_timebase_callback_fun)(ext_client, conditional, timebase_callback, arg);
  732. }
  733. typedef int (*jack_transport_locate_fun_def)(jack_client_t* ext_client, jack_nframes_t frame);
  734. static jack_transport_locate_fun_def jack_transport_locate_fun = 0;
  735. EXPORT int jack_transport_locate(jack_client_t* ext_client, jack_nframes_t frame)
  736. {
  737. jack_log("jack_transport_locate");
  738. return (*jack_transport_locate_fun)(ext_client, frame);
  739. }
  740. typedef jack_transport_state_t (*jack_transport_query_fun_def)(const jack_client_t* ext_client, jack_position_t* pos);
  741. static jack_transport_query_fun_def jack_transport_query_fun = 0;
  742. EXPORT jack_transport_state_t jack_transport_query(const jack_client_t* ext_client, jack_position_t* pos)
  743. {
  744. jack_log("jack_transport_query");
  745. return (*jack_transport_query_fun)(ext_client, pos);
  746. }
  747. typedef jack_nframes_t (*jack_get_current_transport_frame_fun_def)(const jack_client_t* ext_client);
  748. static jack_get_current_transport_frame_fun_def jack_get_current_transport_frame_fun = 0;
  749. EXPORT jack_nframes_t jack_get_current_transport_frame(const jack_client_t* ext_client)
  750. {
  751. jack_log("jack_get_current_transport_frame");
  752. return (*jack_get_current_transport_frame_fun)(ext_client);
  753. }
  754. typedef int (*jack_transport_reposition_fun_def)(jack_client_t* ext_client, jack_position_t* pos);
  755. static jack_transport_reposition_fun_def jack_transport_reposition_fun = 0;
  756. EXPORT int jack_transport_reposition(jack_client_t* ext_client, jack_position_t* pos)
  757. {
  758. jack_log("jack_transport_reposition");
  759. return (*jack_transport_reposition_fun)(ext_client, pos);
  760. }
  761. typedef void (*jack_transport_start_fun_def)(jack_client_t* ext_client);
  762. static jack_transport_start_fun_def jack_transport_start_fun = 0;
  763. EXPORT void jack_transport_start(jack_client_t* ext_client)
  764. {
  765. jack_log("jack_transport_start");
  766. (*jack_transport_start_fun)(ext_client);
  767. }
  768. typedef void (*jack_transport_stop_fun_def)(jack_client_t* ext_client);
  769. static jack_transport_stop_fun_def jack_transport_stop_fun = 0;
  770. EXPORT void jack_transport_stop(jack_client_t* ext_client)
  771. {
  772. jack_log("jack_transport_stop");
  773. (*jack_transport_stop_fun)(ext_client);
  774. }
  775. // deprecated
  776. typedef void (*jack_get_transport_info_fun_def)(jack_client_t* ext_client, jack_transport_info_t* tinfo);
  777. static jack_get_transport_info_fun_def jack_get_transport_info_fun = 0;
  778. EXPORT void jack_get_transport_info(jack_client_t* ext_client, jack_transport_info_t* tinfo)
  779. {
  780. jack_log("jack_get_transport_info");
  781. (*jack_get_transport_info_fun)(ext_client, tinfo);
  782. }
  783. typedef void (*jack_set_transport_info_fun_def)(jack_client_t* ext_client, jack_transport_info_t* tinfo);
  784. static jack_set_transport_info_fun_def jack_set_transport_info_fun = 0;
  785. EXPORT void jack_set_transport_info(jack_client_t* ext_client, jack_transport_info_t* tinfo)
  786. {
  787. jack_log("jack_set_transport_info");
  788. (*jack_set_transport_info_fun)(ext_client, tinfo);
  789. }
  790. // statistics.h
  791. typedef float (*jack_get_max_delayed_usecs_fun_def)(jack_client_t* ext_client);
  792. static jack_get_max_delayed_usecs_fun_def jack_get_max_delayed_usecs_fun = 0;
  793. EXPORT float jack_get_max_delayed_usecs(jack_client_t* ext_client)
  794. {
  795. jack_log("jack_get_max_delayed_usecs");
  796. return (*jack_get_max_delayed_usecs_fun)(ext_client);
  797. }
  798. typedef float (*jack_get_xrun_delayed_usecs_fun_def)(jack_client_t* ext_client);
  799. static jack_get_xrun_delayed_usecs_fun_def jack_get_xrun_delayed_usecs_fun = 0;
  800. EXPORT float jack_get_xrun_delayed_usecs(jack_client_t* ext_client)
  801. {
  802. jack_log("jack_get_xrun_delayed_usecs");
  803. return (*jack_get_xrun_delayed_usecs_fun)(ext_client);
  804. }
  805. typedef void (*jack_reset_max_delayed_usecs_fun_def)(jack_client_t* ext_client);
  806. static jack_reset_max_delayed_usecs_fun_def jack_reset_max_delayed_usecs_fun = 0;
  807. EXPORT void jack_reset_max_delayed_usecs(jack_client_t* ext_client)
  808. {
  809. jack_log("jack_reset_max_delayed_usecs");
  810. (*jack_reset_max_delayed_usecs)(ext_client);
  811. }
  812. // thread.h
  813. typedef int (*jack_acquire_real_time_scheduling_fun_def)(pthread_t thread, int priority);
  814. static jack_acquire_real_time_scheduling_fun_def jack_acquire_real_time_scheduling_fun = 0;
  815. EXPORT int jack_acquire_real_time_scheduling(pthread_t thread, int priority)
  816. {
  817. jack_log("jack_acquire_real_time_scheduling");
  818. return (*jack_acquire_real_time_scheduling_fun)(thread, priority);
  819. }
  820. typedef void *(*start_routine)(void*);
  821. typedef int (*jack_client_create_thread_fun_def)(jack_client_t* client,
  822. pthread_t *thread,
  823. int priority,
  824. int realtime, // boolean
  825. start_routine callback,
  826. void *arg);
  827. static jack_client_create_thread_fun_def jack_client_create_thread_fun = 0;
  828. EXPORT int jack_client_create_thread(jack_client_t* client,
  829. pthread_t *thread,
  830. int priority,
  831. int realtime, // boolean
  832. start_routine callback,
  833. void *arg)
  834. {
  835. jack_log("jack_client_create_thread");
  836. return (*jack_client_create_thread_fun)(client, thread, priority, realtime, callback, arg);
  837. }
  838. typedef int (*jack_drop_real_time_scheduling_fun_def)(pthread_t thread);
  839. static jack_drop_real_time_scheduling_fun_def jack_drop_real_time_scheduling_fun = 0;
  840. EXPORT int jack_drop_real_time_scheduling(pthread_t thread)
  841. {
  842. jack_log("jack_client_create_thread");
  843. return (*jack_drop_real_time_scheduling_fun)(thread);
  844. }
  845. // intclient.h
  846. typedef char* (*jack_get_internal_client_name_fun_def)(jack_client_t* ext_client, jack_intclient_t intclient);
  847. static jack_get_internal_client_name_fun_def jack_get_internal_client_name_fun = 0;
  848. EXPORT char* jack_get_internal_client_name(jack_client_t* ext_client, jack_intclient_t intclient)
  849. {
  850. jack_log("jack_get_internal_client_name");
  851. return (*jack_get_internal_client_name_fun)(ext_client, intclient);
  852. }
  853. typedef jack_intclient_t (*jack_internal_client_handle_fun_def)(jack_client_t* ext_client, const char* client_name, jack_status_t* status);
  854. static jack_internal_client_handle_fun_def jack_internal_client_handle_fun = 0;
  855. EXPORT jack_intclient_t jack_internal_client_handle(jack_client_t* ext_client, const char* client_name, jack_status_t* status)
  856. {
  857. jack_log("jack_internal_client_handle");
  858. return (*jack_internal_client_handle_fun)(ext_client, client_name, status);
  859. }
  860. typedef jack_intclient_t (*jack_internal_client_load_aux_fun_def)(jack_client_t* ext_client, const char* client_name, jack_options_t options, jack_status_t* status, va_list ap);
  861. static jack_internal_client_load_aux_fun_def jack_internal_client_load_aux_fun = 0;
  862. EXPORT jack_intclient_t jack_internal_client_load(jack_client_t* ext_client, const char* client_name, jack_options_t options, jack_status_t* status, ...)
  863. {
  864. jack_log("jack_internal_client_load");
  865. va_list ap;
  866. va_start(ap, status);
  867. jack_intclient_t res = (*jack_internal_client_load_aux_fun)(ext_client, client_name, options, status, ap);
  868. va_end(ap);
  869. return res;
  870. }
  871. typedef jack_status_t (*jack_internal_client_unload_fun_def)(jack_client_t* ext_client, jack_intclient_t intclient);
  872. static jack_internal_client_unload_fun_def jack_internal_client_unload_fun = 0;
  873. EXPORT jack_status_t jack_internal_client_unload(jack_client_t* ext_client, jack_intclient_t intclient)
  874. {
  875. jack_log("jack_internal_client_unload");
  876. return (*jack_internal_client_unload_fun)(ext_client, intclient);
  877. }
  878. typedef jack_client_t * (*jack_client_open_aux_fun_def)(const char *client_name, jack_options_t options, jack_status_t *status, va_list ap);
  879. static jack_client_open_aux_fun_def jack_client_open_aux_fun = 0;
  880. EXPORT jack_client_t * jack_client_open(const char *client_name, jack_options_t options, jack_status_t *status, ...)
  881. {
  882. // TODO : in "autostart mode", has to load jackdrc file and figure out which server has to be started...
  883. jack_log("jack_client_open");
  884. /*
  885. va_list ap;
  886. va_start (ap, status);
  887. if (try_start_server(&va, options, status)) {
  888. jack_error("jack server is not running or cannot be started");
  889. JackLibGlobals::Destroy(); // jack library destruction
  890. return 0;
  891. }
  892. va_end (ap);
  893. */
  894. // Library check...
  895. if (!open_library())
  896. return 0;
  897. va_list ap;
  898. va_start(ap, status);
  899. jack_client_t* res = (*jack_client_open_aux_fun)(client_name, options, status, ap);
  900. va_end(ap);
  901. return res;
  902. }
  903. typedef jack_client_t * (*jack_client_new_fun_def)(const char *client_name);
  904. static jack_client_new_fun_def jack_client_new_fun = 0;
  905. EXPORT jack_client_t * jack_client_new(const char *client_name)
  906. {
  907. jack_log("jack_client_new");
  908. // Library check...
  909. if (!open_library())
  910. return 0;
  911. return (*jack_client_new_fun)(client_name);
  912. }
  913. typedef int (*jack_client_close_fun_def)(jack_client_t *client);
  914. static jack_client_close_fun_def jack_client_close_fun = 0;
  915. EXPORT int jack_client_close(jack_client_t *client)
  916. {
  917. jack_log("jack_client_close");
  918. int res = (*jack_client_close_fun)(client);
  919. close_library();
  920. return res;
  921. }
  922. // Library loader
  923. static bool get_jack_library_in_directory(const char* dir_name, const char* library_name, char* library_res_name)
  924. {
  925. printf("get_jack_library_in_directory\n");
  926. struct dirent * dir_entry;
  927. DIR * dir_stream = opendir(dir_name);
  928. if (!dir_stream)
  929. return false;
  930. while ((dir_entry = readdir(dir_stream))) {
  931. if (strncmp(library_name, dir_entry->d_name, strlen(library_name)) == 0) {
  932. printf("found\n");
  933. sprintf(library_res_name, "%s/%s", dir_name, dir_entry->d_name);
  934. closedir(dir_stream);
  935. return true;
  936. }
  937. }
  938. closedir(dir_stream);
  939. return false;
  940. }
  941. static bool get_jack_library(const char* library_name, char* library_res_name)
  942. {
  943. if (get_jack_library_in_directory("/usr/lib", library_name, library_res_name))
  944. return true;
  945. if (get_jack_library_in_directory("/usr/local/lib", library_name, library_res_name))
  946. return true;
  947. return false;
  948. }
  949. static bool open_library()
  950. {
  951. printf("open_library %ld \n", gInitedLib);
  952. if (!gInitedLib)
  953. gInitedLib = init_library();
  954. return gInitedLib;
  955. }
  956. static void close_library()
  957. {
  958. printf("close_library\n");
  959. if (gInitedLib) {
  960. dlclose(gLibrary);
  961. gLibrary = 0;
  962. gInitedLib = false;
  963. }
  964. }
  965. static bool check_client(void* library)
  966. {
  967. jack_client_t* client = 0;
  968. printf("check_library\n");
  969. // Get "new" and "close" entry points...
  970. jack_client_new_fun = (jack_client_new_fun_def)dlsym(library, "jack_client_new");
  971. jack_client_close_fun = (jack_client_close_fun_def)dlsym(library, "jack_client_close");
  972. // Try opening a client...
  973. if ((client = (*jack_client_new_fun)("dummy"))) { // jackd server is running....
  974. printf("check_library 1 %x\n", jack_client_close_fun);
  975. (*jack_client_close_fun)(client);
  976. printf("check_library 2\n");
  977. return true;
  978. } else {
  979. printf("check_library NO\n");
  980. return false;
  981. }
  982. }
  983. static bool init_library()
  984. {
  985. char library_res_name[256];
  986. void* jackLibrary = (get_jack_library(JACK_LIB, library_res_name)) ? dlopen(library_res_name, RTLD_LAZY) : 0;
  987. void* jackmpLibrary = (get_jack_library(JACKMP_LIB, library_res_name)) ? dlopen(library_res_name, RTLD_LAZY) : 0;
  988. if (jackLibrary) {
  989. printf("jackLibrary\n");
  990. if (check_client(jackLibrary)) { // jackd is running...
  991. printf("jackd is running\n");
  992. gLibrary = jackLibrary;
  993. if (jackmpLibrary)
  994. dlclose(jackmpLibrary);
  995. printf("jackd is running OK\n");
  996. } else if (check_client(jackmpLibrary)) { // jackdmp is running...
  997. gLibrary = jackmpLibrary;
  998. if (jackLibrary)
  999. dlclose(jackLibrary);
  1000. } else {
  1001. goto error;
  1002. }
  1003. } else if (jackmpLibrary) {
  1004. printf("jackmpLibrary\n");
  1005. if (check_client(jackmpLibrary)) { // jackd is running...
  1006. gLibrary = jackmpLibrary;
  1007. } else {
  1008. goto error;
  1009. }
  1010. } else {
  1011. printf("Jack libraries not found, failure...\n");
  1012. goto error;
  1013. }
  1014. // Load entry points...
  1015. jack_client_open_aux_fun = (jack_client_open_aux_fun_def)dlsym(gLibrary, "jack_client_open_aux");
  1016. jack_client_new_fun = (jack_client_new_fun_def)dlsym(gLibrary, "jack_client_new");
  1017. jack_client_close_fun = (jack_client_close_fun_def)dlsym(gLibrary, "jack_client_close");
  1018. jack_client_name_size_fun = (jack_client_name_size_fun_def)dlsym(gLibrary, "jack_client_name_size");
  1019. jack_get_client_name_fun = (jack_get_client_name_fun_def)dlsym(gLibrary, "jack_get_client_name");
  1020. jack_internal_client_new_fun = (jack_internal_client_new_fun_def)dlsym(gLibrary, "jack_internal_client_new");
  1021. jack_internal_client_close_fun = (jack_internal_client_close_fun_def)dlsym(gLibrary, "jack_internal_client_close");
  1022. jack_is_realtime_fun = (jack_is_realtime_fun_def)dlsym(gLibrary, "jack_is_realtime");
  1023. jack_on_shutdown_fun = (jack_on_shutdown_fun_def)dlsym(gLibrary, "jack_on_shutdown");
  1024. jack_set_process_callback_fun = (jack_set_process_callback_fun_def)dlsym(gLibrary, "jack_set_process_callback");
  1025. jack_set_thread_init_callback_fun = (jack_set_thread_init_callback_fun_def)dlsym(gLibrary, "jack_set_thread_init_callback");
  1026. jack_set_freewheel_callback_fun = (jack_set_freewheel_callback_fun_def)dlsym(gLibrary, "jack_set_freewheel_callback");
  1027. jack_set_freewheel_fun = (jack_set_freewheel_fun_def)dlsym(gLibrary, "jack_set_freewheel");
  1028. jack_set_buffer_size_fun = (jack_set_buffer_size_fun_def)dlsym(gLibrary, "jack_set_buffer_size");
  1029. jack_set_buffer_size_callback_fun = (jack_set_buffer_size_callback_fun_def)dlsym(gLibrary, "jack_set_buffer_size_callback");
  1030. jack_set_sample_rate_callback_fun = (jack_set_sample_rate_callback_fun_def)dlsym(gLibrary, "jack_set_sample_rate_callback");
  1031. jack_set_client_registration_callback_fun = (jack_set_client_registration_callback_fun_def)dlsym(gLibrary, "jack_set_client_registration_callback");
  1032. jack_set_port_registration_callback_fun = (jack_set_port_registration_callback_fun_def)dlsym(gLibrary, "jack_set_port_registration_callback");
  1033. jack_set_port_connect_callback_fun = (jack_set_port_connect_callback_fun_def)dlsym(gLibrary, "jack_set_port_connect_callback");
  1034. jack_set_graph_order_callback_fun = (jack_set_graph_order_callback_fun_def)dlsym(gLibrary, "jack_set_graph_order_callback");
  1035. jack_set_xrun_callback_fun = (jack_set_xrun_callback_fun_def)dlsym(gLibrary, "jack_set_xrun_callback");
  1036. jack_activate_fun = (jack_activate_fun_def)dlsym(gLibrary, "jack_activate");
  1037. jack_deactivate_fun = (jack_deactivate_fun_def)dlsym(gLibrary, "jack_deactivate");
  1038. jack_port_register_fun = (jack_port_register_fun_def)dlsym(gLibrary, "jack_port_register");
  1039. jack_port_unregister_fun = (jack_port_unregister_fun_def)dlsym(gLibrary, "jack_port_unregister");
  1040. jack_port_get_buffer_fun = (jack_port_get_buffer_fun_def)dlsym(gLibrary, "jack_port_get_buffer");
  1041. jack_port_name_fun = (jack_port_name_fun_def)dlsym(gLibrary, "jack_port_name");
  1042. jack_port_short_name_fun = (jack_port_short_name_fun_def)dlsym(gLibrary, "jack_port_short_name");
  1043. jack_port_flags_fun = (jack_port_flags_fun_def)dlsym(gLibrary, "jack_port_flags");
  1044. jack_port_type_fun = (jack_port_type_fun_def)dlsym(gLibrary, "jack_port_type");
  1045. jack_port_is_mine_fun = (jack_port_is_mine_fun_def)dlsym(gLibrary, "jack_port_is_mine");
  1046. jack_port_connected_fun = (jack_port_connected_fun_def)dlsym(gLibrary, "jack_port_connected");
  1047. jack_port_connected_to_fun = (jack_port_connected_to_fun_def)dlsym(gLibrary, "jack_port_connected_to");
  1048. jack_port_get_connections_fun = (jack_port_get_connections_fun_def)dlsym(gLibrary, "jack_port_get_connections");
  1049. jack_port_get_all_connections_fun = (jack_port_get_all_connections_fun_def)dlsym(gLibrary, "jack_port_get_all_connections");
  1050. jack_port_tie_fun = (jack_port_tie_fun_def)dlsym(gLibrary, "jack_port_tie");
  1051. jack_port_untie_fun = (jack_port_untie_fun_def)dlsym(gLibrary, "jack_port_untie");
  1052. jack_port_get_latency_fun = (jack_port_get_latency_fun_def)dlsym(gLibrary, "jack_port_get_latency");
  1053. jack_port_get_total_latency_fun = (jack_port_get_total_latency_fun_def)dlsym(gLibrary, "jack_port_get_total_latency");
  1054. jack_port_set_latency_fun = (jack_port_set_latency_fun_def)dlsym(gLibrary, "jack_port_set_latency");
  1055. jack_recompute_total_latency_fun = (jack_recompute_total_latency_fun_def)dlsym(gLibrary, "jack_recompute_total_latency");
  1056. jack_recompute_total_latencies_fun = (jack_recompute_total_latencies_fun_def)dlsym(gLibrary, "jack_recompute_total_latencies");
  1057. jack_port_set_name_fun = (jack_port_set_name_fun_def)dlsym(gLibrary, "jack_port_set_name");
  1058. jack_port_set_alias_fun = (jack_port_set_alias_fun_def)dlsym(gLibrary, "jack_port_set_alias");
  1059. jack_port_unset_alias_fun = (jack_port_unset_alias_fun_def)dlsym(gLibrary, "jack_port_unset_alias");
  1060. jack_port_get_aliases_fun = (jack_port_get_aliases_fun_def)dlsym(gLibrary, "jack_port_get_aliases");
  1061. jack_port_request_monitor_fun = (jack_port_request_monitor_fun_def)dlsym(gLibrary, "jack_port_request_monitor");
  1062. jack_port_request_monitor_by_name_fun = (jack_port_request_monitor_by_name_fun_def)dlsym(gLibrary, "jack_port_request_monitor_by_name");
  1063. jack_port_ensure_monitor_fun = (jack_port_ensure_monitor_fun_def)dlsym(gLibrary, "jack_port_ensure_monitor");
  1064. jack_port_monitoring_input_fun = (jack_port_monitoring_input_fun_def)dlsym(gLibrary, "jack_port_monitoring_input");
  1065. jack_connect_fun = (jack_connect_fun_def)dlsym(gLibrary, "jack_connect");
  1066. jack_disconnect_fun = (jack_disconnect_fun_def)dlsym(gLibrary, "jack_disconnect");
  1067. jack_port_disconnect_fun = (jack_port_disconnect_fun_def)dlsym(gLibrary, "jack_port_disconnect");
  1068. jack_port_name_size_fun = (jack_port_name_size_fun_def)dlsym(gLibrary, "jack_port_name_size");
  1069. jack_port_type_size_fun = (jack_port_type_size_fun_def)dlsym(gLibrary, "jack_port_type_size");
  1070. jack_get_sample_rate_fun = (jack_get_sample_rate_fun_def)dlsym(gLibrary, "jack_get_sample_rate");
  1071. jack_get_buffer_size_fun = (jack_get_buffer_size_fun_def)dlsym(gLibrary, "jack_get_buffer_size");
  1072. jack_get_ports_fun = (jack_get_ports_fun_def)dlsym(gLibrary, "jack_get_ports");
  1073. jack_port_by_name_fun = (jack_port_by_name_fun_def)dlsym(gLibrary, "jack_port_by_name");
  1074. jack_port_by_id_fun = (jack_port_by_id_fun_def)dlsym(gLibrary, "jack_port_by_id");
  1075. jack_engine_takeover_timebase_fun = (jack_engine_takeover_timebase_fun_def)dlsym(gLibrary, "jack_engine_takeover_timebase");
  1076. jack_frames_since_cycle_start_fun = (jack_frames_since_cycle_start_fun_def)dlsym(gLibrary, "jack_frames_since_cycle_start");
  1077. jack_get_time_fun = (jack_get_time_fun_def)dlsym(gLibrary, "jack_get_time");
  1078. jack_time_to_frames_fun = (jack_time_to_frames_fun_def)dlsym(gLibrary, "jack_time_to_frames");
  1079. jack_frames_to_time_fun = (jack_frames_to_time_fun_def)dlsym(gLibrary, "jack_frames_to_time");
  1080. jack_frame_time_fun = (jack_frame_time_fun_def)dlsym(gLibrary, "jack_frame_time");
  1081. jack_last_frame_time_fun = (jack_last_frame_time_fun_def)dlsym(gLibrary, "jack_last_frame_time");
  1082. jack_cpu_load_fun = (jack_cpu_load_fun_def)dlsym(gLibrary, "jack_cpu_load");
  1083. jack_client_thread_id_fun = (jack_client_thread_id_fun_def)dlsym(gLibrary, "jack_client_thread_id");
  1084. jack_set_error_function_fun = (jack_set_error_function_fun_def)dlsym(gLibrary, "jack_set_error_function");
  1085. jack_set_info_function_fun = (jack_set_info_function_fun_def)dlsym(gLibrary, "jack_set_info_function");
  1086. jack_get_max_delayed_usecs_fun = (jack_get_max_delayed_usecs_fun_def)dlsym(gLibrary, "jack_get_max_delayed_usecs");
  1087. jack_get_xrun_delayed_usecs_fun = (jack_get_xrun_delayed_usecs_fun_def)dlsym(gLibrary, "jack_get_xrun_delayed_usecs");
  1088. jack_reset_max_delayed_usecs_fun = (jack_reset_max_delayed_usecs_fun_def)dlsym(gLibrary, "jack_reset_max_delayed_usecs");
  1089. jack_release_timebase_fun = (jack_release_timebase_fun_def)dlsym(gLibrary, "jack_release_timebase");
  1090. jack_set_sync_callback_fun = (jack_set_sync_callback_fun_def)dlsym(gLibrary, "jack_set_sync_callback");
  1091. jack_set_sync_timeout_fun = (jack_set_sync_timeout_fun_def)dlsym(gLibrary, "jack_set_sync_timeout");
  1092. jack_set_timebase_callback_fun = (jack_set_timebase_callback_fun_def)dlsym(gLibrary, "jack_set_timebase_callback");
  1093. jack_transport_locate_fun = (jack_transport_locate_fun_def)dlsym(gLibrary, "jack_transport_locate");
  1094. jack_transport_query_fun = (jack_transport_query_fun_def)dlsym(gLibrary, "jack_transport_query");
  1095. jack_get_current_transport_frame_fun = (jack_get_current_transport_frame_fun_def)dlsym(gLibrary, "jack_get_current_transport_frame");
  1096. jack_transport_reposition_fun = (jack_transport_reposition_fun_def)dlsym(gLibrary, "jack_transport_reposition");
  1097. jack_transport_start_fun = (jack_transport_start_fun_def)dlsym(gLibrary, "jack_transport_start");
  1098. jack_transport_stop_fun = (jack_transport_stop_fun_def)dlsym(gLibrary, "jack_transport_stop");
  1099. jack_get_transport_info_fun = (jack_get_transport_info_fun_def)dlsym(gLibrary, "jack_get_transport_info");
  1100. jack_set_transport_info_fun = (jack_set_transport_info_fun_def)dlsym(gLibrary, "jack_set_transport_info");
  1101. jack_acquire_real_time_scheduling_fun = (jack_acquire_real_time_scheduling_fun_def)dlsym(gLibrary, "jack_acquire_real_time_scheduling");
  1102. jack_client_create_thread_fun = (jack_client_create_thread_fun_def)dlsym(gLibrary, "jack_client_create_thread");
  1103. jack_drop_real_time_scheduling_fun = (jack_drop_real_time_scheduling_fun_def)dlsym(gLibrary, "jack_drop_real_time_scheduling");
  1104. jack_get_internal_client_name_fun = (jack_get_internal_client_name_fun_def)dlsym(gLibrary, "jack_get_internal_client_name");
  1105. jack_internal_client_handle_fun = (jack_internal_client_handle_fun_def)dlsym(gLibrary, "jack_internal_client_handle");
  1106. jack_internal_client_load_aux_fun = (jack_internal_client_load_aux_fun_def)dlsym(gLibrary, "jack_internal_client_load_aux");
  1107. jack_internal_client_unload_fun = (jack_internal_client_unload_fun_def)dlsym(gLibrary, "jack_internal_client_unload");
  1108. // Functions were kept...
  1109. if (error_fun)
  1110. jack_set_error_function_fun(error_fun);
  1111. if (info_fun)
  1112. jack_set_info_function_fun(info_fun);
  1113. printf("init_library OK\n");
  1114. return true;
  1115. error:
  1116. if (jackLibrary)
  1117. dlclose(jackLibrary);
  1118. if (jackmpLibrary)
  1119. dlclose(jackmpLibrary);
  1120. gLibrary = 0;
  1121. return false;
  1122. }