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.

1551 lines
69KB

  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. #ifndef JACK_LOCATION
  16. #include "config.h"
  17. #endif
  18. #include "types.h"
  19. #include "midiport.h"
  20. #include "jack.h"
  21. #include "JackExports.h"
  22. #include "varargs.h"
  23. #include "JackConstants.h"
  24. #include <dlfcn.h>
  25. #include <stdarg.h>
  26. #include <stdio.h>
  27. #include <dirent.h>
  28. #include <unistd.h>
  29. #include <errno.h>
  30. #ifdef __cplusplus
  31. extern "C"
  32. {
  33. #endif
  34. EXPORT int jack_client_name_size (void);
  35. EXPORT char* jack_get_client_name (jack_client_t *client);
  36. EXPORT int jack_internal_client_new (const char *client_name, // deprecated
  37. const char *load_name,
  38. const char *load_init);
  39. EXPORT void jack_internal_client_close (const char *client_name); // deprecated
  40. EXPORT int jack_is_realtime (jack_client_t *client);
  41. EXPORT void jack_on_shutdown (jack_client_t *client,
  42. void (*function)(void *arg), void *arg);
  43. EXPORT int jack_set_process_callback (jack_client_t *client,
  44. JackProcessCallback process_callback,
  45. void *arg);
  46. EXPORT jack_nframes_t jack_thread_wait(jack_client_t *client, int status);
  47. EXPORT jack_nframes_t jack_cycle_wait (jack_client_t*);
  48. EXPORT void jack_cycle_signal (jack_client_t*, int status);
  49. EXPORT int jack_set_process_thread(jack_client_t* client, JackThreadCallback fun, void *arg);
  50. EXPORT int jack_set_thread_init_callback (jack_client_t *client,
  51. JackThreadInitCallback thread_init_callback,
  52. void *arg);
  53. EXPORT int jack_set_freewheel_callback (jack_client_t *client,
  54. JackFreewheelCallback freewheel_callback,
  55. void *arg);
  56. EXPORT int jack_set_freewheel(jack_client_t* client, int onoff);
  57. EXPORT int jack_set_buffer_size (jack_client_t *client, jack_nframes_t nframes);
  58. EXPORT int jack_set_buffer_size_callback (jack_client_t *client,
  59. JackBufferSizeCallback bufsize_callback,
  60. void *arg);
  61. EXPORT int jack_set_sample_rate_callback (jack_client_t *client,
  62. JackSampleRateCallback srate_callback,
  63. void *arg);
  64. EXPORT int jack_set_client_registration_callback (jack_client_t *,
  65. JackClientRegistrationCallback
  66. registration_callback, void *arg);
  67. EXPORT int jack_set_port_registration_callback (jack_client_t *,
  68. JackPortRegistrationCallback
  69. registration_callback, void *arg);
  70. EXPORT int jack_set_port_connect_callback (jack_client_t *,
  71. JackPortConnectCallback
  72. connect_callback, void *arg);
  73. EXPORT int jack_set_graph_order_callback (jack_client_t *,
  74. JackGraphOrderCallback graph_callback,
  75. void *);
  76. EXPORT int jack_set_xrun_callback (jack_client_t *,
  77. JackXRunCallback xrun_callback, void *arg);
  78. EXPORT int jack_activate (jack_client_t *client);
  79. EXPORT int jack_deactivate (jack_client_t *client);
  80. EXPORT jack_port_t * jack_port_register (jack_client_t *client,
  81. const char *port_name,
  82. const char *port_type,
  83. unsigned long flags,
  84. unsigned long buffer_size);
  85. EXPORT int jack_port_unregister (jack_client_t *, jack_port_t *);
  86. EXPORT void * jack_port_get_buffer (jack_port_t *, jack_nframes_t);
  87. EXPORT const char * jack_port_name (const jack_port_t *port);
  88. EXPORT const char * jack_port_short_name (const jack_port_t *port);
  89. EXPORT int jack_port_flags (const jack_port_t *port);
  90. EXPORT const char * jack_port_type (const jack_port_t *port);
  91. EXPORT int jack_port_is_mine (const jack_client_t *, const jack_port_t *port);
  92. EXPORT int jack_port_connected (const jack_port_t *port);
  93. EXPORT int jack_port_connected_to (const jack_port_t *port,
  94. const char *port_name);
  95. EXPORT const char ** jack_port_get_connections (const jack_port_t *port);
  96. EXPORT const char ** jack_port_get_all_connections (const jack_client_t *client,
  97. const jack_port_t *port);
  98. EXPORT int jack_port_tie (jack_port_t *src, jack_port_t *dst);
  99. EXPORT int jack_port_untie (jack_port_t *port);
  100. EXPORT jack_nframes_t jack_port_get_latency (jack_port_t *port);
  101. EXPORT jack_nframes_t jack_port_get_total_latency (jack_client_t *,
  102. jack_port_t *port);
  103. EXPORT void jack_port_set_latency (jack_port_t *, jack_nframes_t);
  104. EXPORT int jack_recompute_total_latency (jack_client_t*, jack_port_t* port);
  105. EXPORT int jack_recompute_total_latencies (jack_client_t*);
  106. EXPORT int jack_port_set_name (jack_port_t *port, const char *port_name);
  107. EXPORT int jack_port_set_alias (jack_port_t *port, const char *alias);
  108. EXPORT int jack_port_unset_alias (jack_port_t *port, const char *alias);
  109. EXPORT int jack_port_get_aliases (const jack_port_t *port, char* const aliases[2]);
  110. EXPORT int jack_port_request_monitor (jack_port_t *port, int onoff);
  111. EXPORT int jack_port_request_monitor_by_name (jack_client_t *client,
  112. const char *port_name, int onoff);
  113. EXPORT int jack_port_ensure_monitor (jack_port_t *port, int onoff);
  114. EXPORT int jack_port_monitoring_input (jack_port_t *port);
  115. EXPORT int jack_connect (jack_client_t *,
  116. const char *source_port,
  117. const char *destination_port);
  118. EXPORT int jack_disconnect (jack_client_t *,
  119. const char *source_port,
  120. const char *destination_port);
  121. EXPORT int jack_port_disconnect (jack_client_t *, jack_port_t *);
  122. EXPORT int jack_port_name_size(void);
  123. EXPORT int jack_port_type_size(void);
  124. EXPORT jack_nframes_t jack_get_sample_rate (jack_client_t *);
  125. EXPORT jack_nframes_t jack_get_buffer_size (jack_client_t *);
  126. EXPORT const char ** jack_get_ports (jack_client_t *,
  127. const char *port_name_pattern,
  128. const char *type_name_pattern,
  129. unsigned long flags);
  130. EXPORT jack_port_t * jack_port_by_name (jack_client_t *, const char *port_name);
  131. EXPORT jack_port_t * jack_port_by_id (jack_client_t *client,
  132. jack_port_id_t port_id);
  133. EXPORT int jack_engine_takeover_timebase (jack_client_t *);
  134. EXPORT jack_nframes_t jack_frames_since_cycle_start (const jack_client_t *);
  135. EXPORT jack_time_t jack_get_time();
  136. EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t time);
  137. EXPORT jack_time_t jack_frames_to_time(const jack_client_t *client, jack_nframes_t frames);
  138. EXPORT jack_nframes_t jack_frame_time (const jack_client_t *);
  139. EXPORT jack_nframes_t jack_last_frame_time (const jack_client_t *client);
  140. EXPORT float jack_cpu_load (jack_client_t *client);
  141. EXPORT pthread_t jack_client_thread_id (jack_client_t *);
  142. EXPORT void jack_set_error_function (void (*func)(const char *));
  143. EXPORT void jack_set_info_function (void (*func)(const char *));
  144. EXPORT float jack_get_max_delayed_usecs (jack_client_t *client);
  145. EXPORT float jack_get_xrun_delayed_usecs (jack_client_t *client);
  146. EXPORT void jack_reset_max_delayed_usecs (jack_client_t *client);
  147. EXPORT int jack_release_timebase (jack_client_t *client);
  148. EXPORT int jack_set_sync_callback (jack_client_t *client,
  149. JackSyncCallback sync_callback,
  150. void *arg);
  151. EXPORT int jack_set_sync_timeout (jack_client_t *client,
  152. jack_time_t timeout);
  153. EXPORT int jack_set_timebase_callback (jack_client_t *client,
  154. int conditional,
  155. JackTimebaseCallback timebase_callback,
  156. void *arg);
  157. EXPORT int jack_transport_locate (jack_client_t *client,
  158. jack_nframes_t frame);
  159. EXPORT jack_transport_state_t jack_transport_query (const jack_client_t *client,
  160. jack_position_t *pos);
  161. EXPORT jack_nframes_t jack_get_current_transport_frame (const jack_client_t *client);
  162. EXPORT int jack_transport_reposition (jack_client_t *client,
  163. jack_position_t *pos);
  164. EXPORT void jack_transport_start (jack_client_t *client);
  165. EXPORT void jack_transport_stop (jack_client_t *client);
  166. EXPORT void jack_get_transport_info (jack_client_t *client,
  167. jack_transport_info_t *tinfo);
  168. EXPORT void jack_set_transport_info (jack_client_t *client,
  169. jack_transport_info_t *tinfo);
  170. EXPORT int jack_acquire_real_time_scheduling (pthread_t thread, int priority);
  171. EXPORT int jack_client_create_thread (jack_client_t* client,
  172. pthread_t *thread,
  173. int priority,
  174. int realtime, // boolean
  175. void *(*start_routine)(void*),
  176. void *arg);
  177. EXPORT int jack_drop_real_time_scheduling (pthread_t thread);
  178. EXPORT char * jack_get_internal_client_name (jack_client_t *client,
  179. jack_intclient_t intclient);
  180. EXPORT jack_intclient_t jack_internal_client_handle (jack_client_t *client,
  181. const char *client_name,
  182. jack_status_t *status);
  183. EXPORT jack_intclient_t jack_internal_client_load (jack_client_t *client,
  184. const char *client_name,
  185. jack_options_t options,
  186. jack_status_t *status, ...);
  187. EXPORT jack_status_t jack_internal_client_unload (jack_client_t *client,
  188. jack_intclient_t intclient);
  189. EXPORT jack_client_t * jack_client_open (const char *client_name,
  190. jack_options_t options,
  191. jack_status_t *status, ...);
  192. EXPORT jack_client_t * jack_client_new (const char *client_name);
  193. EXPORT int jack_client_close (jack_client_t *client);
  194. // MIDI
  195. EXPORT jack_nframes_t jack_midi_get_event_count(void* port_buffer);
  196. EXPORT int jack_midi_event_get(jack_midi_event_t *event, void* port_buffer, jack_nframes_t event_index);
  197. EXPORT void jack_midi_clear_buffer(void* port_buffer);
  198. EXPORT size_t jack_midi_max_event_size(void* port_buffer);
  199. EXPORT jack_midi_data_t* jack_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size);
  200. EXPORT int jack_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t *data, size_t data_size);
  201. EXPORT jack_nframes_t jack_midi_get_lost_event_count(void *port_buffer);
  202. #ifdef __cplusplus
  203. }
  204. #endif
  205. #define JACK_LIB "libjack.so.0.0"
  206. #define JACKMP_LIB "libjackmp.so"
  207. // client
  208. static void* gLibrary = 0;
  209. static bool open_library();
  210. static void close_library();
  211. static void (*error_fun)(const char *) = 0;
  212. static void (*info_fun)(const char *) = 0;
  213. static bool jack_debug = false;
  214. static void RewriteName(const char* name, char* new_name)
  215. {
  216. size_t i;
  217. for (i = 0; i < strlen(name); i++) {
  218. if ((name[i] == '/') || (name[i] == '\\'))
  219. new_name[i] = '_';
  220. else
  221. new_name[i] = name[i];
  222. }
  223. new_name[i] = '\0';
  224. }
  225. static void jack_log(const char *fmt, ...)
  226. {
  227. if (jack_debug) {
  228. va_list ap;
  229. va_start(ap, fmt);
  230. fprintf(stderr,"Jack: ");
  231. vfprintf(stderr, fmt, ap);
  232. fprintf(stderr,"\n");
  233. va_end(ap);
  234. }
  235. }
  236. /* Exec the JACK server in this process. Does not return. */
  237. static void start_server_aux(const char* server_name)
  238. {
  239. FILE* fp = 0;
  240. char filename[255];
  241. char arguments[255];
  242. char buffer[255];
  243. char* command = 0;
  244. size_t pos = 0;
  245. size_t result = 0;
  246. char** argv = 0;
  247. int i = 0;
  248. int good = 0;
  249. int ret;
  250. jack_log("start_server_aux");
  251. snprintf(filename, 255, "%s/.jackdrc", getenv("HOME"));
  252. fp = fopen(filename, "r");
  253. if (!fp) {
  254. fp = fopen("/etc/jackdrc", "r");
  255. }
  256. /* if still not found, check old config name for backwards compatability */
  257. if (!fp) {
  258. fp = fopen("/etc/jackd.conf", "r");
  259. }
  260. if (fp) {
  261. arguments[0] = '\0';
  262. ret = fscanf(fp, "%s", buffer);
  263. while (ret != 0 && ret != EOF) {
  264. strcat(arguments, buffer);
  265. strcat(arguments, " ");
  266. ret = fscanf(fp, "%s", buffer);
  267. }
  268. if (strlen(arguments) > 0) {
  269. good = 1;
  270. }
  271. fclose(fp);
  272. }
  273. if (!good) {
  274. command = (char*)(JACK_LOCATION "/jackd");
  275. strncpy(arguments, JACK_LOCATION "/jackd -T -d "JACK_DEFAULT_DRIVER, 255);
  276. } else {
  277. result = strcspn(arguments, " ");
  278. command = (char*)malloc(result + 1);
  279. strncpy(command, arguments, result);
  280. command[result] = '\0';
  281. }
  282. argv = (char**)malloc(255);
  283. while (1) {
  284. /* insert -T and -nserver_name in front of arguments */
  285. if (i == 1) {
  286. argv[i] = (char*)malloc(strlen ("-T") + 1);
  287. strcpy (argv[i++], "-T");
  288. if (server_name) {
  289. size_t optlen = strlen("-n");
  290. char* buf = (char*)malloc(optlen + strlen(server_name) + 1);
  291. strcpy(buf, "-n");
  292. strcpy(buf + optlen, server_name);
  293. argv[i++] = buf;
  294. }
  295. }
  296. result = strcspn(arguments + pos, " ");
  297. if (result == 0) {
  298. break;
  299. }
  300. argv[i] = (char*)malloc(result + 1);
  301. strncpy(argv[i], arguments + pos, result);
  302. argv[i][result] = '\0';
  303. pos += result + 1;
  304. ++i;
  305. }
  306. argv[i] = 0;
  307. execv(command, argv);
  308. /* If execv() succeeds, it does not return. There's no point
  309. * in calling jack_error() here in the child process. */
  310. fprintf(stderr, "exec of JACK server (command = \"%s\") failed: %s\n", command, strerror(errno));
  311. }
  312. int start_server(const char* server_name, jack_options_t options)
  313. {
  314. jack_log("start_server 0");
  315. if ((options & JackNoStartServer) || getenv("JACK_NO_START_SERVER")) {
  316. return 1;
  317. }
  318. jack_log("start_server 1");
  319. /* The double fork() forces the server to become a child of
  320. * init, which will always clean up zombie process state on
  321. * termination. This even works in cases where the server
  322. * terminates but this client does not.
  323. *
  324. * Since fork() is usually implemented using copy-on-write
  325. * virtual memory tricks, the overhead of the second fork() is
  326. * probably relatively small.
  327. */
  328. switch (fork()) {
  329. case 0: /* child process */
  330. switch (fork()) {
  331. case 0: /* grandchild process */
  332. start_server_aux(server_name);
  333. _exit(99); /* exec failed */
  334. case - 1:
  335. _exit(98);
  336. default:
  337. _exit(0);
  338. }
  339. case - 1: /* fork() error */
  340. return 1; /* failed to start server */
  341. }
  342. /* only the original parent process goes here */
  343. sleep(1);
  344. return 0; /* (probably) successful */
  345. }
  346. // Function definition
  347. typedef void* (*jack_port_get_buffer_fun_def)(jack_port_t* port, jack_nframes_t frames);
  348. static jack_port_get_buffer_fun_def jack_port_get_buffer_fun = 0;
  349. EXPORT void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t frames)
  350. {
  351. jack_log("jack_port_get_buffer");
  352. return (*jack_port_get_buffer_fun)(port, frames);
  353. }
  354. typedef const char* (*jack_port_name_fun_def)(const jack_port_t* port);
  355. static jack_port_name_fun_def jack_port_name_fun = 0;
  356. EXPORT const char* jack_port_name(const jack_port_t* port)
  357. {
  358. jack_log("jack_port_name");
  359. return (*jack_port_name_fun)(port);
  360. }
  361. typedef const char* (*jack_port_short_name_fun_def) (const jack_port_t* port);
  362. static jack_port_short_name_fun_def jack_port_short_name_fun = 0;
  363. EXPORT const char* jack_port_short_name(const jack_port_t* port)
  364. {
  365. jack_log("jack_port_short_name");
  366. return (*jack_port_short_name_fun)(port);
  367. }
  368. typedef int (*jack_port_flags_fun_def)(const jack_port_t* port);
  369. static jack_port_flags_fun_def jack_port_flags_fun = 0;
  370. EXPORT int jack_port_flags(const jack_port_t* port)
  371. {
  372. jack_log("jack_port_flags");
  373. return (*jack_port_flags_fun)(port);
  374. }
  375. typedef const char* (*jack_port_type_fun_def)(const jack_port_t* port);
  376. static jack_port_type_fun_def jack_port_type_fun = 0;
  377. EXPORT const char* jack_port_type(const jack_port_t* port)
  378. {
  379. jack_log("jack_port_type");
  380. return (*jack_port_type_fun)(port);
  381. }
  382. typedef int (*jack_port_connected_fun_def)(const jack_port_t* port);
  383. static jack_port_connected_fun_def jack_port_connected_fun = 0;
  384. EXPORT int jack_port_connected(const jack_port_t* port)
  385. {
  386. jack_log("jack_port_connected");
  387. return (*jack_port_connected_fun)(port);
  388. }
  389. typedef int (*jack_port_connected_to_fun_def)(const jack_port_t* port, const char* portname);
  390. static jack_port_connected_to_fun_def jack_port_connected_to_fun = 0;
  391. EXPORT int jack_port_connected_to(const jack_port_t* port, const char* portname)
  392. {
  393. jack_log("jack_port_connected_to");
  394. return (*jack_port_connected_to_fun)(port, portname);
  395. }
  396. typedef int (*jack_port_tie_fun_def)(jack_port_t* src, jack_port_t* dst);
  397. static jack_port_tie_fun_def jack_port_tie_fun = 0;
  398. EXPORT int jack_port_tie(jack_port_t* src, jack_port_t* dst)
  399. {
  400. jack_log("jack_port_tie");
  401. return (*jack_port_tie_fun)(src, dst);
  402. }
  403. typedef int (*jack_port_untie_fun_def)(jack_port_t* port);
  404. static jack_port_untie_fun_def jack_port_untie_fun = 0;
  405. EXPORT int jack_port_untie(jack_port_t* port)
  406. {
  407. jack_log("jack_port_untie");
  408. return (*jack_port_untie_fun)(port);
  409. }
  410. typedef jack_nframes_t (*jack_port_get_latency_fun_def)(jack_port_t* port);
  411. static jack_port_get_latency_fun_def jack_port_get_latency_fun = 0;
  412. EXPORT jack_nframes_t jack_port_get_latency(jack_port_t* port)
  413. {
  414. jack_log("jack_port_get_latency");
  415. return (*jack_port_get_latency_fun)(port);
  416. }
  417. typedef void (*jack_port_set_latency_fun_def)(jack_port_t* port, jack_nframes_t frames);
  418. static jack_port_set_latency_fun_def jack_port_set_latency_fun = 0;
  419. EXPORT void jack_port_set_latency(jack_port_t* port, jack_nframes_t frames)
  420. {
  421. jack_log("jack_port_set_latency");
  422. (*jack_port_set_latency_fun)(port, frames);
  423. }
  424. typedef int (*jack_recompute_total_latency_fun_def)(jack_client_t* ext_client, jack_port_t* port);
  425. static jack_recompute_total_latency_fun_def jack_recompute_total_latency_fun = 0;
  426. EXPORT int jack_recompute_total_latency(jack_client_t* ext_client, jack_port_t* port)
  427. {
  428. jack_log("jack_recompute_total_latency");
  429. return (*jack_recompute_total_latency_fun)(ext_client, port);
  430. }
  431. typedef int (*jack_recompute_total_latencies_fun_def)(jack_client_t* ext_client);
  432. static jack_recompute_total_latencies_fun_def jack_recompute_total_latencies_fun = 0;
  433. EXPORT int jack_recompute_total_latencies(jack_client_t* ext_client)
  434. {
  435. jack_log("jack_recompute_total_latencies");
  436. return (*jack_recompute_total_latencies_fun)(ext_client);
  437. }
  438. typedef int (*jack_port_set_name_fun_def)(jack_port_t* port, const char* name);
  439. static jack_port_set_name_fun_def jack_port_set_name_fun = 0;
  440. EXPORT int jack_port_set_name(jack_port_t* port, const char* name)
  441. {
  442. jack_log("jack_port_set_name");
  443. return (*jack_port_set_name_fun)(port, name);
  444. }
  445. typedef int (*jack_port_set_alias_fun_def)(jack_port_t* port, const char* alias);
  446. static jack_port_set_alias_fun_def jack_port_set_alias_fun = 0;
  447. EXPORT int jack_port_set_alias(jack_port_t* port, const char* alias)
  448. {
  449. jack_log("jack_port_set_alias");
  450. return (*jack_port_set_alias_fun)(port, alias);
  451. }
  452. typedef int (*jack_port_unset_alias_fun_def)(jack_port_t* port, const char* alias);
  453. static jack_port_unset_alias_fun_def jack_port_unset_alias_fun = 0;
  454. EXPORT int jack_port_unset_alias(jack_port_t* port, const char* alias)
  455. {
  456. jack_log("jack_port_unset_alias");
  457. return (*jack_port_unset_alias_fun)(port, alias);
  458. }
  459. typedef int (*jack_port_get_aliases_fun_def)(jack_port_t* port, char* const aliases[2]);
  460. static jack_port_get_aliases_fun_def jack_port_get_aliases_fun = 0;
  461. EXPORT int jack_port_get_aliases(jack_port_t* port, char* const aliases[2])
  462. {
  463. jack_log("jack_port_get_aliases");
  464. return (*jack_port_get_aliases_fun)(port, aliases);
  465. }
  466. typedef int (*jack_port_request_monitor_fun_def)(jack_port_t* port, int onoff);
  467. static jack_port_request_monitor_fun_def jack_port_request_monitor_fun = 0;
  468. EXPORT int jack_port_request_monitor(jack_port_t* port, int onoff)
  469. {
  470. jack_log("jack_port_request_monitor");
  471. return (*jack_port_request_monitor_fun)(port, onoff);
  472. }
  473. typedef int (*jack_port_request_monitor_by_name_fun_def)(jack_client_t* ext_client, const char* port_name, int onoff);
  474. static jack_port_request_monitor_by_name_fun_def jack_port_request_monitor_by_name_fun = 0;
  475. EXPORT int jack_port_request_monitor_by_name(jack_client_t* ext_client, const char* port_name, int onoff)
  476. {
  477. jack_log("jack_port_request_monitor_by_name");
  478. return (*jack_port_request_monitor_by_name_fun)(ext_client, port_name, onoff);
  479. }
  480. typedef int (*jack_port_ensure_monitor_fun_def)(jack_port_t* port, int onoff);
  481. static jack_port_ensure_monitor_fun_def jack_port_ensure_monitor_fun = 0;
  482. EXPORT int jack_port_ensure_monitor(jack_port_t* port, int onoff)
  483. {
  484. jack_log("jack_port_ensure_monitor");
  485. return (*jack_port_ensure_monitor_fun)(port, onoff);
  486. }
  487. typedef int (*jack_port_monitoring_input_fun_def)(jack_port_t* port);
  488. static jack_port_monitoring_input_fun_def jack_port_monitoring_input_fun = 0;
  489. EXPORT int jack_port_monitoring_input(jack_port_t* port)
  490. {
  491. jack_log("jack_port_monitoring_input");
  492. return (*jack_port_monitoring_input_fun)(port);
  493. }
  494. typedef int (*jack_is_realtime_fun_def)(jack_client_t* ext_client);
  495. static jack_is_realtime_fun_def jack_is_realtime_fun = 0;
  496. EXPORT int jack_is_realtime(jack_client_t* ext_client)
  497. {
  498. jack_log("jack_is_realtime");
  499. return (*jack_is_realtime_fun)(ext_client);
  500. }
  501. typedef void (*shutdown_fun)(void* arg);
  502. typedef void (*jack_on_shutdown_fun_def)(jack_client_t* ext_client, shutdown_fun callback, void* arg);
  503. static jack_on_shutdown_fun_def jack_on_shutdown_fun = 0;
  504. EXPORT void jack_on_shutdown(jack_client_t* ext_client, shutdown_fun callback, void* arg)
  505. {
  506. jack_log("jack_on_shutdown");
  507. (*jack_on_shutdown_fun)(ext_client, callback, arg);
  508. }
  509. typedef int (*jack_set_process_callback_fun_def)(jack_client_t* ext_client, JackProcessCallback callback, void* arg);
  510. static jack_set_process_callback_fun_def jack_set_process_callback_fun = 0;
  511. EXPORT int jack_set_process_callback(jack_client_t* ext_client, JackProcessCallback callback, void* arg)
  512. {
  513. jack_log("jack_set_process_callback");
  514. return (*jack_set_process_callback_fun)(ext_client, callback, arg);
  515. }
  516. typedef jack_nframes_t (*jack_cycle_wait_fun_def)(jack_client_t* ext_client);
  517. static jack_cycle_wait_fun_def jack_cycle_wait_fun = 0;
  518. EXPORT jack_nframes_t jack_cycle_wait(jack_client_t* ext_client)
  519. {
  520. jack_log("jack_cycle_wait");
  521. return (*jack_cycle_wait_fun)(ext_client);
  522. }
  523. typedef void (*jack_cycle_signal_fun_def)(jack_client_t* ext_client, int status);
  524. static jack_cycle_signal_fun_def jack_cycle_signal_fun = 0;
  525. EXPORT void jack_cycle_signal(jack_client_t* ext_client, int status)
  526. {
  527. jack_log("jack_cycle_signal");
  528. (*jack_cycle_signal_fun)(ext_client, status);
  529. }
  530. typedef int (*jack_set_process_thread_fun_def)(jack_client_t* ext_client, JackThreadCallback callback, void *arg);
  531. static jack_set_process_thread_fun_def jack_set_process_thread_fun = 0;
  532. EXPORT int jack_set_process_thread(jack_client_t* ext_client, JackThreadCallback callback, void *arg)
  533. {
  534. jack_log("jack_set_process_thread");
  535. return (*jack_set_process_thread_fun)(ext_client, callback, arg);
  536. }
  537. typedef jack_nframes_t (*jack_thread_wait_fun_def)(jack_client_t* ext_client, int status);
  538. static jack_thread_wait_fun_def jack_thread_wait_fun = 0;
  539. EXPORT jack_nframes_t jack_thread_wait(jack_client_t* ext_client, int status)
  540. {
  541. jack_log("jack_thread_wait");
  542. return (*jack_thread_wait_fun)(ext_client, status);
  543. }
  544. typedef int (*jack_set_freewheel_callback_fun_def)(jack_client_t* ext_client, JackFreewheelCallback freewheel_callback, void* arg);
  545. static jack_set_freewheel_callback_fun_def jack_set_freewheel_callback_fun = 0;
  546. EXPORT int jack_set_freewheel_callback(jack_client_t* ext_client, JackFreewheelCallback freewheel_callback, void* arg)
  547. {
  548. jack_log("jack_set_freewheel_callback");
  549. return (*jack_set_freewheel_callback_fun)(ext_client, freewheel_callback, arg);
  550. }
  551. typedef int (*jack_set_freewheel_fun_def)(jack_client_t* ext_client, int onoff);
  552. static jack_set_freewheel_fun_def jack_set_freewheel_fun = 0;
  553. EXPORT int jack_set_freewheel(jack_client_t* ext_client, int onoff)
  554. {
  555. jack_log("jack_set_freewheel");
  556. return (*jack_set_freewheel_fun)(ext_client, onoff);
  557. }
  558. typedef int (*jack_set_buffer_size_fun_def)(jack_client_t* ext_client, jack_nframes_t buffer_size);
  559. static jack_set_buffer_size_fun_def jack_set_buffer_size_fun = 0;
  560. EXPORT int jack_set_buffer_size(jack_client_t* ext_client, jack_nframes_t buffer_size)
  561. {
  562. jack_log("jack_set_buffer_size");
  563. return (*jack_set_buffer_size_fun)(ext_client, buffer_size);
  564. }
  565. typedef int (*jack_set_buffer_size_callback_fun_def)(jack_client_t* ext_client, JackBufferSizeCallback bufsize_callback, void* arg);
  566. static jack_set_buffer_size_callback_fun_def jack_set_buffer_size_callback_fun = 0;
  567. EXPORT int jack_set_buffer_size_callback(jack_client_t* ext_client, JackBufferSizeCallback bufsize_callback, void* arg)
  568. {
  569. jack_log("jack_set_buffer_size_callback");
  570. return (*jack_set_buffer_size_callback_fun)(ext_client, bufsize_callback, arg);
  571. }
  572. typedef int (*jack_set_sample_rate_callback_fun_def)(jack_client_t* ext_client, JackSampleRateCallback srate_callback, void* arg);
  573. static jack_set_sample_rate_callback_fun_def jack_set_sample_rate_callback_fun = 0;
  574. EXPORT int jack_set_sample_rate_callback(jack_client_t* ext_client, JackSampleRateCallback srate_callback, void* arg)
  575. {
  576. jack_log("jack_set_sample_rate_callback");
  577. return (*jack_set_sample_rate_callback_fun)(ext_client, srate_callback, arg);
  578. }
  579. typedef int (*jack_set_client_registration_callback_fun_def)(jack_client_t* ext_client, JackClientRegistrationCallback registration_callback, void* arg);
  580. static jack_set_client_registration_callback_fun_def jack_set_client_registration_callback_fun = 0;
  581. EXPORT int jack_set_client_registration_callback(jack_client_t* ext_client, JackClientRegistrationCallback registration_callback, void* arg)
  582. {
  583. jack_log("jack_set_client_registration_callback");
  584. return (*jack_set_client_registration_callback_fun)(ext_client, registration_callback, arg);
  585. }
  586. typedef int (*jack_set_port_registration_callback_fun_def)(jack_client_t* ext_client, JackPortRegistrationCallback registration_callback, void* arg);
  587. static jack_set_port_registration_callback_fun_def jack_set_port_registration_callback_fun = 0;
  588. EXPORT int jack_set_port_registration_callback(jack_client_t* ext_client, JackPortRegistrationCallback registration_callback, void* arg)
  589. {
  590. jack_log("jack_set_port_registration_callback");
  591. return (*jack_set_port_registration_callback_fun)(ext_client, registration_callback, arg);
  592. }
  593. typedef int (*jack_set_port_connect_callback_fun_def)(jack_client_t* ext_client, JackPortConnectCallback connect_callback, void* arg);
  594. static jack_set_port_connect_callback_fun_def jack_set_port_connect_callback_fun = 0;
  595. EXPORT int jack_set_port_connect_callback(jack_client_t* ext_client, JackPortConnectCallback connect_callback, void* arg)
  596. {
  597. jack_log("jack_set_port_connect_callback");
  598. return (*jack_set_port_connect_callback_fun)(ext_client, connect_callback, arg);
  599. }
  600. typedef int (*jack_set_graph_order_callback_fun_def)(jack_client_t* ext_client, JackGraphOrderCallback graph_callback, void* arg);
  601. static jack_set_graph_order_callback_fun_def jack_set_graph_order_callback_fun = 0;
  602. EXPORT int jack_set_graph_order_callback(jack_client_t* ext_client, JackGraphOrderCallback graph_callback, void* arg)
  603. {
  604. jack_log("jack_set_graph_order_callback");
  605. return (*jack_set_graph_order_callback_fun)(ext_client, graph_callback, arg);
  606. }
  607. typedef int (*jack_set_xrun_callback_fun_def)(jack_client_t* ext_client, JackXRunCallback xrun_callback, void* arg);
  608. static jack_set_xrun_callback_fun_def jack_set_xrun_callback_fun = 0;
  609. EXPORT int jack_set_xrun_callback(jack_client_t* ext_client, JackXRunCallback xrun_callback, void* arg)
  610. {
  611. jack_log("jack_set_xrun_callback");
  612. return (*jack_set_xrun_callback_fun)(ext_client, xrun_callback, arg);
  613. }
  614. typedef int (*jack_set_thread_init_callback_fun_def)(jack_client_t* ext_client, JackThreadInitCallback init_callback, void *arg);
  615. static jack_set_thread_init_callback_fun_def jack_set_thread_init_callback_fun = 0;
  616. EXPORT int jack_set_thread_init_callback(jack_client_t* ext_client, JackThreadInitCallback init_callback, void *arg)
  617. {
  618. jack_log("jack_set_thread_init_callback");
  619. return (*jack_set_thread_init_callback_fun)(ext_client, init_callback, arg);
  620. }
  621. typedef int (*jack_activate_fun_def)(jack_client_t* ext_client);
  622. static jack_activate_fun_def jack_activate_fun = 0;
  623. EXPORT int jack_activate(jack_client_t* ext_client)
  624. {
  625. jack_log("jack_activate");
  626. return (*jack_activate_fun)(ext_client);
  627. }
  628. typedef int (*jack_deactivate_fun_def)(jack_client_t* ext_client);
  629. static jack_deactivate_fun_def jack_deactivate_fun = 0;
  630. EXPORT int jack_deactivate(jack_client_t* ext_client)
  631. {
  632. jack_log("jack_deactivate");
  633. return (*jack_deactivate_fun)(ext_client);
  634. }
  635. 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);
  636. static jack_port_register_fun_def jack_port_register_fun = 0;
  637. 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)
  638. {
  639. jack_log("jack_port_register");
  640. return (*jack_port_register_fun)(ext_client, port_name, port_type, flags, buffer_size);
  641. }
  642. typedef int (*jack_port_unregister_fun_def)(jack_client_t* ext_client, jack_port_t* port);
  643. static jack_port_unregister_fun_def jack_port_unregister_fun = 0;
  644. EXPORT int jack_port_unregister(jack_client_t* ext_client, jack_port_t* port)
  645. {
  646. jack_log("jack_port_unregister");
  647. return (*jack_port_unregister_fun)(ext_client, port);
  648. }
  649. typedef int (*jack_port_is_mine_fun_def)(const jack_client_t* ext_client, const jack_port_t* port);
  650. static jack_port_is_mine_fun_def jack_port_is_mine_fun = 0;
  651. EXPORT int jack_port_is_mine(const jack_client_t* ext_client, const jack_port_t* port)
  652. {
  653. jack_log("jack_port_is_mine");
  654. return (*jack_port_is_mine_fun)(ext_client, port);
  655. }
  656. typedef const char** (*jack_port_get_connections_fun_def)(const jack_port_t* port);
  657. static jack_port_get_connections_fun_def jack_port_get_connections_fun = 0;
  658. EXPORT const char** jack_port_get_connections(const jack_port_t* port)
  659. {
  660. jack_log("jack_port_get_connections");
  661. return (*jack_port_get_connections_fun)(port);
  662. }
  663. // Calling client does not need to "own" the port
  664. typedef const char** (*jack_port_get_all_connections_fun_def)(const jack_client_t* ext_client, const jack_port_t* port);
  665. static jack_port_get_all_connections_fun_def jack_port_get_all_connections_fun = 0;
  666. EXPORT const char** jack_port_get_all_connections(const jack_client_t* ext_client, const jack_port_t* port)
  667. {
  668. jack_log("jack_port_get_all_connections");
  669. return (*jack_port_get_all_connections_fun)(ext_client, port);
  670. }
  671. typedef jack_nframes_t (*jack_port_get_total_latency_fun_def)(jack_client_t* ext_client, jack_port_t* port);
  672. static jack_port_get_total_latency_fun_def jack_port_get_total_latency_fun = 0;
  673. EXPORT jack_nframes_t jack_port_get_total_latency(jack_client_t* ext_client, jack_port_t* port)
  674. {
  675. jack_log("jack_port_get_total_latency");
  676. return (*jack_port_get_total_latency_fun)(ext_client, port);
  677. }
  678. typedef int (*jack_connect_fun_def)(jack_client_t* ext_client, const char* src, const char* dst);
  679. static jack_connect_fun_def jack_connect_fun = 0;
  680. EXPORT int jack_connect(jack_client_t* ext_client, const char* src, const char* dst)
  681. {
  682. jack_log("jack_connect");
  683. return (*jack_connect_fun)(ext_client, src, dst);
  684. }
  685. typedef int (*jack_disconnect_fun_def)(jack_client_t* ext_client, const char* src, const char* dst);
  686. static jack_disconnect_fun_def jack_disconnect_fun = 0;
  687. EXPORT int jack_disconnect(jack_client_t* ext_client, const char* src, const char* dst)
  688. {
  689. jack_log("jack_disconnect");
  690. return (*jack_disconnect_fun)(ext_client, src, dst);
  691. }
  692. typedef int (*jack_port_disconnect_fun_def)(jack_client_t* ext_client, jack_port_t* src);
  693. static jack_port_disconnect_fun_def jack_port_disconnect_fun = 0;
  694. EXPORT int jack_port_disconnect(jack_client_t* ext_client, jack_port_t* src)
  695. {
  696. jack_log("jack_port_disconnect");
  697. return (*jack_port_disconnect_fun)(ext_client, src);
  698. }
  699. typedef jack_nframes_t (*jack_get_sample_rate_fun_def)(jack_client_t* ext_client);
  700. static jack_get_sample_rate_fun_def jack_get_sample_rate_fun = 0;
  701. EXPORT jack_nframes_t jack_get_sample_rate(jack_client_t* ext_client)
  702. {
  703. jack_log("jack_get_sample_rate");
  704. return (*jack_get_sample_rate_fun)(ext_client);
  705. }
  706. typedef jack_nframes_t (*jack_get_buffer_size_fun_def)(jack_client_t* ext_client);
  707. static jack_get_buffer_size_fun_def jack_get_buffer_size_fun = 0;
  708. EXPORT jack_nframes_t jack_get_buffer_size(jack_client_t* ext_client)
  709. {
  710. jack_log("jack_get_buffer_size");
  711. return (*jack_get_buffer_size_fun)(ext_client);
  712. }
  713. 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);
  714. static jack_get_ports_fun_def jack_get_ports_fun = 0;
  715. EXPORT const char** jack_get_ports(jack_client_t* ext_client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags)
  716. {
  717. jack_log("jack_get_ports");
  718. return (*jack_get_ports_fun)(ext_client, port_name_pattern, type_name_pattern, flags);
  719. }
  720. typedef jack_port_t* (*jack_port_by_name_fun_def)(jack_client_t* ext_client, const char* portname);
  721. static jack_port_by_name_fun_def jack_port_by_name_fun = 0;
  722. EXPORT jack_port_t* jack_port_by_name(jack_client_t* ext_client, const char* portname)
  723. {
  724. jack_log("jack_port_by_name");
  725. return (*jack_port_by_name_fun)(ext_client, portname);
  726. }
  727. typedef jack_port_t* (*jack_port_by_id_fun_def)(jack_client_t* ext_client, jack_port_id_t id);
  728. static jack_port_by_id_fun_def jack_port_by_id_fun = 0;
  729. EXPORT jack_port_t* jack_port_by_id(jack_client_t* ext_client, jack_port_id_t id)
  730. {
  731. jack_log("jack_port_by_id");
  732. return (*jack_port_by_id_fun)(ext_client, id);
  733. }
  734. typedef int (*jack_engine_takeover_timebase_fun_def)(jack_client_t* ext_client);
  735. static jack_engine_takeover_timebase_fun_def jack_engine_takeover_timebase_fun = 0;
  736. EXPORT int jack_engine_takeover_timebase(jack_client_t* ext_client)
  737. {
  738. jack_log("jack_engine_takeover_timebase");
  739. return (*jack_engine_takeover_timebase_fun)(ext_client);
  740. }
  741. typedef jack_nframes_t (*jack_frames_since_cycle_start_fun_def)(const jack_client_t* ext_client);
  742. static jack_frames_since_cycle_start_fun_def jack_frames_since_cycle_start_fun = 0;
  743. EXPORT jack_nframes_t jack_frames_since_cycle_start(const jack_client_t* ext_client)
  744. {
  745. jack_log("jack_frames_since_cycle_start");
  746. return (*jack_frames_since_cycle_start_fun)(ext_client);
  747. }
  748. typedef jack_time_t (*jack_get_time_fun_def)();
  749. static jack_get_time_fun_def jack_get_time_fun = 0;
  750. EXPORT jack_time_t jack_get_time()
  751. {
  752. jack_log("jack_get_time");
  753. return (*jack_get_time_fun)();
  754. }
  755. typedef jack_nframes_t (*jack_time_to_frames_fun_def)(const jack_client_t* ext_client, jack_time_t time);
  756. static jack_time_to_frames_fun_def jack_time_to_frames_fun = 0;
  757. EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t* ext_client, jack_time_t time)
  758. {
  759. jack_log("jack_time_to_frames");
  760. return (*jack_time_to_frames_fun)(ext_client, time);
  761. }
  762. typedef jack_time_t (*jack_frames_to_time_fun_def)(const jack_client_t* ext_client, jack_nframes_t frames);
  763. static jack_frames_to_time_fun_def jack_frames_to_time_fun = 0;
  764. EXPORT jack_time_t jack_frames_to_time(const jack_client_t* ext_client, jack_nframes_t frames)
  765. {
  766. jack_log("jack_frames_to_time");
  767. return (*jack_frames_to_time_fun)(ext_client, frames);
  768. }
  769. typedef jack_nframes_t (*jack_frame_time_fun_def)(const jack_client_t* ext_client);
  770. static jack_frame_time_fun_def jack_frame_time_fun = 0;
  771. EXPORT jack_nframes_t jack_frame_time(const jack_client_t* ext_client)
  772. {
  773. jack_log("jack_frame_time");
  774. return (*jack_frame_time_fun)(ext_client);
  775. }
  776. typedef jack_nframes_t (*jack_last_frame_time_fun_def)(const jack_client_t* ext_client);
  777. static jack_last_frame_time_fun_def jack_last_frame_time_fun = 0;
  778. EXPORT jack_nframes_t jack_last_frame_time(const jack_client_t* ext_client)
  779. {
  780. jack_log("jack_last_frame_time");
  781. return (*jack_last_frame_time_fun)(ext_client);
  782. }
  783. typedef float (*jack_cpu_load_fun_def)(jack_client_t* ext_client);
  784. static jack_cpu_load_fun_def jack_cpu_load_fun = 0;
  785. EXPORT float jack_cpu_load(jack_client_t* ext_client)
  786. {
  787. jack_log("jack_cpu_load");
  788. return (*jack_cpu_load_fun)(ext_client);
  789. }
  790. typedef pthread_t (*jack_client_thread_id_fun_def)(jack_client_t* ext_client);
  791. static jack_client_thread_id_fun_def jack_client_thread_id_fun = 0;
  792. EXPORT pthread_t jack_client_thread_id(jack_client_t* ext_client)
  793. {
  794. jack_log("jack_client_thread_id");
  795. return (*jack_client_thread_id_fun)(ext_client);
  796. }
  797. typedef void (*jack_set_error_function_fun_def)(void (*func)(const char *));
  798. static jack_set_error_function_fun_def jack_set_error_function_fun = 0;
  799. EXPORT void jack_set_error_function(void (*func)(const char *))
  800. {
  801. jack_log("jack_set_error_function");
  802. if (gLibrary) {
  803. (*jack_set_error_function_fun)(func);
  804. } else {
  805. error_fun = func; // Keep the function
  806. }
  807. }
  808. typedef void (*jack_set_info_function_fun_def)(void (*func)(const char *));
  809. static jack_set_info_function_fun_def jack_set_info_function_fun = 0;
  810. EXPORT void jack_set_info_function(void (*func)(const char *))
  811. {
  812. jack_log("jack_set_info_function");
  813. if (gLibrary) {
  814. (*jack_set_error_function_fun)(func);
  815. } else {
  816. info_fun = func; // Keep the function
  817. }
  818. }
  819. typedef char* (*jack_get_client_name_fun_def)(jack_client_t* ext_client);
  820. static jack_get_client_name_fun_def jack_get_client_name_fun = 0;
  821. EXPORT char* jack_get_client_name (jack_client_t* ext_client)
  822. {
  823. jack_log("jack_get_client_name");
  824. return (*jack_get_client_name_fun)(ext_client);
  825. }
  826. typedef int (*jack_internal_client_new_fun_def)(const char *client_name,
  827. const char *load_name,
  828. const char *load_init);
  829. static jack_internal_client_new_fun_def jack_internal_client_new_fun = 0;
  830. EXPORT int jack_internal_client_new (const char *client_name,
  831. const char *load_name,
  832. const char *load_init)
  833. {
  834. jack_log("jack_internal_client_new");
  835. return (*jack_internal_client_new_fun)(client_name, load_name, load_init);
  836. }
  837. typedef void (*jack_internal_client_close_fun_def)(const char *client_name);
  838. static jack_internal_client_close_fun_def jack_internal_client_close_fun = 0;
  839. EXPORT void jack_internal_client_close (const char *client_name)
  840. {
  841. jack_log("jack_internal_client_close");
  842. (*jack_internal_client_close_fun)(client_name);
  843. }
  844. typedef int (*jack_client_name_size_fun_def)(void);
  845. static jack_client_name_size_fun_def jack_client_name_size_fun = 0;
  846. EXPORT int jack_client_name_size(void)
  847. {
  848. jack_log("jack_client_name_size");
  849. return (*jack_client_name_size_fun)();
  850. }
  851. typedef int (*jack_port_name_size_fun_def)(void);
  852. static jack_port_name_size_fun_def jack_port_name_size_fun = 0;
  853. EXPORT int jack_port_name_size(void)
  854. {
  855. jack_log("jack_port_name_size");
  856. return (*jack_port_name_size_fun)();
  857. }
  858. typedef int (*jack_port_type_size_fun_def)(void);
  859. static jack_port_type_size_fun_def jack_port_type_size_fun = 0;
  860. EXPORT int jack_port_type_size(void)
  861. {
  862. jack_log("jack_port_type_size");
  863. return (*jack_port_type_size_fun)();
  864. }
  865. // transport.h
  866. typedef int (*jack_release_timebase_fun_def)(jack_client_t* ext_client);
  867. static jack_release_timebase_fun_def jack_release_timebase_fun = 0;
  868. EXPORT int jack_release_timebase(jack_client_t* ext_client)
  869. {
  870. jack_log("jack_release_timebase");
  871. return (*jack_release_timebase_fun)(ext_client);
  872. }
  873. typedef int (*jack_set_sync_callback_fun_def)(jack_client_t* ext_client, JackSyncCallback sync_callback, void *arg);
  874. static jack_set_sync_callback_fun_def jack_set_sync_callback_fun = 0;
  875. EXPORT int jack_set_sync_callback(jack_client_t* ext_client, JackSyncCallback sync_callback, void *arg)
  876. {
  877. jack_log("jack_set_sync_callback");
  878. return (*jack_set_sync_callback_fun)(ext_client, sync_callback, arg);
  879. }
  880. typedef int (*jack_set_sync_timeout_fun_def)(jack_client_t* ext_client, jack_time_t timeout);
  881. static jack_set_sync_timeout_fun_def jack_set_sync_timeout_fun = 0;
  882. EXPORT int jack_set_sync_timeout(jack_client_t* ext_client, jack_time_t timeout)
  883. {
  884. jack_log("jack_set_sync_timeout");
  885. return (*jack_set_sync_timeout_fun)(ext_client, timeout);
  886. }
  887. typedef int (*jack_set_timebase_callback_fun_def)(jack_client_t* ext_client, int conditional, JackTimebaseCallback timebase_callback, void* arg);
  888. static jack_set_timebase_callback_fun_def jack_set_timebase_callback_fun = 0;
  889. EXPORT int jack_set_timebase_callback(jack_client_t* ext_client, int conditional, JackTimebaseCallback timebase_callback, void* arg)
  890. {
  891. jack_log("jack_set_timebase_callback");
  892. return (*jack_set_timebase_callback_fun)(ext_client, conditional, timebase_callback, arg);
  893. }
  894. typedef int (*jack_transport_locate_fun_def)(jack_client_t* ext_client, jack_nframes_t frame);
  895. static jack_transport_locate_fun_def jack_transport_locate_fun = 0;
  896. EXPORT int jack_transport_locate(jack_client_t* ext_client, jack_nframes_t frame)
  897. {
  898. jack_log("jack_transport_locate");
  899. return (*jack_transport_locate_fun)(ext_client, frame);
  900. }
  901. typedef jack_transport_state_t (*jack_transport_query_fun_def)(const jack_client_t* ext_client, jack_position_t* pos);
  902. static jack_transport_query_fun_def jack_transport_query_fun = 0;
  903. EXPORT jack_transport_state_t jack_transport_query(const jack_client_t* ext_client, jack_position_t* pos)
  904. {
  905. jack_log("jack_transport_query");
  906. return (*jack_transport_query_fun)(ext_client, pos);
  907. }
  908. typedef jack_nframes_t (*jack_get_current_transport_frame_fun_def)(const jack_client_t* ext_client);
  909. static jack_get_current_transport_frame_fun_def jack_get_current_transport_frame_fun = 0;
  910. EXPORT jack_nframes_t jack_get_current_transport_frame(const jack_client_t* ext_client)
  911. {
  912. jack_log("jack_get_current_transport_frame");
  913. return (*jack_get_current_transport_frame_fun)(ext_client);
  914. }
  915. typedef int (*jack_transport_reposition_fun_def)(jack_client_t* ext_client, jack_position_t* pos);
  916. static jack_transport_reposition_fun_def jack_transport_reposition_fun = 0;
  917. EXPORT int jack_transport_reposition(jack_client_t* ext_client, jack_position_t* pos)
  918. {
  919. jack_log("jack_transport_reposition");
  920. return (*jack_transport_reposition_fun)(ext_client, pos);
  921. }
  922. typedef void (*jack_transport_start_fun_def)(jack_client_t* ext_client);
  923. static jack_transport_start_fun_def jack_transport_start_fun = 0;
  924. EXPORT void jack_transport_start(jack_client_t* ext_client)
  925. {
  926. jack_log("jack_transport_start");
  927. (*jack_transport_start_fun)(ext_client);
  928. }
  929. typedef void (*jack_transport_stop_fun_def)(jack_client_t* ext_client);
  930. static jack_transport_stop_fun_def jack_transport_stop_fun = 0;
  931. EXPORT void jack_transport_stop(jack_client_t* ext_client)
  932. {
  933. jack_log("jack_transport_stop");
  934. (*jack_transport_stop_fun)(ext_client);
  935. }
  936. // deprecated
  937. typedef void (*jack_get_transport_info_fun_def)(jack_client_t* ext_client, jack_transport_info_t* tinfo);
  938. static jack_get_transport_info_fun_def jack_get_transport_info_fun = 0;
  939. EXPORT void jack_get_transport_info(jack_client_t* ext_client, jack_transport_info_t* tinfo)
  940. {
  941. jack_log("jack_get_transport_info");
  942. (*jack_get_transport_info_fun)(ext_client, tinfo);
  943. }
  944. typedef void (*jack_set_transport_info_fun_def)(jack_client_t* ext_client, jack_transport_info_t* tinfo);
  945. static jack_set_transport_info_fun_def jack_set_transport_info_fun = 0;
  946. EXPORT void jack_set_transport_info(jack_client_t* ext_client, jack_transport_info_t* tinfo)
  947. {
  948. jack_log("jack_set_transport_info");
  949. (*jack_set_transport_info_fun)(ext_client, tinfo);
  950. }
  951. // statistics.h
  952. typedef float (*jack_get_max_delayed_usecs_fun_def)(jack_client_t* ext_client);
  953. static jack_get_max_delayed_usecs_fun_def jack_get_max_delayed_usecs_fun = 0;
  954. EXPORT float jack_get_max_delayed_usecs(jack_client_t* ext_client)
  955. {
  956. jack_log("jack_get_max_delayed_usecs");
  957. return (*jack_get_max_delayed_usecs_fun)(ext_client);
  958. }
  959. typedef float (*jack_get_xrun_delayed_usecs_fun_def)(jack_client_t* ext_client);
  960. static jack_get_xrun_delayed_usecs_fun_def jack_get_xrun_delayed_usecs_fun = 0;
  961. EXPORT float jack_get_xrun_delayed_usecs(jack_client_t* ext_client)
  962. {
  963. jack_log("jack_get_xrun_delayed_usecs");
  964. return (*jack_get_xrun_delayed_usecs_fun)(ext_client);
  965. }
  966. typedef void (*jack_reset_max_delayed_usecs_fun_def)(jack_client_t* ext_client);
  967. static jack_reset_max_delayed_usecs_fun_def jack_reset_max_delayed_usecs_fun = 0;
  968. EXPORT void jack_reset_max_delayed_usecs(jack_client_t* ext_client)
  969. {
  970. jack_log("jack_reset_max_delayed_usecs");
  971. (*jack_reset_max_delayed_usecs_fun)(ext_client);
  972. }
  973. // thread.h
  974. typedef int (*jack_acquire_real_time_scheduling_fun_def)(pthread_t thread, int priority);
  975. static jack_acquire_real_time_scheduling_fun_def jack_acquire_real_time_scheduling_fun = 0;
  976. EXPORT int jack_acquire_real_time_scheduling(pthread_t thread, int priority)
  977. {
  978. jack_log("jack_acquire_real_time_scheduling");
  979. return (*jack_acquire_real_time_scheduling_fun)(thread, priority);
  980. }
  981. typedef void *(*start_routine)(void*);
  982. typedef int (*jack_client_create_thread_fun_def)(jack_client_t* client,
  983. pthread_t *thread,
  984. int priority,
  985. int realtime, // boolean
  986. start_routine callback,
  987. void *arg);
  988. static jack_client_create_thread_fun_def jack_client_create_thread_fun = 0;
  989. EXPORT int jack_client_create_thread(jack_client_t* client,
  990. pthread_t *thread,
  991. int priority,
  992. int realtime, // boolean
  993. start_routine callback,
  994. void *arg)
  995. {
  996. jack_log("jack_client_create_thread");
  997. return (*jack_client_create_thread_fun)(client, thread, priority, realtime, callback, arg);
  998. }
  999. typedef int (*jack_drop_real_time_scheduling_fun_def)(pthread_t thread);
  1000. static jack_drop_real_time_scheduling_fun_def jack_drop_real_time_scheduling_fun = 0;
  1001. EXPORT int jack_drop_real_time_scheduling(pthread_t thread)
  1002. {
  1003. jack_log("jack_client_create_thread");
  1004. return (*jack_drop_real_time_scheduling_fun)(thread);
  1005. }
  1006. // intclient.h
  1007. typedef char* (*jack_get_internal_client_name_fun_def)(jack_client_t* ext_client, jack_intclient_t intclient);
  1008. static jack_get_internal_client_name_fun_def jack_get_internal_client_name_fun = 0;
  1009. EXPORT char* jack_get_internal_client_name(jack_client_t* ext_client, jack_intclient_t intclient)
  1010. {
  1011. jack_log("jack_get_internal_client_name");
  1012. return (*jack_get_internal_client_name_fun)(ext_client, intclient);
  1013. }
  1014. typedef jack_intclient_t (*jack_internal_client_handle_fun_def)(jack_client_t* ext_client, const char* client_name, jack_status_t* status);
  1015. static jack_internal_client_handle_fun_def jack_internal_client_handle_fun = 0;
  1016. EXPORT jack_intclient_t jack_internal_client_handle(jack_client_t* ext_client, const char* client_name, jack_status_t* status)
  1017. {
  1018. jack_log("jack_internal_client_handle");
  1019. return (*jack_internal_client_handle_fun)(ext_client, client_name, status);
  1020. }
  1021. 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);
  1022. static jack_internal_client_load_aux_fun_def jack_internal_client_load_aux_fun = 0;
  1023. 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, ...)
  1024. {
  1025. jack_log("jack_internal_client_load");
  1026. va_list ap;
  1027. va_start(ap, status);
  1028. jack_intclient_t res = (*jack_internal_client_load_aux_fun)(ext_client, client_name, options, status, ap);
  1029. va_end(ap);
  1030. return res;
  1031. }
  1032. typedef jack_status_t (*jack_internal_client_unload_fun_def)(jack_client_t* ext_client, jack_intclient_t intclient);
  1033. static jack_internal_client_unload_fun_def jack_internal_client_unload_fun = 0;
  1034. EXPORT jack_status_t jack_internal_client_unload(jack_client_t* ext_client, jack_intclient_t intclient)
  1035. {
  1036. jack_log("jack_internal_client_unload");
  1037. return (*jack_internal_client_unload_fun)(ext_client, intclient);
  1038. }
  1039. typedef jack_client_t * (*jack_client_open_aux_fun_def)(const char *ext_client_name, jack_options_t options, jack_status_t *status, va_list ap);
  1040. static jack_client_open_aux_fun_def jack_client_open_aux_fun = 0;
  1041. EXPORT jack_client_t * jack_client_open(const char *ext_client_name, jack_options_t options, jack_status_t *status, ...)
  1042. {
  1043. jack_log("jack_client_open");
  1044. // Library check...
  1045. if (open_library()) {
  1046. va_list ap;
  1047. va_start(ap, status);
  1048. jack_client_t* res = (*jack_client_open_aux_fun)(ext_client_name, options, status, ap);
  1049. va_end(ap);
  1050. return res;
  1051. } else {
  1052. jack_varargs_t va; // variable arguments
  1053. jack_status_t my_status;
  1054. char client_name[JACK_CLIENT_NAME_SIZE];
  1055. if (ext_client_name == NULL) {
  1056. jack_log("jack_client_open called with a NULL client_name");
  1057. return NULL;
  1058. }
  1059. RewriteName(ext_client_name, client_name);
  1060. if (status == NULL) // no status from caller?
  1061. status = &my_status; // use local status word
  1062. *status = (jack_status_t)0;
  1063. // validate parameters
  1064. if ((options & ~JackOpenOptions)) {
  1065. int my_status1 = *status | (JackFailure | JackInvalidOption);
  1066. *status = (jack_status_t)my_status1;
  1067. return NULL;
  1068. }
  1069. // parse variable arguments
  1070. va_list ap;
  1071. va_start(ap, status);
  1072. jack_varargs_parse(options, ap, &va);
  1073. va_end(ap);
  1074. if (start_server(va.server_name, options)) {
  1075. int my_status1 = *status | JackFailure | JackServerFailed;
  1076. *status = (jack_status_t)my_status1;
  1077. return NULL;
  1078. } else if (open_library()) {
  1079. va_list ap;
  1080. va_start(ap, status);
  1081. jack_client_t* res = (*jack_client_open_aux_fun)(ext_client_name, options, status, ap);
  1082. va_end(ap);
  1083. return res;
  1084. } else {
  1085. return NULL;
  1086. }
  1087. }
  1088. }
  1089. typedef jack_client_t * (*jack_client_new_fun_def)(const char *client_name);
  1090. static jack_client_new_fun_def jack_client_new_fun = 0;
  1091. EXPORT jack_client_t * jack_client_new(const char *client_name)
  1092. {
  1093. jack_log("jack_client_new");
  1094. // Library check...
  1095. if (!open_library())
  1096. return 0;
  1097. return (*jack_client_new_fun)(client_name);
  1098. }
  1099. typedef int (*jack_client_close_fun_def)(jack_client_t *client);
  1100. static jack_client_close_fun_def jack_client_close_fun = 0;
  1101. EXPORT int jack_client_close(jack_client_t *client)
  1102. {
  1103. jack_log("jack_client_close");
  1104. if (client) {
  1105. int res = (*jack_client_close_fun)(client);
  1106. close_library();
  1107. return res;
  1108. } else {
  1109. return -1;
  1110. }
  1111. }
  1112. // MIDI
  1113. typedef jack_nframes_t (*jack_midi_get_event_count_fun_def)(void* port_buffer);
  1114. static jack_midi_get_event_count_fun_def jack_midi_get_event_count_fun = 0;
  1115. EXPORT jack_nframes_t jack_midi_get_event_count(void* port_buffer)
  1116. {
  1117. jack_log("jack_midi_get_event_count");
  1118. return (*jack_midi_get_event_count_fun)(port_buffer);
  1119. }
  1120. typedef int (*jack_midi_event_get_fun_def)(void* port_buffer);
  1121. static jack_midi_event_get_fun_def jack_midi_event_get_fun = 0;
  1122. EXPORT int jack_midi_event_get(void* port_buffer)
  1123. {
  1124. jack_log("jack_midi_get_event_count");
  1125. return (*jack_midi_event_get_fun)(port_buffer);
  1126. }
  1127. typedef void (*jack_midi_clear_buffer_fun_def)(void* port_buffer);
  1128. static jack_midi_clear_buffer_fun_def jack_midi_clear_buffer_fun = 0;
  1129. EXPORT void jack_midi_clear_buffer(void* port_buffer)
  1130. {
  1131. jack_log("jack_midi_clear_buffer");
  1132. (*jack_midi_clear_buffer_fun)(port_buffer);
  1133. }
  1134. typedef size_t (*jack_midi_max_event_size_fun_def)(void* port_buffer);
  1135. static jack_midi_max_event_size_fun_def jack_midi_max_event_size_fun = 0;
  1136. EXPORT size_t jack_midi_max_event_size(void* port_buffer)
  1137. {
  1138. jack_log("jack_midi_max_event_size");
  1139. return (*jack_midi_max_event_size_fun)(port_buffer);
  1140. }
  1141. typedef jack_midi_data_t* (*jack_midi_event_reserve_fun_def)(void* port_buffer, jack_nframes_t time, size_t data_size);
  1142. static jack_midi_event_reserve_fun_def jack_midi_event_reserve_fun = 0;
  1143. EXPORT jack_midi_data_t* jack_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size)
  1144. {
  1145. jack_log("jack_midi_event_reserve");
  1146. return (*jack_midi_event_reserve_fun)(port_buffer, time, data_size);
  1147. }
  1148. typedef int (*jack_midi_event_write_fun_def)(void* port_buffer, jack_nframes_t time, const jack_midi_data_t *data, size_t data_size);
  1149. static jack_midi_event_write_fun_def jack_midi_event_write_fun = 0;
  1150. EXPORT int jack_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t *data, size_t data_size)
  1151. {
  1152. jack_log("jack_midi_event_write");
  1153. return (*jack_midi_event_write_fun)(port_buffer, time, data, data_size);
  1154. }
  1155. typedef jack_nframes_t (*jack_midi_get_lost_event_count_fun_def)(void *port_buffer);
  1156. static jack_midi_get_lost_event_count_fun_def jack_midi_get_lost_event_count_fun = 0;
  1157. EXPORT jack_nframes_t jack_midi_get_lost_event_count(void* port_buffer)
  1158. {
  1159. jack_log("jack_midi_get_lost_event_count");
  1160. return (*jack_midi_get_lost_event_count_fun)(port_buffer);
  1161. }
  1162. // Library loader
  1163. static bool get_jack_library_in_directory(const char* dir_name, const char* library_name, char* library_res_name)
  1164. {
  1165. jack_log("get_jack_library_in_directory");
  1166. struct dirent * dir_entry;
  1167. DIR * dir_stream = opendir(dir_name);
  1168. if (!dir_stream)
  1169. return false;
  1170. while ((dir_entry = readdir(dir_stream))) {
  1171. if (strncmp(library_name, dir_entry->d_name, strlen(library_name)) == 0) {
  1172. jack_log("found");
  1173. sprintf(library_res_name, "%s/%s", dir_name, dir_entry->d_name);
  1174. closedir(dir_stream);
  1175. return true;
  1176. }
  1177. }
  1178. closedir(dir_stream);
  1179. return false;
  1180. }
  1181. static bool get_jack_library(const char* library_name, char* library_res_name)
  1182. {
  1183. if (get_jack_library_in_directory("/usr/lib", library_name, library_res_name))
  1184. return true;
  1185. if (get_jack_library_in_directory("/usr/local/lib", library_name, library_res_name))
  1186. return true;
  1187. return false;
  1188. }
  1189. static void close_library()
  1190. {
  1191. jack_log("close_library");
  1192. if (gLibrary) {
  1193. dlclose(gLibrary);
  1194. gLibrary = 0;
  1195. }
  1196. }
  1197. static bool check_client(void* library)
  1198. {
  1199. jack_client_t* client = 0;
  1200. jack_log("check_client");
  1201. // Get "new" and "close" entry points...
  1202. jack_client_new_fun = (jack_client_new_fun_def)dlsym(library, "jack_client_new");
  1203. jack_client_close_fun = (jack_client_close_fun_def)dlsym(library, "jack_client_close");
  1204. // Try opening a client...
  1205. if ((client = (*jack_client_new_fun)("dummy"))) { // server is running....
  1206. jack_log("check_client 1 %x", jack_client_close_fun);
  1207. (*jack_client_close_fun)(client);
  1208. jack_log("check_client 2");
  1209. return true;
  1210. } else {
  1211. jack_log("check_client failure...");
  1212. return false;
  1213. }
  1214. }
  1215. static bool open_library()
  1216. {
  1217. char library_res_name[256];
  1218. char* jack_debug_var = getenv("JACK_WRAPPER_DEBUG");
  1219. jack_debug = (jack_debug_var && strcmp(jack_debug_var, "on") == 0);
  1220. void* jackLibrary = (get_jack_library(JACK_LIB, library_res_name)) ? dlopen(library_res_name, RTLD_LAZY) : 0;
  1221. void* jackmpLibrary = (get_jack_library(JACKMP_LIB, library_res_name)) ? dlopen(library_res_name, RTLD_LAZY) : 0;
  1222. if (jackLibrary) {
  1223. jack_log("testjackLibrary");
  1224. if (check_client(jackLibrary)) { // jackd is running...
  1225. jack_log("jackd is running");
  1226. gLibrary = jackLibrary;
  1227. if (jackmpLibrary)
  1228. dlclose(jackmpLibrary);
  1229. } else if (check_client(jackmpLibrary)) { // jackdmp is running...
  1230. jack_log("jackdmp is running");
  1231. gLibrary = jackmpLibrary;
  1232. if (jackLibrary)
  1233. dlclose(jackLibrary);
  1234. } else {
  1235. goto error;
  1236. }
  1237. } else if (jackmpLibrary) {
  1238. jack_log("test jackmpLibrary");
  1239. if (check_client(jackmpLibrary)) { // jackd is running...
  1240. jack_log("jackdmp is running");
  1241. gLibrary = jackmpLibrary;
  1242. } else {
  1243. goto error;
  1244. }
  1245. } else {
  1246. jack_log("Jack libraries not found, failure...");
  1247. goto error;
  1248. }
  1249. // Load entry points...
  1250. jack_client_open_aux_fun = (jack_client_open_aux_fun_def)dlsym(gLibrary, "jack_client_open_aux");
  1251. jack_client_new_fun = (jack_client_new_fun_def)dlsym(gLibrary, "jack_client_new");
  1252. jack_client_close_fun = (jack_client_close_fun_def)dlsym(gLibrary, "jack_client_close");
  1253. jack_client_name_size_fun = (jack_client_name_size_fun_def)dlsym(gLibrary, "jack_client_name_size");
  1254. jack_get_client_name_fun = (jack_get_client_name_fun_def)dlsym(gLibrary, "jack_get_client_name");
  1255. jack_internal_client_new_fun = (jack_internal_client_new_fun_def)dlsym(gLibrary, "jack_internal_client_new");
  1256. jack_internal_client_close_fun = (jack_internal_client_close_fun_def)dlsym(gLibrary, "jack_internal_client_close");
  1257. jack_is_realtime_fun = (jack_is_realtime_fun_def)dlsym(gLibrary, "jack_is_realtime");
  1258. jack_on_shutdown_fun = (jack_on_shutdown_fun_def)dlsym(gLibrary, "jack_on_shutdown");
  1259. jack_set_process_callback_fun = (jack_set_process_callback_fun_def)dlsym(gLibrary, "jack_set_process_callback");
  1260. jack_thread_wait_fun = (jack_thread_wait_fun_def)dlsym(gLibrary, "jack_thread_wait");
  1261. jack_cycle_wait_fun = (jack_cycle_wait_fun_def)dlsym(gLibrary, "jack_cycle_wait");
  1262. jack_cycle_signal_fun = (jack_cycle_signal_fun_def)dlsym(gLibrary, "jack_cycle_signal");
  1263. jack_set_process_thread_fun = (jack_set_process_thread_fun_def)dlsym(gLibrary, "jack_set_process_thread");
  1264. jack_set_thread_init_callback_fun = (jack_set_thread_init_callback_fun_def)dlsym(gLibrary, "jack_set_thread_init_callback");
  1265. jack_set_freewheel_callback_fun = (jack_set_freewheel_callback_fun_def)dlsym(gLibrary, "jack_set_freewheel_callback");
  1266. jack_set_freewheel_fun = (jack_set_freewheel_fun_def)dlsym(gLibrary, "jack_set_freewheel");
  1267. jack_set_buffer_size_fun = (jack_set_buffer_size_fun_def)dlsym(gLibrary, "jack_set_buffer_size");
  1268. jack_set_buffer_size_callback_fun = (jack_set_buffer_size_callback_fun_def)dlsym(gLibrary, "jack_set_buffer_size_callback");
  1269. jack_set_sample_rate_callback_fun = (jack_set_sample_rate_callback_fun_def)dlsym(gLibrary, "jack_set_sample_rate_callback");
  1270. jack_set_client_registration_callback_fun = (jack_set_client_registration_callback_fun_def)dlsym(gLibrary, "jack_set_client_registration_callback");
  1271. jack_set_port_registration_callback_fun = (jack_set_port_registration_callback_fun_def)dlsym(gLibrary, "jack_set_port_registration_callback");
  1272. jack_set_port_connect_callback_fun = (jack_set_port_connect_callback_fun_def)dlsym(gLibrary, "jack_set_port_connect_callback");
  1273. jack_set_graph_order_callback_fun = (jack_set_graph_order_callback_fun_def)dlsym(gLibrary, "jack_set_graph_order_callback");
  1274. jack_set_xrun_callback_fun = (jack_set_xrun_callback_fun_def)dlsym(gLibrary, "jack_set_xrun_callback");
  1275. jack_activate_fun = (jack_activate_fun_def)dlsym(gLibrary, "jack_activate");
  1276. jack_deactivate_fun = (jack_deactivate_fun_def)dlsym(gLibrary, "jack_deactivate");
  1277. jack_port_register_fun = (jack_port_register_fun_def)dlsym(gLibrary, "jack_port_register");
  1278. jack_port_unregister_fun = (jack_port_unregister_fun_def)dlsym(gLibrary, "jack_port_unregister");
  1279. jack_port_get_buffer_fun = (jack_port_get_buffer_fun_def)dlsym(gLibrary, "jack_port_get_buffer");
  1280. jack_port_name_fun = (jack_port_name_fun_def)dlsym(gLibrary, "jack_port_name");
  1281. jack_port_short_name_fun = (jack_port_short_name_fun_def)dlsym(gLibrary, "jack_port_short_name");
  1282. jack_port_flags_fun = (jack_port_flags_fun_def)dlsym(gLibrary, "jack_port_flags");
  1283. jack_port_type_fun = (jack_port_type_fun_def)dlsym(gLibrary, "jack_port_type");
  1284. jack_port_is_mine_fun = (jack_port_is_mine_fun_def)dlsym(gLibrary, "jack_port_is_mine");
  1285. jack_port_connected_fun = (jack_port_connected_fun_def)dlsym(gLibrary, "jack_port_connected");
  1286. jack_port_connected_to_fun = (jack_port_connected_to_fun_def)dlsym(gLibrary, "jack_port_connected_to");
  1287. jack_port_get_connections_fun = (jack_port_get_connections_fun_def)dlsym(gLibrary, "jack_port_get_connections");
  1288. jack_port_get_all_connections_fun = (jack_port_get_all_connections_fun_def)dlsym(gLibrary, "jack_port_get_all_connections");
  1289. jack_port_tie_fun = (jack_port_tie_fun_def)dlsym(gLibrary, "jack_port_tie");
  1290. jack_port_untie_fun = (jack_port_untie_fun_def)dlsym(gLibrary, "jack_port_untie");
  1291. jack_port_get_latency_fun = (jack_port_get_latency_fun_def)dlsym(gLibrary, "jack_port_get_latency");
  1292. jack_port_get_total_latency_fun = (jack_port_get_total_latency_fun_def)dlsym(gLibrary, "jack_port_get_total_latency");
  1293. jack_port_set_latency_fun = (jack_port_set_latency_fun_def)dlsym(gLibrary, "jack_port_set_latency");
  1294. jack_recompute_total_latency_fun = (jack_recompute_total_latency_fun_def)dlsym(gLibrary, "jack_recompute_total_latency");
  1295. jack_recompute_total_latencies_fun = (jack_recompute_total_latencies_fun_def)dlsym(gLibrary, "jack_recompute_total_latencies");
  1296. jack_port_set_name_fun = (jack_port_set_name_fun_def)dlsym(gLibrary, "jack_port_set_name");
  1297. jack_port_set_alias_fun = (jack_port_set_alias_fun_def)dlsym(gLibrary, "jack_port_set_alias");
  1298. jack_port_unset_alias_fun = (jack_port_unset_alias_fun_def)dlsym(gLibrary, "jack_port_unset_alias");
  1299. jack_port_get_aliases_fun = (jack_port_get_aliases_fun_def)dlsym(gLibrary, "jack_port_get_aliases");
  1300. jack_port_request_monitor_fun = (jack_port_request_monitor_fun_def)dlsym(gLibrary, "jack_port_request_monitor");
  1301. jack_port_request_monitor_by_name_fun = (jack_port_request_monitor_by_name_fun_def)dlsym(gLibrary, "jack_port_request_monitor_by_name");
  1302. jack_port_ensure_monitor_fun = (jack_port_ensure_monitor_fun_def)dlsym(gLibrary, "jack_port_ensure_monitor");
  1303. jack_port_monitoring_input_fun = (jack_port_monitoring_input_fun_def)dlsym(gLibrary, "jack_port_monitoring_input");
  1304. jack_connect_fun = (jack_connect_fun_def)dlsym(gLibrary, "jack_connect");
  1305. jack_disconnect_fun = (jack_disconnect_fun_def)dlsym(gLibrary, "jack_disconnect");
  1306. jack_port_disconnect_fun = (jack_port_disconnect_fun_def)dlsym(gLibrary, "jack_port_disconnect");
  1307. jack_port_name_size_fun = (jack_port_name_size_fun_def)dlsym(gLibrary, "jack_port_name_size");
  1308. jack_port_type_size_fun = (jack_port_type_size_fun_def)dlsym(gLibrary, "jack_port_type_size");
  1309. jack_get_sample_rate_fun = (jack_get_sample_rate_fun_def)dlsym(gLibrary, "jack_get_sample_rate");
  1310. jack_get_buffer_size_fun = (jack_get_buffer_size_fun_def)dlsym(gLibrary, "jack_get_buffer_size");
  1311. jack_get_ports_fun = (jack_get_ports_fun_def)dlsym(gLibrary, "jack_get_ports");
  1312. jack_port_by_name_fun = (jack_port_by_name_fun_def)dlsym(gLibrary, "jack_port_by_name");
  1313. jack_port_by_id_fun = (jack_port_by_id_fun_def)dlsym(gLibrary, "jack_port_by_id");
  1314. jack_engine_takeover_timebase_fun = (jack_engine_takeover_timebase_fun_def)dlsym(gLibrary, "jack_engine_takeover_timebase");
  1315. jack_frames_since_cycle_start_fun = (jack_frames_since_cycle_start_fun_def)dlsym(gLibrary, "jack_frames_since_cycle_start");
  1316. jack_get_time_fun = (jack_get_time_fun_def)dlsym(gLibrary, "jack_get_time");
  1317. jack_time_to_frames_fun = (jack_time_to_frames_fun_def)dlsym(gLibrary, "jack_time_to_frames");
  1318. jack_frames_to_time_fun = (jack_frames_to_time_fun_def)dlsym(gLibrary, "jack_frames_to_time");
  1319. jack_frame_time_fun = (jack_frame_time_fun_def)dlsym(gLibrary, "jack_frame_time");
  1320. jack_last_frame_time_fun = (jack_last_frame_time_fun_def)dlsym(gLibrary, "jack_last_frame_time");
  1321. jack_cpu_load_fun = (jack_cpu_load_fun_def)dlsym(gLibrary, "jack_cpu_load");
  1322. jack_client_thread_id_fun = (jack_client_thread_id_fun_def)dlsym(gLibrary, "jack_client_thread_id");
  1323. jack_set_error_function_fun = (jack_set_error_function_fun_def)dlsym(gLibrary, "jack_set_error_function");
  1324. jack_set_info_function_fun = (jack_set_info_function_fun_def)dlsym(gLibrary, "jack_set_info_function");
  1325. jack_get_max_delayed_usecs_fun = (jack_get_max_delayed_usecs_fun_def)dlsym(gLibrary, "jack_get_max_delayed_usecs");
  1326. jack_get_xrun_delayed_usecs_fun = (jack_get_xrun_delayed_usecs_fun_def)dlsym(gLibrary, "jack_get_xrun_delayed_usecs");
  1327. jack_reset_max_delayed_usecs_fun = (jack_reset_max_delayed_usecs_fun_def)dlsym(gLibrary, "jack_reset_max_delayed_usecs");
  1328. jack_release_timebase_fun = (jack_release_timebase_fun_def)dlsym(gLibrary, "jack_release_timebase");
  1329. jack_set_sync_callback_fun = (jack_set_sync_callback_fun_def)dlsym(gLibrary, "jack_set_sync_callback");
  1330. jack_set_sync_timeout_fun = (jack_set_sync_timeout_fun_def)dlsym(gLibrary, "jack_set_sync_timeout");
  1331. jack_set_timebase_callback_fun = (jack_set_timebase_callback_fun_def)dlsym(gLibrary, "jack_set_timebase_callback");
  1332. jack_transport_locate_fun = (jack_transport_locate_fun_def)dlsym(gLibrary, "jack_transport_locate");
  1333. jack_transport_query_fun = (jack_transport_query_fun_def)dlsym(gLibrary, "jack_transport_query");
  1334. jack_get_current_transport_frame_fun = (jack_get_current_transport_frame_fun_def)dlsym(gLibrary, "jack_get_current_transport_frame");
  1335. jack_transport_reposition_fun = (jack_transport_reposition_fun_def)dlsym(gLibrary, "jack_transport_reposition");
  1336. jack_transport_start_fun = (jack_transport_start_fun_def)dlsym(gLibrary, "jack_transport_start");
  1337. jack_transport_stop_fun = (jack_transport_stop_fun_def)dlsym(gLibrary, "jack_transport_stop");
  1338. jack_get_transport_info_fun = (jack_get_transport_info_fun_def)dlsym(gLibrary, "jack_get_transport_info");
  1339. jack_set_transport_info_fun = (jack_set_transport_info_fun_def)dlsym(gLibrary, "jack_set_transport_info");
  1340. jack_acquire_real_time_scheduling_fun = (jack_acquire_real_time_scheduling_fun_def)dlsym(gLibrary, "jack_acquire_real_time_scheduling");
  1341. jack_client_create_thread_fun = (jack_client_create_thread_fun_def)dlsym(gLibrary, "jack_client_create_thread");
  1342. jack_drop_real_time_scheduling_fun = (jack_drop_real_time_scheduling_fun_def)dlsym(gLibrary, "jack_drop_real_time_scheduling");
  1343. jack_get_internal_client_name_fun = (jack_get_internal_client_name_fun_def)dlsym(gLibrary, "jack_get_internal_client_name");
  1344. jack_internal_client_handle_fun = (jack_internal_client_handle_fun_def)dlsym(gLibrary, "jack_internal_client_handle");
  1345. jack_internal_client_load_aux_fun = (jack_internal_client_load_aux_fun_def)dlsym(gLibrary, "jack_internal_client_load_aux");
  1346. jack_internal_client_unload_fun = (jack_internal_client_unload_fun_def)dlsym(gLibrary, "jack_internal_client_unload");
  1347. // MIDI
  1348. jack_midi_get_event_count_fun = (jack_midi_get_event_count_fun_def)dlsym(gLibrary, "jack_midi_get_event_count");
  1349. jack_midi_event_get_fun = (jack_midi_event_get_fun_def)dlsym(gLibrary, "jack_midi_event_get");
  1350. jack_midi_clear_buffer_fun = (jack_midi_clear_buffer_fun_def)dlsym(gLibrary, "jack_midi_clear_buffer");
  1351. jack_midi_max_event_size_fun = (jack_midi_max_event_size_fun_def)dlsym(gLibrary, "jack_midi_max_event_size");
  1352. jack_midi_event_reserve_fun = (jack_midi_event_reserve_fun_def)dlsym(gLibrary, "jack_midi_event_reserve");
  1353. jack_midi_event_write_fun = (jack_midi_event_write_fun_def)dlsym(gLibrary, "jack_midi_event_write");
  1354. jack_midi_get_lost_event_count_fun = (jack_midi_get_lost_event_count_fun_def)dlsym(gLibrary, "jack_midi_get_lost_event_count");
  1355. // Functions were kept...
  1356. if (error_fun)
  1357. jack_set_error_function_fun(error_fun);
  1358. if (info_fun)
  1359. jack_set_info_function_fun(info_fun);
  1360. jack_log("init_library OK");
  1361. return true;
  1362. error:
  1363. if (jackLibrary)
  1364. dlclose(jackLibrary);
  1365. if (jackmpLibrary)
  1366. dlclose(jackmpLibrary);
  1367. gLibrary = 0;
  1368. return false;
  1369. }