ASIO to JACK driver for WINE
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.

1216 lines
46KB

  1. /*
  2. * JackBridge for DPF
  3. * Copyright (C) 2013-2025 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for any purpose with
  6. * or without fee is hereby granted, provided that the above copyright notice and this
  7. * permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
  10. * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
  11. * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  12. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
  13. * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  14. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include "jackbridge.h"
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <windows.h>
  20. #include <dlfcn.h>
  21. #include <errno.h>
  22. typedef unsigned long ulong;
  23. // --------------------------------------------------------------------------------------------------------------------
  24. typedef void (*JackSymLatencyCallback)(jack_latency_callback_mode_t, void*);
  25. typedef int (*JackSymProcessCallback)(jack_nframes_t, void*);
  26. typedef void (*JackSymThreadInitCallback)(void*);
  27. typedef int (*JackSymGraphOrderCallback)(void*);
  28. typedef int (*JackSymXRunCallback)(void*);
  29. typedef int (*JackSymBufferSizeCallback)(jack_nframes_t, void*);
  30. typedef int (*JackSymSampleRateCallback)(jack_nframes_t, void*);
  31. typedef void (*JackSymPortRegistrationCallback)(jack_port_id_t, int, void*);
  32. typedef void (*JackSymClientRegistrationCallback)(const char*, int, void*);
  33. typedef void (*JackSymPortConnectCallback)(jack_port_id_t, jack_port_id_t, int, void*);
  34. typedef void (*JackSymPortRenameCallback)(jack_port_id_t, const char*, const char*, void*);
  35. typedef void (*JackSymFreewheelCallback)(int, void*);
  36. typedef void (*JackSymShutdownCallback)(void*);
  37. typedef void (*JackSymInfoShutdownCallback)(jack_status_t, const char*, void*);
  38. typedef int (*JackSymSyncCallback)(jack_transport_state_t, jack_position_t*, void*);
  39. typedef void (*JackSymTimebaseCallback)(jack_transport_state_t, jack_nframes_t, jack_position_t*, int, void*);
  40. typedef void (*JackSymSessionCallback)(jack_session_event_t*, void*);
  41. typedef void (*JackSymPropertyChangeCallback)(jack_uuid_t, const char*, jack_property_change_t, void*);
  42. typedef void* (*JackSymThreadCallback)(void*);
  43. typedef void (*jacksym_get_version)(int*, int*, int*, int*);
  44. typedef const char* (*jacksym_get_version_string)(void);
  45. typedef jack_client_t* (*jacksym_client_open)(const char*, jack_options_t, jack_status_t*, ...);
  46. typedef int (*jacksym_client_close)(jack_client_t*);
  47. typedef int (*jacksym_client_name_size)(void);
  48. typedef char* (*jacksym_get_client_name)(jack_client_t*);
  49. typedef char* (*jacksym_client_get_uuid)(jack_client_t*);
  50. typedef char* (*jacksym_get_uuid_for_client_name)(jack_client_t*, const char*);
  51. typedef char* (*jacksym_get_client_name_by_uuid)(jack_client_t*, const char*);
  52. typedef int (*jacksym_uuid_parse)(const char*, jack_uuid_t*);
  53. typedef void (*jacksym_uuid_unparse)(jack_uuid_t, char buf[JACK_UUID_STRING_SIZE]);
  54. typedef int (*jacksym_activate)(jack_client_t*);
  55. typedef int (*jacksym_deactivate)(jack_client_t*);
  56. typedef int (*jacksym_is_realtime)(jack_client_t*);
  57. typedef int (*jacksym_set_thread_init_callback)(jack_client_t*, JackSymThreadInitCallback, void*);
  58. typedef void (*jacksym_on_shutdown)(jack_client_t*, JackSymShutdownCallback, void*);
  59. typedef void (*jacksym_on_info_shutdown)(jack_client_t*, JackSymInfoShutdownCallback, void*);
  60. typedef int (*jacksym_set_process_callback)(jack_client_t*, JackSymProcessCallback, void*);
  61. typedef int (*jacksym_set_freewheel_callback)(jack_client_t*, JackSymFreewheelCallback, void*);
  62. typedef int (*jacksym_set_buffer_size_callback)(jack_client_t*, JackSymBufferSizeCallback, void*);
  63. typedef int (*jacksym_set_sample_rate_callback)(jack_client_t*, JackSymSampleRateCallback, void*);
  64. typedef int (*jacksym_set_client_registration_callback)(jack_client_t*, JackSymClientRegistrationCallback, void*);
  65. typedef int (*jacksym_set_port_registration_callback)(jack_client_t*, JackSymPortRegistrationCallback, void*);
  66. typedef int (*jacksym_set_port_rename_callback)(jack_client_t*, JackSymPortRenameCallback, void*);
  67. typedef int (*jacksym_set_port_connect_callback)(jack_client_t*, JackSymPortConnectCallback, void*);
  68. typedef int (*jacksym_set_graph_order_callback)(jack_client_t*, JackSymGraphOrderCallback, void*);
  69. typedef int (*jacksym_set_xrun_callback)(jack_client_t*, JackSymXRunCallback, void*);
  70. typedef int (*jacksym_set_latency_callback)(jack_client_t*, JackSymLatencyCallback, void*);
  71. typedef int (*jacksym_set_freewheel)(jack_client_t*, int);
  72. typedef int (*jacksym_set_buffer_size)(jack_client_t*, jack_nframes_t);
  73. typedef jack_nframes_t (*jacksym_get_sample_rate)(jack_client_t*);
  74. typedef jack_nframes_t (*jacksym_get_buffer_size)(jack_client_t*);
  75. typedef float (*jacksym_cpu_load)(jack_client_t*);
  76. typedef jack_port_t* (*jacksym_port_register)(jack_client_t*, const char*, const char*, ulong, ulong);
  77. typedef int (*jacksym_port_unregister)(jack_client_t*, jack_port_t*);
  78. typedef void* (*jacksym_port_get_buffer)(jack_port_t*, jack_nframes_t);
  79. typedef const char* (*jacksym_port_name)(const jack_port_t*);
  80. typedef jack_uuid_t (*jacksym_port_uuid)(const jack_port_t*);
  81. typedef const char* (*jacksym_port_short_name)(const jack_port_t*);
  82. typedef int (*jacksym_port_flags)(const jack_port_t*);
  83. typedef const char* (*jacksym_port_type)(const jack_port_t*);
  84. typedef int (*jacksym_port_is_mine)(const jack_client_t*, const jack_port_t*);
  85. typedef int (*jacksym_port_connected)(const jack_port_t*);
  86. typedef int (*jacksym_port_connected_to)(const jack_port_t*, const char*);
  87. typedef const char** (*jacksym_port_get_connections)(const jack_port_t*);
  88. typedef const char** (*jacksym_port_get_all_connections)(const jack_client_t*, const jack_port_t*);
  89. typedef int (*jacksym_port_rename)(jack_client_t*, jack_port_t*, const char*);
  90. typedef int (*jacksym_port_set_name)(jack_port_t*, const char*);
  91. typedef int (*jacksym_port_set_alias)(jack_port_t*, const char*);
  92. typedef int (*jacksym_port_unset_alias)(jack_port_t*, const char*);
  93. typedef int (*jacksym_port_get_aliases)(const jack_port_t*, char* const aliases[2]);
  94. typedef int (*jacksym_port_request_monitor)(jack_port_t*, int);
  95. typedef int (*jacksym_port_request_monitor_by_name)(jack_client_t*, const char*, int);
  96. typedef int (*jacksym_port_ensure_monitor)(jack_port_t*, int);
  97. typedef int (*jacksym_port_monitoring_input)(jack_port_t*);
  98. typedef int (*jacksym_connect)(jack_client_t*, const char*, const char*);
  99. typedef int (*jacksym_disconnect)(jack_client_t*, const char*, const char*);
  100. typedef int (*jacksym_port_disconnect)(jack_client_t*, jack_port_t*);
  101. typedef int (*jacksym_port_name_size)(void);
  102. typedef int (*jacksym_port_type_size)(void);
  103. typedef size_t (*jacksym_port_type_get_buffer_size)(jack_client_t*, const char*);
  104. typedef void (*jacksym_port_get_latency_range)(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t*);
  105. typedef void (*jacksym_port_set_latency_range)(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t*);
  106. typedef int (*jacksym_recompute_total_latencies)(jack_client_t*);
  107. typedef const char** (*jacksym_get_ports)(jack_client_t*, const char*, const char*, ulong);
  108. typedef jack_port_t* (*jacksym_port_by_name)(jack_client_t*, const char*);
  109. typedef jack_port_t* (*jacksym_port_by_id)(jack_client_t*, jack_port_id_t);
  110. typedef void (*jacksym_free)(void*);
  111. typedef uint32_t (*jacksym_midi_get_event_count)(void*);
  112. typedef int (*jacksym_midi_event_get)(jack_midi_event_t*, void*, uint32_t);
  113. typedef void (*jacksym_midi_clear_buffer)(void*);
  114. typedef int (*jacksym_midi_event_write)(void*, jack_nframes_t, const jack_midi_data_t*, size_t);
  115. typedef jack_midi_data_t* (*jacksym_midi_event_reserve)(void*, jack_nframes_t, size_t);
  116. typedef int (*jacksym_release_timebase)(jack_client_t*);
  117. typedef int (*jacksym_set_sync_callback)(jack_client_t*, JackSymSyncCallback, void*);
  118. typedef int (*jacksym_set_sync_timeout)(jack_client_t*, jack_time_t);
  119. typedef int (*jacksym_set_timebase_callback)(jack_client_t*, int, JackSymTimebaseCallback, void*);
  120. typedef int (*jacksym_transport_locate)(jack_client_t*, jack_nframes_t);
  121. typedef jack_transport_state_t (*jacksym_transport_query)(const jack_client_t*, jack_position_t*);
  122. typedef jack_nframes_t (*jacksym_get_current_transport_frame)(const jack_client_t*);
  123. typedef int (*jacksym_transport_reposition)(jack_client_t*, const jack_position_t*);
  124. typedef void (*jacksym_transport_start)(jack_client_t*);
  125. typedef void (*jacksym_transport_stop)(jack_client_t*);
  126. typedef int (*jacksym_set_property)(jack_client_t*, jack_uuid_t, const char*, const char*, const char*);
  127. typedef int (*jacksym_get_property)(jack_uuid_t, const char*, char**, char**);
  128. typedef void (*jacksym_free_description)(jack_description_t*, int);
  129. typedef int (*jacksym_get_properties)(jack_uuid_t, jack_description_t*);
  130. typedef int (*jacksym_get_all_properties)(jack_description_t**);
  131. typedef int (*jacksym_remove_property)(jack_client_t*, jack_uuid_t, const char*);
  132. typedef int (*jacksym_remove_properties)(jack_client_t*, jack_uuid_t);
  133. typedef int (*jacksym_remove_all_properties)(jack_client_t*);
  134. typedef int (*jacksym_set_property_change_callback)(jack_client_t*, JackSymPropertyChangeCallback, void*);
  135. typedef int (*jacksym_thread_creator_t)(pthread_t*, const pthread_attr_t*, void *(*)(void*), void*);
  136. typedef void (*jacksym_set_thread_creator)(jacksym_thread_creator_t);
  137. typedef bool (*jacksym_set_process_thread)(jack_client_t*, JackSymThreadCallback callback, void*);
  138. typedef jack_nframes_t (*jacksym_cycle_wait)(jack_client_t*);
  139. typedef void (*jacksym_cycle_signal)(jack_client_t*, int);
  140. typedef jack_nframes_t (*jacksym_port_get_latency)(jack_port_t*);
  141. typedef jack_nframes_t (*jacksym_frame_time)(const jack_client_t*);
  142. // --------------------------------------------------------------------------------------------------------------------
  143. typedef struct JackBridge {
  144. void* lib;
  145. jacksym_get_version get_version_ptr;
  146. jacksym_get_version_string get_version_string_ptr;
  147. jacksym_client_open client_open_ptr;
  148. jacksym_client_close client_close_ptr;
  149. jacksym_client_name_size client_name_size_ptr;
  150. jacksym_get_client_name get_client_name_ptr;
  151. jacksym_client_get_uuid client_get_uuid_ptr;
  152. jacksym_get_uuid_for_client_name get_uuid_for_client_name_ptr;
  153. jacksym_get_client_name_by_uuid get_client_name_by_uuid_ptr;
  154. jacksym_uuid_parse uuid_parse_ptr;
  155. jacksym_uuid_unparse uuid_unparse_ptr;
  156. jacksym_activate activate_ptr;
  157. jacksym_deactivate deactivate_ptr;
  158. jacksym_is_realtime is_realtime_ptr;
  159. jacksym_set_thread_init_callback set_thread_init_callback_ptr;
  160. jacksym_on_shutdown on_shutdown_ptr;
  161. jacksym_on_info_shutdown on_info_shutdown_ptr;
  162. jacksym_set_process_callback set_process_callback_ptr;
  163. jacksym_set_freewheel_callback set_freewheel_callback_ptr;
  164. jacksym_set_buffer_size_callback set_buffer_size_callback_ptr;
  165. jacksym_set_sample_rate_callback set_sample_rate_callback_ptr;
  166. jacksym_set_client_registration_callback set_client_registration_callback_ptr;
  167. jacksym_set_port_registration_callback set_port_registration_callback_ptr;
  168. jacksym_set_port_rename_callback set_port_rename_callback_ptr;
  169. jacksym_set_port_connect_callback set_port_connect_callback_ptr;
  170. jacksym_set_graph_order_callback set_graph_order_callback_ptr;
  171. jacksym_set_xrun_callback set_xrun_callback_ptr;
  172. jacksym_set_latency_callback set_latency_callback_ptr;
  173. jacksym_set_freewheel set_freewheel_ptr;
  174. jacksym_set_buffer_size set_buffer_size_ptr;
  175. jacksym_get_sample_rate get_sample_rate_ptr;
  176. jacksym_get_buffer_size get_buffer_size_ptr;
  177. jacksym_cpu_load cpu_load_ptr;
  178. jacksym_port_register port_register_ptr;
  179. jacksym_port_unregister port_unregister_ptr;
  180. jacksym_port_get_buffer port_get_buffer_ptr;
  181. jacksym_port_name port_name_ptr;
  182. jacksym_port_uuid port_uuid_ptr;
  183. jacksym_port_short_name port_short_name_ptr;
  184. jacksym_port_flags port_flags_ptr;
  185. jacksym_port_type port_type_ptr;
  186. jacksym_port_is_mine port_is_mine_ptr;
  187. jacksym_port_connected port_connected_ptr;
  188. jacksym_port_connected_to port_connected_to_ptr;
  189. jacksym_port_get_connections port_get_connections_ptr;
  190. jacksym_port_get_all_connections port_get_all_connections_ptr;
  191. jacksym_port_rename port_rename_ptr;
  192. jacksym_port_set_name port_set_name_ptr;
  193. jacksym_port_set_alias port_set_alias_ptr;
  194. jacksym_port_unset_alias port_unset_alias_ptr;
  195. jacksym_port_get_aliases port_get_aliases_ptr;
  196. jacksym_port_request_monitor port_request_monitor_ptr;
  197. jacksym_port_request_monitor_by_name port_request_monitor_by_name_ptr;
  198. jacksym_port_ensure_monitor port_ensure_monitor_ptr;
  199. jacksym_port_monitoring_input port_monitoring_input_ptr;
  200. jacksym_connect connect_ptr;
  201. jacksym_disconnect disconnect_ptr;
  202. jacksym_port_disconnect port_disconnect_ptr;
  203. jacksym_port_name_size port_name_size_ptr;
  204. jacksym_port_type_size port_type_size_ptr;
  205. jacksym_port_type_get_buffer_size port_type_get_buffer_size_ptr;
  206. jacksym_port_get_latency_range port_get_latency_range_ptr;
  207. jacksym_port_set_latency_range port_set_latency_range_ptr;
  208. jacksym_recompute_total_latencies recompute_total_latencies_ptr;
  209. jacksym_get_ports get_ports_ptr;
  210. jacksym_port_by_name port_by_name_ptr;
  211. jacksym_port_by_id port_by_id_ptr;
  212. jacksym_free free_ptr;
  213. jacksym_midi_get_event_count midi_get_event_count_ptr;
  214. jacksym_midi_event_get midi_event_get_ptr;
  215. jacksym_midi_clear_buffer midi_clear_buffer_ptr;
  216. jacksym_midi_event_write midi_event_write_ptr;
  217. jacksym_midi_event_reserve midi_event_reserve_ptr;
  218. jacksym_release_timebase release_timebase_ptr;
  219. jacksym_set_sync_callback set_sync_callback_ptr;
  220. jacksym_set_sync_timeout set_sync_timeout_ptr;
  221. jacksym_set_timebase_callback set_timebase_callback_ptr;
  222. jacksym_transport_locate transport_locate_ptr;
  223. jacksym_transport_query transport_query_ptr;
  224. jacksym_get_current_transport_frame get_current_transport_frame_ptr;
  225. jacksym_transport_reposition transport_reposition_ptr;
  226. jacksym_transport_start transport_start_ptr;
  227. jacksym_transport_stop transport_stop_ptr;
  228. jacksym_set_property set_property_ptr;
  229. jacksym_get_property get_property_ptr;
  230. jacksym_free_description free_description_ptr;
  231. jacksym_get_properties get_properties_ptr;
  232. jacksym_get_all_properties get_all_properties_ptr;
  233. jacksym_remove_property remove_property_ptr;
  234. jacksym_remove_properties remove_properties_ptr;
  235. jacksym_remove_all_properties remove_all_properties_ptr;
  236. jacksym_set_property_change_callback set_property_change_callback_ptr;
  237. jacksym_set_thread_creator set_thread_creator_ptr;
  238. jacksym_set_process_thread set_process_thread_ptr;
  239. jacksym_cycle_wait cycle_wait_ptr;
  240. jacksym_cycle_signal cycle_signal_ptr;
  241. jacksym_port_get_latency port_get_latency_ptr;
  242. jacksym_frame_time frame_time_ptr;
  243. } JackBridge;
  244. static void jackbridge_init(JackBridge* const bridge)
  245. {
  246. void* lib;
  247. memset(bridge, 0, sizeof(*bridge));
  248. lib = dlopen("libjack.so.0", RTLD_NOW);
  249. if (lib == NULL)
  250. {
  251. fprintf(stderr, "[wineasio] Failed to load libjack.so.0: '%s'\n", dlerror());
  252. return;
  253. }
  254. else
  255. {
  256. fprintf(stdout, "[wineasio] libjack.so.0 loaded successfully!\n");
  257. }
  258. #define JOIN(a, b) a ## b
  259. #define LIB_SYMBOL(NAME) bridge->JOIN(NAME, _ptr) = (jacksym_##NAME)dlsym(lib, "jack_" #NAME);
  260. LIB_SYMBOL(get_version)
  261. LIB_SYMBOL(get_version_string)
  262. LIB_SYMBOL(client_open)
  263. LIB_SYMBOL(client_close)
  264. LIB_SYMBOL(client_name_size)
  265. LIB_SYMBOL(get_client_name)
  266. LIB_SYMBOL(client_get_uuid)
  267. LIB_SYMBOL(get_uuid_for_client_name)
  268. LIB_SYMBOL(get_client_name_by_uuid)
  269. LIB_SYMBOL(uuid_parse)
  270. LIB_SYMBOL(uuid_unparse)
  271. LIB_SYMBOL(activate)
  272. LIB_SYMBOL(deactivate)
  273. LIB_SYMBOL(is_realtime)
  274. LIB_SYMBOL(set_thread_init_callback)
  275. LIB_SYMBOL(on_shutdown)
  276. LIB_SYMBOL(on_info_shutdown)
  277. LIB_SYMBOL(set_process_callback)
  278. LIB_SYMBOL(set_freewheel_callback)
  279. LIB_SYMBOL(set_buffer_size_callback)
  280. LIB_SYMBOL(set_sample_rate_callback)
  281. LIB_SYMBOL(set_client_registration_callback)
  282. LIB_SYMBOL(set_port_registration_callback)
  283. LIB_SYMBOL(set_port_rename_callback)
  284. LIB_SYMBOL(set_port_connect_callback)
  285. LIB_SYMBOL(set_graph_order_callback)
  286. LIB_SYMBOL(set_xrun_callback)
  287. LIB_SYMBOL(set_latency_callback)
  288. LIB_SYMBOL(set_freewheel)
  289. LIB_SYMBOL(set_buffer_size)
  290. LIB_SYMBOL(get_sample_rate)
  291. LIB_SYMBOL(get_buffer_size)
  292. LIB_SYMBOL(cpu_load)
  293. LIB_SYMBOL(port_register)
  294. LIB_SYMBOL(port_unregister)
  295. LIB_SYMBOL(port_get_buffer)
  296. LIB_SYMBOL(port_name)
  297. LIB_SYMBOL(port_uuid)
  298. LIB_SYMBOL(port_short_name)
  299. LIB_SYMBOL(port_flags)
  300. LIB_SYMBOL(port_type)
  301. LIB_SYMBOL(port_is_mine)
  302. LIB_SYMBOL(port_connected)
  303. LIB_SYMBOL(port_connected_to)
  304. LIB_SYMBOL(port_get_connections)
  305. LIB_SYMBOL(port_get_all_connections)
  306. LIB_SYMBOL(port_rename)
  307. LIB_SYMBOL(port_set_name)
  308. LIB_SYMBOL(port_set_alias)
  309. LIB_SYMBOL(port_unset_alias)
  310. LIB_SYMBOL(port_get_aliases)
  311. LIB_SYMBOL(port_request_monitor)
  312. LIB_SYMBOL(port_request_monitor_by_name)
  313. LIB_SYMBOL(port_ensure_monitor)
  314. LIB_SYMBOL(port_monitoring_input)
  315. LIB_SYMBOL(connect)
  316. LIB_SYMBOL(disconnect)
  317. LIB_SYMBOL(port_disconnect)
  318. LIB_SYMBOL(port_name_size)
  319. LIB_SYMBOL(port_type_size)
  320. LIB_SYMBOL(port_type_get_buffer_size)
  321. LIB_SYMBOL(port_get_latency_range)
  322. LIB_SYMBOL(port_set_latency_range)
  323. LIB_SYMBOL(recompute_total_latencies)
  324. LIB_SYMBOL(get_ports)
  325. LIB_SYMBOL(port_by_name)
  326. LIB_SYMBOL(port_by_id)
  327. LIB_SYMBOL(free)
  328. LIB_SYMBOL(midi_get_event_count)
  329. LIB_SYMBOL(midi_event_get)
  330. LIB_SYMBOL(midi_clear_buffer)
  331. LIB_SYMBOL(midi_event_write)
  332. LIB_SYMBOL(midi_event_reserve)
  333. LIB_SYMBOL(release_timebase)
  334. LIB_SYMBOL(set_sync_callback)
  335. LIB_SYMBOL(set_sync_timeout)
  336. LIB_SYMBOL(set_timebase_callback)
  337. LIB_SYMBOL(transport_locate)
  338. LIB_SYMBOL(transport_query)
  339. LIB_SYMBOL(get_current_transport_frame)
  340. LIB_SYMBOL(transport_reposition)
  341. LIB_SYMBOL(transport_start)
  342. LIB_SYMBOL(transport_stop)
  343. LIB_SYMBOL(set_property)
  344. LIB_SYMBOL(get_property)
  345. LIB_SYMBOL(free_description)
  346. LIB_SYMBOL(get_properties)
  347. LIB_SYMBOL(get_all_properties)
  348. LIB_SYMBOL(remove_property)
  349. LIB_SYMBOL(remove_properties)
  350. LIB_SYMBOL(remove_all_properties)
  351. LIB_SYMBOL(set_property_change_callback)
  352. LIB_SYMBOL(set_thread_creator)
  353. LIB_SYMBOL(set_process_thread)
  354. LIB_SYMBOL(cycle_wait)
  355. LIB_SYMBOL(cycle_signal)
  356. LIB_SYMBOL(port_get_latency)
  357. LIB_SYMBOL(frame_time)
  358. #undef JOIN
  359. #undef LIB_SYMBOL
  360. bridge->lib = lib;
  361. }
  362. __attribute__((destructor))
  363. static void jackbridge_destroy(JackBridge* const bridge)
  364. {
  365. if (bridge->lib != NULL)
  366. {
  367. dlclose(bridge->lib);
  368. bridge->lib = NULL;
  369. }
  370. }
  371. static JackBridge* jackbridge_instance()
  372. {
  373. static JackBridge bridge;
  374. static bool init = false;
  375. if (! init)
  376. {
  377. init = true;
  378. jackbridge_init(&bridge);
  379. }
  380. return &bridge;
  381. }
  382. // --------------------------------------------------------------------------------------------------------------------
  383. bool jackbridge_is_ok()
  384. {
  385. return jackbridge_instance()->lib != NULL;
  386. }
  387. // --------------------------------------------------------------------------------------------------------------------
  388. void jackbridge_get_version(int* major_ptr, int* minor_ptr, int* micro_ptr, int* proto_ptr)
  389. {
  390. if (jackbridge_instance()->get_version_ptr != NULL)
  391. return jackbridge_instance()->get_version_ptr(major_ptr, minor_ptr, micro_ptr, proto_ptr);
  392. if (major_ptr != NULL)
  393. *major_ptr = 0;
  394. if (minor_ptr != NULL)
  395. *minor_ptr = 0;
  396. if (micro_ptr != NULL)
  397. *micro_ptr = 0;
  398. if (proto_ptr != NULL)
  399. *proto_ptr = 0;
  400. }
  401. const char* jackbridge_get_version_string()
  402. {
  403. if (jackbridge_instance()->get_version_string_ptr != NULL)
  404. return jackbridge_instance()->get_version_string_ptr();
  405. return NULL;
  406. }
  407. // --------------------------------------------------------------------------------------------------------------------
  408. jack_client_t* jackbridge_client_open(const char* client_name, uint32_t options, jack_status_t* status)
  409. {
  410. if (jackbridge_instance()->client_open_ptr != NULL)
  411. return jackbridge_instance()->client_open_ptr(client_name, (jack_options_t)options, status);
  412. if (status != NULL)
  413. *status = JackServerError;
  414. return NULL;
  415. }
  416. bool jackbridge_client_close(jack_client_t* client)
  417. {
  418. if (jackbridge_instance()->client_close_ptr != NULL)
  419. return (jackbridge_instance()->client_close_ptr(client) == 0);
  420. return false;
  421. }
  422. // --------------------------------------------------------------------------------------------------------------------
  423. int jackbridge_client_name_size()
  424. {
  425. if (jackbridge_instance()->client_name_size_ptr != NULL)
  426. return jackbridge_instance()->client_name_size_ptr();
  427. return 33;
  428. }
  429. const char* jackbridge_get_client_name(jack_client_t* client)
  430. {
  431. if (jackbridge_instance()->get_client_name_ptr != NULL)
  432. return jackbridge_instance()->get_client_name_ptr(client);
  433. return NULL;
  434. }
  435. // --------------------------------------------------------------------------------------------------------------------
  436. char* jackbridge_client_get_uuid(jack_client_t* client)
  437. {
  438. if (jackbridge_instance()->client_get_uuid_ptr != NULL)
  439. return jackbridge_instance()->client_get_uuid_ptr(client);
  440. return NULL;
  441. }
  442. char* jackbridge_get_uuid_for_client_name(jack_client_t* client, const char* name)
  443. {
  444. if (jackbridge_instance()->get_uuid_for_client_name_ptr != NULL)
  445. return jackbridge_instance()->get_uuid_for_client_name_ptr(client, name);
  446. return NULL;
  447. }
  448. char* jackbridge_get_client_name_by_uuid(jack_client_t* client, const char* uuid)
  449. {
  450. if (jackbridge_instance()->get_client_name_by_uuid_ptr != NULL)
  451. return jackbridge_instance()->get_client_name_by_uuid_ptr(client, uuid);
  452. return NULL;
  453. }
  454. // --------------------------------------------------------------------------------------------------------------------
  455. bool jackbridge_uuid_parse(const char* buf, jack_uuid_t* uuid)
  456. {
  457. if (jackbridge_instance()->uuid_parse_ptr != NULL)
  458. return jackbridge_instance()->uuid_parse_ptr(buf, uuid) == 0;
  459. return false;
  460. }
  461. void jackbridge_uuid_unparse(jack_uuid_t uuid, char buf[JACK_UUID_STRING_SIZE])
  462. {
  463. if (jackbridge_instance()->uuid_unparse_ptr != NULL)
  464. return jackbridge_instance()->uuid_unparse_ptr(uuid, buf);
  465. }
  466. // --------------------------------------------------------------------------------------------------------------------
  467. bool jackbridge_activate(jack_client_t* client)
  468. {
  469. if (jackbridge_instance()->activate_ptr != NULL)
  470. return (jackbridge_instance()->activate_ptr(client) == 0);
  471. return false;
  472. }
  473. bool jackbridge_deactivate(jack_client_t* client)
  474. {
  475. if (jackbridge_instance()->deactivate_ptr != NULL)
  476. return (jackbridge_instance()->deactivate_ptr(client) == 0);
  477. return false;
  478. }
  479. bool jackbridge_is_realtime(jack_client_t* client)
  480. {
  481. if (jackbridge_instance()->is_realtime_ptr != NULL)
  482. return jackbridge_instance()->is_realtime_ptr(client);
  483. return false;
  484. }
  485. // --------------------------------------------------------------------------------------------------------------------
  486. bool jackbridge_set_thread_init_callback(jack_client_t* client, JackThreadInitCallback thread_init_callback, void* arg)
  487. {
  488. if (jackbridge_instance()->set_thread_init_callback_ptr != NULL)
  489. return (jackbridge_instance()->set_thread_init_callback_ptr(client, thread_init_callback, arg) == 0);
  490. return false;
  491. }
  492. void jackbridge_on_shutdown(jack_client_t* client, JackShutdownCallback shutdown_callback, void* arg)
  493. {
  494. if (jackbridge_instance()->on_shutdown_ptr != NULL)
  495. jackbridge_instance()->on_shutdown_ptr(client, shutdown_callback, arg);
  496. }
  497. void jackbridge_on_info_shutdown(jack_client_t* client, JackInfoShutdownCallback shutdown_callback, void* arg)
  498. {
  499. if (jackbridge_instance()->on_info_shutdown_ptr != NULL)
  500. jackbridge_instance()->on_info_shutdown_ptr(client, shutdown_callback, arg);
  501. }
  502. bool jackbridge_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg)
  503. {
  504. if (jackbridge_instance()->set_process_callback_ptr != NULL)
  505. return (jackbridge_instance()->set_process_callback_ptr(client, process_callback, arg) == 0);
  506. return false;
  507. }
  508. bool jackbridge_set_freewheel_callback(jack_client_t* client, JackFreewheelCallback freewheel_callback, void* arg)
  509. {
  510. if (jackbridge_instance()->set_freewheel_callback_ptr != NULL)
  511. return (jackbridge_instance()->set_freewheel_callback_ptr(client, freewheel_callback, arg) == 0);
  512. return false;
  513. }
  514. bool jackbridge_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback bufsize_callback, void* arg)
  515. {
  516. if (jackbridge_instance()->set_buffer_size_callback_ptr != NULL)
  517. return (jackbridge_instance()->set_buffer_size_callback_ptr(client, bufsize_callback, arg) == 0);
  518. return false;
  519. }
  520. bool jackbridge_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback srate_callback, void* arg)
  521. {
  522. if (jackbridge_instance()->set_sample_rate_callback_ptr != NULL)
  523. return (jackbridge_instance()->set_sample_rate_callback_ptr(client, srate_callback, arg) == 0);
  524. return false;
  525. }
  526. bool jackbridge_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback registration_callback, void* arg)
  527. {
  528. if (jackbridge_instance()->set_client_registration_callback_ptr != NULL)
  529. return (jackbridge_instance()->set_client_registration_callback_ptr(client, registration_callback, arg) == 0);
  530. return false;
  531. }
  532. bool jackbridge_set_port_registration_callback(jack_client_t* client, JackPortRegistrationCallback registration_callback, void *arg)
  533. {
  534. if (jackbridge_instance()->set_port_registration_callback_ptr != NULL)
  535. return (jackbridge_instance()->set_port_registration_callback_ptr(client, registration_callback, arg) == 0);
  536. return false;
  537. }
  538. bool jackbridge_set_port_rename_callback(jack_client_t* client, JackPortRenameCallback rename_callback, void* arg)
  539. {
  540. if (jackbridge_instance()->set_port_rename_callback_ptr != NULL)
  541. return (jackbridge_instance()->set_port_rename_callback_ptr(client, rename_callback, arg) == 0);
  542. return false;
  543. }
  544. bool jackbridge_set_port_connect_callback(jack_client_t* client, JackPortConnectCallback connect_callback, void* arg)
  545. {
  546. if (jackbridge_instance()->set_port_connect_callback_ptr != NULL)
  547. return (jackbridge_instance()->set_port_connect_callback_ptr(client, connect_callback, arg) == 0);
  548. return false;
  549. }
  550. bool jackbridge_set_graph_order_callback(jack_client_t* client, JackGraphOrderCallback graph_callback, void* arg)
  551. {
  552. if (jackbridge_instance()->set_graph_order_callback_ptr != NULL)
  553. return (jackbridge_instance()->set_graph_order_callback_ptr(client, graph_callback, arg) == 0);
  554. return false;
  555. }
  556. bool jackbridge_set_xrun_callback(jack_client_t* client, JackXRunCallback xrun_callback, void* arg)
  557. {
  558. if (jackbridge_instance()->set_xrun_callback_ptr != NULL)
  559. return (jackbridge_instance()->set_xrun_callback_ptr(client, xrun_callback, arg) == 0);
  560. return false;
  561. }
  562. bool jackbridge_set_latency_callback(jack_client_t* client, JackLatencyCallback latency_callback, void* arg)
  563. {
  564. if (jackbridge_instance()->set_latency_callback_ptr != NULL)
  565. return (jackbridge_instance()->set_latency_callback_ptr(client, latency_callback, arg) == 0);
  566. return false;
  567. }
  568. // --------------------------------------------------------------------------------------------------------------------
  569. bool jackbridge_set_freewheel(jack_client_t* client, bool onoff)
  570. {
  571. if (jackbridge_instance()->set_freewheel_ptr != NULL)
  572. return jackbridge_instance()->set_freewheel_ptr(client, onoff);
  573. return false;
  574. }
  575. bool jackbridge_set_buffer_size(jack_client_t* client, jack_nframes_t nframes)
  576. {
  577. if (jackbridge_instance()->set_buffer_size_ptr != NULL)
  578. return jackbridge_instance()->set_buffer_size_ptr(client, nframes);
  579. return false;
  580. }
  581. // --------------------------------------------------------------------------------------------------------------------
  582. jack_nframes_t jackbridge_get_sample_rate(jack_client_t* client)
  583. {
  584. if (jackbridge_instance()->get_sample_rate_ptr != NULL)
  585. return jackbridge_instance()->get_sample_rate_ptr(client);
  586. return 0;
  587. }
  588. jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client)
  589. {
  590. if (jackbridge_instance()->get_buffer_size_ptr != NULL)
  591. return jackbridge_instance()->get_buffer_size_ptr(client);
  592. return 0;
  593. }
  594. float jackbridge_cpu_load(jack_client_t* client)
  595. {
  596. if (jackbridge_instance()->cpu_load_ptr != NULL)
  597. return jackbridge_instance()->cpu_load_ptr(client);
  598. return 0.0f;
  599. }
  600. // --------------------------------------------------------------------------------------------------------------------
  601. jack_port_t* jackbridge_port_register(jack_client_t* client, const char* port_name, const char* type, uint64_t flags, uint64_t buffer_size)
  602. {
  603. if (jackbridge_instance()->port_register_ptr != NULL)
  604. return jackbridge_instance()->port_register_ptr(client, port_name, type, (ulong)flags, (ulong)buffer_size);
  605. return NULL;
  606. }
  607. bool jackbridge_port_unregister(jack_client_t* client, jack_port_t* port)
  608. {
  609. if (jackbridge_instance()->port_unregister_ptr != NULL)
  610. return (jackbridge_instance()->port_unregister_ptr(client, port) == 0);
  611. return false;
  612. }
  613. void* jackbridge_port_get_buffer(jack_port_t* port, jack_nframes_t nframes)
  614. {
  615. if (jackbridge_instance()->port_get_buffer_ptr != NULL)
  616. return jackbridge_instance()->port_get_buffer_ptr(port, nframes);
  617. return NULL;
  618. }
  619. // --------------------------------------------------------------------------------------------------------------------
  620. const char* jackbridge_port_name(const jack_port_t* port)
  621. {
  622. if (jackbridge_instance()->port_name_ptr != NULL)
  623. return jackbridge_instance()->port_name_ptr(port);
  624. return NULL;
  625. }
  626. jack_uuid_t jackbridge_port_uuid(const jack_port_t* port)
  627. {
  628. if (jackbridge_instance()->port_uuid_ptr != NULL)
  629. return jackbridge_instance()->port_uuid_ptr(port);
  630. return 0;
  631. }
  632. const char* jackbridge_port_short_name(const jack_port_t* port)
  633. {
  634. if (jackbridge_instance()->port_short_name_ptr != NULL)
  635. return jackbridge_instance()->port_short_name_ptr(port);
  636. return NULL;
  637. }
  638. int jackbridge_port_flags(const jack_port_t* port)
  639. {
  640. if (jackbridge_instance()->port_flags_ptr != NULL)
  641. return jackbridge_instance()->port_flags_ptr(port);
  642. return 0x0;
  643. }
  644. const char* jackbridge_port_type(const jack_port_t* port)
  645. {
  646. if (jackbridge_instance()->port_type_ptr != NULL)
  647. return jackbridge_instance()->port_type_ptr(port);
  648. return NULL;
  649. }
  650. bool jackbridge_port_is_mine(const jack_client_t* client, const jack_port_t* port)
  651. {
  652. if (jackbridge_instance()->port_is_mine_ptr != NULL)
  653. return jackbridge_instance()->port_is_mine_ptr(client, port);
  654. return false;
  655. }
  656. int jackbridge_port_connected(const jack_port_t* port)
  657. {
  658. if (jackbridge_instance()->port_connected_ptr != NULL)
  659. return jackbridge_instance()->port_connected_ptr(port);
  660. return 0;
  661. }
  662. bool jackbridge_port_connected_to(const jack_port_t* port, const char* port_name)
  663. {
  664. if (jackbridge_instance()->port_connected_to_ptr != NULL)
  665. return jackbridge_instance()->port_connected_to_ptr(port, port_name);
  666. return false;
  667. }
  668. const char** jackbridge_port_get_connections(const jack_port_t* port)
  669. {
  670. if (jackbridge_instance()->port_get_connections_ptr != NULL)
  671. return jackbridge_instance()->port_get_connections_ptr(port);
  672. return NULL;
  673. }
  674. const char** jackbridge_port_get_all_connections(const jack_client_t* client, const jack_port_t* port)
  675. {
  676. if (jackbridge_instance()->port_get_all_connections_ptr != NULL)
  677. return jackbridge_instance()->port_get_all_connections_ptr(client, port);
  678. return NULL;
  679. }
  680. // --------------------------------------------------------------------------------------------------------------------
  681. bool jackbridge_port_rename(jack_client_t* client, jack_port_t* port, const char* port_name)
  682. {
  683. // Try new API first
  684. if (jackbridge_instance()->port_rename_ptr != NULL)
  685. return (jackbridge_instance()->port_rename_ptr(client, port, port_name) == 0);
  686. // Try old API if using JACK2
  687. if (jackbridge_instance()->get_version_string_ptr != NULL && jackbridge_instance()->port_set_name_ptr != NULL)
  688. return (jackbridge_instance()->port_set_name_ptr(port, port_name) == 0);
  689. return false;
  690. }
  691. bool jackbridge_port_set_alias(jack_port_t* port, const char* alias)
  692. {
  693. if (jackbridge_instance()->port_set_alias_ptr != NULL)
  694. return (jackbridge_instance()->port_set_alias_ptr(port, alias) == 0);
  695. return false;
  696. }
  697. bool jackbridge_port_unset_alias(jack_port_t* port, const char* alias)
  698. {
  699. if (jackbridge_instance()->port_unset_alias_ptr != NULL)
  700. return (jackbridge_instance()->port_unset_alias_ptr(port, alias) == 0);
  701. return false;
  702. }
  703. int jackbridge_port_get_aliases(const jack_port_t* port, char* const aliases[2])
  704. {
  705. if (jackbridge_instance()->port_get_aliases_ptr != NULL)
  706. return jackbridge_instance()->port_get_aliases_ptr(port, aliases);
  707. return 0;
  708. }
  709. // --------------------------------------------------------------------------------------------------------------------
  710. bool jackbridge_port_request_monitor(jack_port_t* port, bool onoff)
  711. {
  712. if (jackbridge_instance()->port_request_monitor_ptr != NULL)
  713. return (jackbridge_instance()->port_request_monitor_ptr(port, onoff) == 0);
  714. return false;
  715. }
  716. bool jackbridge_port_request_monitor_by_name(jack_client_t* client, const char* port_name, bool onoff)
  717. {
  718. if (jackbridge_instance()->port_request_monitor_by_name_ptr != NULL)
  719. return (jackbridge_instance()->port_request_monitor_by_name_ptr(client, port_name, onoff) == 0);
  720. return false;
  721. }
  722. bool jackbridge_port_ensure_monitor(jack_port_t* port, bool onoff)
  723. {
  724. if (jackbridge_instance()->port_ensure_monitor_ptr != NULL)
  725. return (jackbridge_instance()->port_ensure_monitor_ptr(port, onoff) == 0);
  726. return false;
  727. }
  728. bool jackbridge_port_monitoring_input(jack_port_t* port)
  729. {
  730. if (jackbridge_instance()->port_monitoring_input_ptr != NULL)
  731. return jackbridge_instance()->port_monitoring_input_ptr(port);
  732. return false;
  733. }
  734. // --------------------------------------------------------------------------------------------------------------------
  735. bool jackbridge_connect(jack_client_t* client, const char* source_port, const char* destination_port)
  736. {
  737. if (jackbridge_instance()->connect_ptr != NULL)
  738. {
  739. const int ret = jackbridge_instance()->connect_ptr(client, source_port, destination_port);
  740. return ret == 0 || ret == EEXIST;
  741. }
  742. return false;
  743. }
  744. bool jackbridge_disconnect(jack_client_t* client, const char* source_port, const char* destination_port)
  745. {
  746. if (jackbridge_instance()->disconnect_ptr != NULL)
  747. return (jackbridge_instance()->disconnect_ptr(client, source_port, destination_port) == 0);
  748. return false;
  749. }
  750. bool jackbridge_port_disconnect(jack_client_t* client, jack_port_t* port)
  751. {
  752. if (jackbridge_instance()->port_disconnect_ptr != NULL)
  753. return (jackbridge_instance()->port_disconnect_ptr(client, port) == 0);
  754. return false;
  755. }
  756. // --------------------------------------------------------------------------------------------------------------------
  757. int jackbridge_port_name_size()
  758. {
  759. if (jackbridge_instance()->port_name_size_ptr != NULL)
  760. return jackbridge_instance()->port_name_size_ptr();
  761. return 256;
  762. }
  763. int jackbridge_port_type_size()
  764. {
  765. if (jackbridge_instance()->port_type_size_ptr != NULL)
  766. return jackbridge_instance()->port_type_size_ptr();
  767. return 32;
  768. }
  769. uint32_t jackbridge_port_type_get_buffer_size(jack_client_t* client, const char* port_type)
  770. {
  771. if (jackbridge_instance()->port_type_get_buffer_size_ptr != NULL)
  772. return (uint32_t)jackbridge_instance()->port_type_get_buffer_size_ptr(client, port_type);
  773. return 0;
  774. }
  775. // --------------------------------------------------------------------------------------------------------------------
  776. void jackbridge_port_get_latency_range(jack_port_t* port, uint32_t mode, jack_latency_range_t* range)
  777. {
  778. if (jackbridge_instance()->port_get_latency_range_ptr != NULL)
  779. return jackbridge_instance()->port_get_latency_range_ptr(port, (jack_latency_callback_mode_t)mode, range);
  780. range->min = 0;
  781. range->max = 0;
  782. }
  783. void jackbridge_port_set_latency_range(jack_port_t* port, uint32_t mode, jack_latency_range_t* range)
  784. {
  785. if (jackbridge_instance()->port_set_latency_range_ptr != NULL)
  786. jackbridge_instance()->port_set_latency_range_ptr(port, (jack_latency_callback_mode_t)mode, range);
  787. }
  788. bool jackbridge_recompute_total_latencies(jack_client_t* client)
  789. {
  790. if (jackbridge_instance()->recompute_total_latencies_ptr != NULL)
  791. return (jackbridge_instance()->recompute_total_latencies_ptr(client) == 0);
  792. return false;
  793. }
  794. // --------------------------------------------------------------------------------------------------------------------
  795. const char** jackbridge_get_ports(jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, uint64_t flags)
  796. {
  797. if (jackbridge_instance()->get_ports_ptr != NULL)
  798. return jackbridge_instance()->get_ports_ptr(client, port_name_pattern, type_name_pattern, (ulong)flags);
  799. return NULL;
  800. }
  801. jack_port_t* jackbridge_port_by_name(jack_client_t* client, const char* port_name)
  802. {
  803. if (jackbridge_instance()->port_by_name_ptr != NULL)
  804. return jackbridge_instance()->port_by_name_ptr(client, port_name);
  805. return NULL;
  806. }
  807. jack_port_t* jackbridge_port_by_id(jack_client_t* client, jack_port_id_t port_id)
  808. {
  809. if (jackbridge_instance()->port_by_id_ptr != NULL)
  810. return jackbridge_instance()->port_by_id_ptr(client, port_id);
  811. return NULL;
  812. }
  813. // --------------------------------------------------------------------------------------------------------------------
  814. void jackbridge_free(void* ptr)
  815. {
  816. if (jackbridge_instance()->free_ptr != NULL)
  817. return jackbridge_instance()->free_ptr(ptr);
  818. free(ptr);
  819. }
  820. // --------------------------------------------------------------------------------------------------------------------
  821. uint32_t jackbridge_midi_get_event_count(void* port_buffer)
  822. {
  823. if (jackbridge_instance()->midi_get_event_count_ptr != NULL)
  824. return jackbridge_instance()->midi_get_event_count_ptr(port_buffer);
  825. return 0;
  826. }
  827. bool jackbridge_midi_event_get(jack_midi_event_t* event, void* port_buffer, uint32_t event_index)
  828. {
  829. if (jackbridge_instance()->midi_event_get_ptr != NULL)
  830. return (jackbridge_instance()->midi_event_get_ptr(event, port_buffer, event_index) == 0);
  831. return false;
  832. }
  833. void jackbridge_midi_clear_buffer(void* port_buffer)
  834. {
  835. if (jackbridge_instance()->midi_clear_buffer_ptr != NULL)
  836. jackbridge_instance()->midi_clear_buffer_ptr(port_buffer);
  837. }
  838. bool jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, uint32_t data_size)
  839. {
  840. if (jackbridge_instance()->midi_event_write_ptr != NULL)
  841. return (jackbridge_instance()->midi_event_write_ptr(port_buffer, time, data, data_size) == 0);
  842. return false;
  843. }
  844. jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, uint32_t data_size)
  845. {
  846. if (jackbridge_instance()->midi_event_reserve_ptr != NULL)
  847. return jackbridge_instance()->midi_event_reserve_ptr(port_buffer, time, data_size);
  848. return NULL;
  849. }
  850. // --------------------------------------------------------------------------------------------------------------------
  851. bool jackbridge_release_timebase(jack_client_t* client)
  852. {
  853. if (jackbridge_instance()->release_timebase_ptr != NULL)
  854. return (jackbridge_instance()->release_timebase_ptr(client) == 0);
  855. return false;
  856. }
  857. bool jackbridge_set_sync_callback(jack_client_t* client, JackSyncCallback sync_callback, void* arg)
  858. {
  859. if (jackbridge_instance()->set_sync_callback_ptr != NULL)
  860. return (jackbridge_instance()->set_sync_callback_ptr(client, sync_callback, arg) == 0);
  861. return false;
  862. }
  863. bool jackbridge_set_sync_timeout(jack_client_t* client, jack_time_t timeout)
  864. {
  865. if (jackbridge_instance()->set_sync_timeout_ptr != NULL)
  866. return (jackbridge_instance()->set_sync_timeout_ptr(client, timeout) == 0);
  867. return false;
  868. }
  869. bool jackbridge_set_timebase_callback(jack_client_t* client, bool conditional, JackTimebaseCallback timebase_callback, void* arg)
  870. {
  871. if (jackbridge_instance()->set_timebase_callback_ptr != NULL)
  872. return (jackbridge_instance()->set_timebase_callback_ptr(client, conditional, timebase_callback, arg) == 0);
  873. return false;
  874. }
  875. bool jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame)
  876. {
  877. if (jackbridge_instance()->transport_locate_ptr != NULL)
  878. return (jackbridge_instance()->transport_locate_ptr(client, frame) == 0);
  879. return false;
  880. }
  881. uint32_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos)
  882. {
  883. if (jackbridge_instance()->transport_query_ptr != NULL)
  884. return jackbridge_instance()->transport_query_ptr(client, pos);
  885. if (pos != NULL)
  886. {
  887. // invalidate
  888. memset(pos, 0, sizeof(*pos));
  889. pos->unique_1 = 0;
  890. pos->unique_2 = 1;
  891. }
  892. return JackTransportStopped;
  893. }
  894. jack_nframes_t jackbridge_get_current_transport_frame(const jack_client_t* client)
  895. {
  896. if (jackbridge_instance()->get_current_transport_frame_ptr != NULL)
  897. return jackbridge_instance()->get_current_transport_frame_ptr(client);
  898. return 0;
  899. }
  900. bool jackbridge_transport_reposition(jack_client_t* client, const jack_position_t* pos)
  901. {
  902. if (jackbridge_instance()->transport_reposition_ptr != NULL)
  903. return (jackbridge_instance()->transport_reposition_ptr(client, pos) == 0);
  904. return false;
  905. }
  906. void jackbridge_transport_start(jack_client_t* client)
  907. {
  908. if (jackbridge_instance()->transport_start_ptr != NULL)
  909. jackbridge_instance()->transport_start_ptr(client);
  910. }
  911. void jackbridge_transport_stop(jack_client_t* client)
  912. {
  913. if (jackbridge_instance()->transport_stop_ptr != NULL)
  914. jackbridge_instance()->transport_stop_ptr(client);
  915. }
  916. // --------------------------------------------------------------------------------------------------------------------
  917. bool jackbridge_set_property(jack_client_t* client, jack_uuid_t subject, const char* key, const char* value, const char* type)
  918. {
  919. if (jackbridge_instance()->set_property_ptr != NULL)
  920. return (jackbridge_instance()->set_property_ptr(client, subject, key, value, type) == 0);
  921. return false;
  922. }
  923. bool jackbridge_get_property(jack_uuid_t subject, const char* key, char** value, char** type)
  924. {
  925. if (jackbridge_instance()->get_property_ptr != NULL)
  926. return (jackbridge_instance()->get_property_ptr(subject, key, value, type) == 0);
  927. return false;
  928. }
  929. void jackbridge_free_description(jack_description_t* desc, bool free_description_itself)
  930. {
  931. if (jackbridge_instance()->free_description_ptr != NULL)
  932. jackbridge_instance()->free_description_ptr(desc, free_description_itself);
  933. }
  934. bool jackbridge_get_properties(jack_uuid_t subject, jack_description_t* desc)
  935. {
  936. if (jackbridge_instance()->get_properties_ptr != NULL)
  937. return (jackbridge_instance()->get_properties_ptr(subject, desc) == 0);
  938. return false;
  939. }
  940. bool jackbridge_get_all_properties(jack_description_t** descs)
  941. {
  942. if (jackbridge_instance()->get_all_properties_ptr != NULL)
  943. return (jackbridge_instance()->get_all_properties_ptr(descs) == 0);
  944. return false;
  945. }
  946. bool jackbridge_remove_property(jack_client_t* client, jack_uuid_t subject, const char* key)
  947. {
  948. if (jackbridge_instance()->remove_property_ptr != NULL)
  949. return (jackbridge_instance()->remove_property_ptr(client, subject, key) == 0);
  950. return false;
  951. }
  952. int jackbridge_remove_properties(jack_client_t* client, jack_uuid_t subject)
  953. {
  954. if (jackbridge_instance()->remove_properties_ptr != NULL)
  955. return jackbridge_instance()->remove_properties_ptr(client, subject);
  956. return 0;
  957. }
  958. bool jackbridge_remove_all_properties(jack_client_t* client)
  959. {
  960. if (jackbridge_instance()->remove_all_properties_ptr != NULL)
  961. return (jackbridge_instance()->remove_all_properties_ptr(client) == 0);
  962. return false;
  963. }
  964. bool jackbridge_set_property_change_callback(jack_client_t* client, JackPropertyChangeCallback callback, void* arg)
  965. {
  966. if (jackbridge_instance()->set_property_change_callback_ptr != NULL)
  967. return (jackbridge_instance()->set_property_change_callback_ptr(client, callback, arg) == 0);
  968. return false;
  969. }
  970. void jackbridge_set_thread_creator(JackThreadCreator creator)
  971. {
  972. if (jackbridge_instance()->set_thread_creator_ptr != NULL)
  973. jackbridge_instance()->set_thread_creator_ptr(creator);
  974. }
  975. bool jackbridge_set_process_thread(jack_client_t* client, JackThreadCallback callback, void* arg)
  976. {
  977. if (jackbridge_instance()->set_process_thread_ptr != NULL)
  978. return (jackbridge_instance()->set_process_thread_ptr(client, callback, arg) == 0);
  979. return false;
  980. }
  981. jack_nframes_t jackbridge_cycle_wait(jack_client_t* client)
  982. {
  983. if (jackbridge_instance()->cycle_wait_ptr != NULL)
  984. return jackbridge_instance()->cycle_wait_ptr(client);
  985. return 0;
  986. }
  987. void jackbridge_cycle_signal(jack_client_t* client, int status)
  988. {
  989. if (jackbridge_instance()->cycle_signal_ptr != NULL)
  990. jackbridge_instance()->cycle_signal_ptr(client, status);
  991. }
  992. jack_nframes_t jackbridge_port_get_latency(jack_port_t* port)
  993. {
  994. if (jackbridge_instance()->port_get_latency_ptr != NULL)
  995. jackbridge_instance()->port_get_latency_ptr(port);
  996. return 0;
  997. }
  998. jack_nframes_t jackbridge_frame_time(const jack_client_t* client)
  999. {
  1000. if (jackbridge_instance()->frame_time_ptr != NULL)
  1001. jackbridge_instance()->frame_time_ptr(client);
  1002. return 0;
  1003. }