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.

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