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.

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