Audio plugin host https://kx.studio/carla
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.

2026 lines
71KB

  1. /*
  2. * JackBridge (Part 1, JACK functions)
  3. * Copyright (C) 2013-2014 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.hpp"
  17. #if ! (defined(JACKBRIDGE_DIRECT) || defined(JACKBRIDGE_DUMMY))
  18. #include "CarlaLibUtils.hpp"
  19. // -----------------------------------------------------------------------------
  20. extern "C" {
  21. typedef void (*JackSymLatencyCallback)(jack_latency_callback_mode_t mode, void* arg);
  22. typedef int (*JackSymProcessCallback)(jack_nframes_t nframes, void* arg);
  23. typedef void (*JackSymThreadInitCallback)(void* arg);
  24. typedef int (*JackSymGraphOrderCallback)(void* arg);
  25. typedef int (*JackSymXRunCallback)(void* arg);
  26. typedef int (*JackSymBufferSizeCallback)(jack_nframes_t nframes, void* arg);
  27. typedef int (*JackSymSampleRateCallback)(jack_nframes_t nframes, void* arg);
  28. typedef void (*JackSymPortRegistrationCallback)(jack_port_id_t port, int register_, void* arg);
  29. typedef void (*JackSymClientRegistrationCallback)(const char* name, int register_, void* arg);
  30. typedef void (*JackSymPortConnectCallback)(jack_port_id_t a, jack_port_id_t b, int connect, void* arg);
  31. typedef int (*JackSymPortRenameCallback)(jack_port_id_t port, const char* old_name, const char* new_name, void* arg); // NOTE: returns void in JACK1, int in JACK2
  32. typedef void (*JackSymFreewheelCallback)(int starting, void* arg);
  33. typedef void (*JackSymShutdownCallback)(void* arg);
  34. typedef void (*JackSymInfoShutdownCallback)(jack_status_t code, const char* reason, void* arg);
  35. typedef int (*JackSymSyncCallback)(jack_transport_state_t state, jack_position_t* pos, void* arg);
  36. typedef void (*JackSymTimebaseCallback)(jack_transport_state_t state, jack_nframes_t nframes, jack_position_t* pos, int new_pos, void* arg);
  37. typedef void (*JackSymSessionCallback)(jack_session_event_t* event, void* arg);
  38. typedef void (*JackSymPropertyChangeCallback)(jack_uuid_t subject, const char* key, jack_property_change_t change, void* arg);
  39. typedef void (*jacksym_get_version)(int*, int*, int*, int*);
  40. typedef const char* (*jacksym_get_version_string)(void);
  41. typedef jack_client_t* (*jacksym_client_open)(const char*, jack_options_t, jack_status_t*);
  42. typedef const char* (*jacksym_client_rename)(jack_client_t* client, const char* new_name);
  43. typedef int (*jacksym_client_close)(jack_client_t*);
  44. typedef int (*jacksym_client_name_size)(void);
  45. typedef char* (*jacksym_get_client_name)(jack_client_t*);
  46. typedef char* (*jacksym_get_uuid_for_client_name)(jack_client_t*, const char*);
  47. typedef char* (*jacksym_get_client_name_by_uuid)(jack_client_t*, const char*);
  48. typedef int (*jacksym_activate)(jack_client_t*);
  49. typedef int (*jacksym_deactivate)(jack_client_t*);
  50. typedef int (*jacksym_is_realtime)(jack_client_t*);
  51. typedef int (*jacksym_set_thread_init_callback)(jack_client_t*, JackSymThreadInitCallback, void*);
  52. typedef void (*jacksym_on_shutdown)(jack_client_t*, JackSymShutdownCallback, void*);
  53. typedef void (*jacksym_on_info_shutdown)(jack_client_t*, JackSymInfoShutdownCallback, void*);
  54. typedef int (*jacksym_set_process_callback)(jack_client_t*, JackSymProcessCallback, void*);
  55. typedef int (*jacksym_set_freewheel_callback)(jack_client_t*, JackSymFreewheelCallback, void*);
  56. typedef int (*jacksym_set_buffer_size_callback)(jack_client_t*, JackSymBufferSizeCallback, void*);
  57. typedef int (*jacksym_set_sample_rate_callback)(jack_client_t*, JackSymSampleRateCallback, void*);
  58. typedef int (*jacksym_set_client_registration_callback)(jack_client_t*, JackSymClientRegistrationCallback, void*);
  59. typedef int (*jacksym_set_port_registration_callback)(jack_client_t*, JackSymPortRegistrationCallback, void*);
  60. typedef int (*jacksym_set_port_rename_callback)(jack_client_t*, JackSymPortRenameCallback, void*);
  61. typedef int (*jacksym_set_port_connect_callback)(jack_client_t*, JackSymPortConnectCallback, void*);
  62. typedef int (*jacksym_set_graph_order_callback)(jack_client_t*, JackSymGraphOrderCallback, void*);
  63. typedef int (*jacksym_set_xrun_callback)(jack_client_t*, JackSymXRunCallback, void*);
  64. typedef int (*jacksym_set_latency_callback)(jack_client_t*, JackSymLatencyCallback, void*);
  65. typedef int (*jacksym_set_freewheel)(jack_client_t*, int);
  66. typedef int (*jacksym_set_buffer_size)(jack_client_t*, jack_nframes_t);
  67. typedef jack_nframes_t (*jacksym_get_sample_rate)(jack_client_t*);
  68. typedef jack_nframes_t (*jacksym_get_buffer_size)(jack_client_t*);
  69. typedef float (*jacksym_cpu_load)(jack_client_t*);
  70. typedef jack_port_t* (*jacksym_port_register)(jack_client_t*, const char*, const char*, ulong, ulong);
  71. typedef int (*jacksym_port_unregister)(jack_client_t*, jack_port_t*);
  72. typedef void* (*jacksym_port_get_buffer)(jack_port_t*, jack_nframes_t);
  73. typedef const char* (*jacksym_port_name)(const jack_port_t*);
  74. typedef jack_uuid_t (*jacksym_port_uuid)(const jack_port_t*);
  75. typedef const char* (*jacksym_port_short_name)(const jack_port_t*);
  76. typedef int (*jacksym_port_flags)(const jack_port_t*);
  77. typedef const char* (*jacksym_port_type)(const jack_port_t*);
  78. typedef int (*jacksym_port_is_mine)(const jack_client_t*, const jack_port_t*);
  79. typedef int (*jacksym_port_connected)(const jack_port_t*);
  80. typedef int (*jacksym_port_connected_to)(const jack_port_t*, const char*);
  81. typedef const char** (*jacksym_port_get_connections)(const jack_port_t*);
  82. typedef const char** (*jacksym_port_get_all_connections)(const jack_client_t*, const jack_port_t*);
  83. typedef int (*jacksym_port_set_name)(jack_port_t*, const char*);
  84. typedef int (*jacksym_port_set_alias)(jack_port_t*, const char*);
  85. typedef int (*jacksym_port_unset_alias)(jack_port_t*, const char*);
  86. typedef int (*jacksym_port_get_aliases)(const jack_port_t*, char* const aliases[2]);
  87. typedef int (*jacksym_port_request_monitor)(jack_port_t*, int);
  88. typedef int (*jacksym_port_request_monitor_by_name)(jack_client_t*, const char*, int);
  89. typedef int (*jacksym_port_ensure_monitor)(jack_port_t*, int);
  90. typedef int (*jacksym_port_monitoring_input)(jack_port_t*);
  91. typedef int (*jacksym_connect)(jack_client_t*, const char*, const char*);
  92. typedef int (*jacksym_disconnect)(jack_client_t*, const char*, const char*);
  93. typedef int (*jacksym_port_disconnect)(jack_client_t*, jack_port_t*);
  94. typedef int (*jacksym_port_name_size)(void);
  95. typedef int (*jacksym_port_type_size)(void);
  96. typedef size_t (*jacksym_port_type_get_buffer_size)(jack_client_t*, const char*);
  97. typedef void (*jacksym_port_get_latency_range)(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t*);
  98. typedef void (*jacksym_port_set_latency_range)(jack_port_t*, jack_latency_callback_mode_t, jack_latency_range_t*);
  99. typedef int (*jacksym_recompute_total_latencies)(jack_client_t*);
  100. typedef const char** (*jacksym_get_ports)(jack_client_t*, const char*, const char*, ulong);
  101. typedef jack_port_t* (*jacksym_port_by_name)(jack_client_t*, const char*);
  102. typedef jack_port_t* (*jacksym_port_by_id)(jack_client_t*, jack_port_id_t);
  103. typedef void (*jacksym_free)(void*);
  104. typedef uint32_t (*jacksym_midi_get_event_count)(void*);
  105. typedef int (*jacksym_midi_event_get)(jack_midi_event_t*, void*, uint32_t);
  106. typedef void (*jacksym_midi_clear_buffer)(void*);
  107. typedef int (*jacksym_midi_event_write)(void*, jack_nframes_t, const jack_midi_data_t*, size_t);
  108. typedef jack_midi_data_t* (*jacksym_midi_event_reserve)(void*, jack_nframes_t, size_t);
  109. typedef int (*jacksym_release_timebase)(jack_client_t*);
  110. typedef int (*jacksym_set_sync_callback)(jack_client_t*, JackSymSyncCallback, void*);
  111. typedef int (*jacksym_set_sync_timeout)(jack_client_t*, jack_time_t);
  112. typedef int (*jacksym_set_timebase_callback)(jack_client_t*, int, JackSymTimebaseCallback, void*);
  113. typedef int (*jacksym_transport_locate)(jack_client_t*, jack_nframes_t);
  114. typedef jack_transport_state_t (*jacksym_transport_query)(const jack_client_t*, jack_position_t*);
  115. typedef jack_nframes_t (*jacksym_get_current_transport_frame)(const jack_client_t*);
  116. typedef int (*jacksym_transport_reposition)(jack_client_t*, const jack_position_t*);
  117. typedef void (*jacksym_transport_start)(jack_client_t*);
  118. typedef void (*jacksym_transport_stop)(jack_client_t*);
  119. typedef int (*jacksym_set_property)(jack_client_t*, jack_uuid_t, const char*, const char*, const char*);
  120. typedef int (*jacksym_get_property)(jack_uuid_t, const char*, char**, char**);
  121. typedef void (*jacksym_free_description)(jack_description_t*, int);
  122. typedef int (*jacksym_get_properties)(jack_uuid_t, jack_description_t*);
  123. typedef int (*jacksym_get_all_properties)(jack_description_t**);
  124. typedef int (*jacksym_remove_property)(jack_client_t*, jack_uuid_t, const char*);
  125. typedef int (*jacksym_remove_properties)(jack_client_t*, jack_uuid_t);
  126. typedef int (*jacksym_remove_all_properties)(jack_client_t*);
  127. typedef int (*jacksym_set_property_change_callback)(jack_client_t*, JackSymPropertyChangeCallback, void*);
  128. } // extern "C"
  129. // -----------------------------------------------------------------------------
  130. struct JackBridge {
  131. lib_t lib;
  132. jacksym_get_version get_version_ptr;
  133. jacksym_get_version_string get_version_string_ptr;
  134. jacksym_client_open client_open_ptr;
  135. jacksym_client_rename client_rename_ptr;
  136. jacksym_client_close client_close_ptr;
  137. jacksym_client_name_size client_name_size_ptr;
  138. jacksym_get_client_name get_client_name_ptr;
  139. jacksym_get_uuid_for_client_name get_uuid_for_client_name_ptr;
  140. jacksym_get_client_name_by_uuid get_client_name_by_uuid_ptr;
  141. jacksym_activate activate_ptr;
  142. jacksym_deactivate deactivate_ptr;
  143. jacksym_is_realtime is_realtime_ptr;
  144. jacksym_set_thread_init_callback set_thread_init_callback_ptr;
  145. jacksym_on_shutdown on_shutdown_ptr;
  146. jacksym_on_info_shutdown on_info_shutdown_ptr;
  147. jacksym_set_process_callback set_process_callback_ptr;
  148. jacksym_set_freewheel_callback set_freewheel_callback_ptr;
  149. jacksym_set_buffer_size_callback set_buffer_size_callback_ptr;
  150. jacksym_set_sample_rate_callback set_sample_rate_callback_ptr;
  151. jacksym_set_client_registration_callback set_client_registration_callback_ptr;
  152. jacksym_set_port_registration_callback set_port_registration_callback_ptr;
  153. jacksym_set_port_rename_callback set_port_rename_callback_ptr;
  154. jacksym_set_port_connect_callback set_port_connect_callback_ptr;
  155. jacksym_set_graph_order_callback set_graph_order_callback_ptr;
  156. jacksym_set_xrun_callback set_xrun_callback_ptr;
  157. jacksym_set_latency_callback set_latency_callback_ptr;
  158. jacksym_set_freewheel set_freewheel_ptr;
  159. jacksym_set_buffer_size set_buffer_size_ptr;
  160. jacksym_get_sample_rate get_sample_rate_ptr;
  161. jacksym_get_buffer_size get_buffer_size_ptr;
  162. jacksym_cpu_load cpu_load_ptr;
  163. jacksym_port_register port_register_ptr;
  164. jacksym_port_unregister port_unregister_ptr;
  165. jacksym_port_get_buffer port_get_buffer_ptr;
  166. jacksym_port_name port_name_ptr;
  167. jacksym_port_uuid port_uuid_ptr;
  168. jacksym_port_short_name port_short_name_ptr;
  169. jacksym_port_flags port_flags_ptr;
  170. jacksym_port_type port_type_ptr;
  171. jacksym_port_is_mine port_is_mine_ptr;
  172. jacksym_port_connected port_connected_ptr;
  173. jacksym_port_connected_to port_connected_to_ptr;
  174. jacksym_port_get_connections port_get_connections_ptr;
  175. jacksym_port_get_all_connections port_get_all_connections_ptr;
  176. jacksym_port_set_name port_set_name_ptr;
  177. jacksym_port_set_alias port_set_alias_ptr;
  178. jacksym_port_unset_alias port_unset_alias_ptr;
  179. jacksym_port_get_aliases port_get_aliases_ptr;
  180. jacksym_port_request_monitor port_request_monitor_ptr;
  181. jacksym_port_request_monitor_by_name port_request_monitor_by_name_ptr;
  182. jacksym_port_ensure_monitor port_ensure_monitor_ptr;
  183. jacksym_port_monitoring_input port_monitoring_input_ptr;
  184. jacksym_connect connect_ptr;
  185. jacksym_disconnect disconnect_ptr;
  186. jacksym_port_disconnect port_disconnect_ptr;
  187. jacksym_port_name_size port_name_size_ptr;
  188. jacksym_port_type_size port_type_size_ptr;
  189. jacksym_port_type_get_buffer_size port_type_get_buffer_size_ptr;
  190. jacksym_port_get_latency_range port_get_latency_range_ptr;
  191. jacksym_port_set_latency_range port_set_latency_range_ptr;
  192. jacksym_recompute_total_latencies recompute_total_latencies_ptr;
  193. jacksym_get_ports get_ports_ptr;
  194. jacksym_port_by_name port_by_name_ptr;
  195. jacksym_port_by_id port_by_id_ptr;
  196. jacksym_free free_ptr;
  197. jacksym_midi_get_event_count midi_get_event_count_ptr;
  198. jacksym_midi_event_get midi_event_get_ptr;
  199. jacksym_midi_clear_buffer midi_clear_buffer_ptr;
  200. jacksym_midi_event_write midi_event_write_ptr;
  201. jacksym_midi_event_reserve midi_event_reserve_ptr;
  202. jacksym_release_timebase release_timebase_ptr;
  203. jacksym_set_sync_callback set_sync_callback_ptr;
  204. jacksym_set_sync_timeout set_sync_timeout_ptr;
  205. jacksym_set_timebase_callback set_timebase_callback_ptr;
  206. jacksym_transport_locate transport_locate_ptr;
  207. jacksym_transport_query transport_query_ptr;
  208. jacksym_get_current_transport_frame get_current_transport_frame_ptr;
  209. jacksym_transport_reposition transport_reposition_ptr;
  210. jacksym_transport_start transport_start_ptr;
  211. jacksym_transport_stop transport_stop_ptr;
  212. jacksym_set_property set_property_ptr;
  213. jacksym_get_property get_property_ptr;
  214. jacksym_free_description free_description_ptr;
  215. jacksym_get_properties get_properties_ptr;
  216. jacksym_get_all_properties get_all_properties_ptr;
  217. jacksym_remove_property remove_property_ptr;
  218. jacksym_remove_properties remove_properties_ptr;
  219. jacksym_remove_all_properties remove_all_properties_ptr;
  220. jacksym_set_property_change_callback set_property_change_callback_ptr;
  221. JackBridge()
  222. : lib(nullptr),
  223. get_version_ptr(nullptr),
  224. get_version_string_ptr(nullptr),
  225. client_open_ptr(nullptr),
  226. client_rename_ptr(nullptr),
  227. client_close_ptr(nullptr),
  228. client_name_size_ptr(nullptr),
  229. get_client_name_ptr(nullptr),
  230. get_uuid_for_client_name_ptr(nullptr),
  231. get_client_name_by_uuid_ptr(nullptr),
  232. activate_ptr(nullptr),
  233. deactivate_ptr(nullptr),
  234. is_realtime_ptr(nullptr),
  235. set_thread_init_callback_ptr(nullptr),
  236. on_shutdown_ptr(nullptr),
  237. on_info_shutdown_ptr(nullptr),
  238. set_process_callback_ptr(nullptr),
  239. set_freewheel_callback_ptr(nullptr),
  240. set_buffer_size_callback_ptr(nullptr),
  241. set_sample_rate_callback_ptr(nullptr),
  242. set_client_registration_callback_ptr(nullptr),
  243. set_port_registration_callback_ptr(nullptr),
  244. set_port_rename_callback_ptr(nullptr),
  245. set_port_connect_callback_ptr(nullptr),
  246. set_graph_order_callback_ptr(nullptr),
  247. set_xrun_callback_ptr(nullptr),
  248. set_latency_callback_ptr(nullptr),
  249. set_freewheel_ptr(nullptr),
  250. set_buffer_size_ptr(nullptr),
  251. get_sample_rate_ptr(nullptr),
  252. get_buffer_size_ptr(nullptr),
  253. cpu_load_ptr(nullptr),
  254. port_register_ptr(nullptr),
  255. port_unregister_ptr(nullptr),
  256. port_get_buffer_ptr(nullptr),
  257. port_name_ptr(nullptr),
  258. port_uuid_ptr(nullptr),
  259. port_short_name_ptr(nullptr),
  260. port_flags_ptr(nullptr),
  261. port_type_ptr(nullptr),
  262. port_is_mine_ptr(nullptr),
  263. port_connected_ptr(nullptr),
  264. port_connected_to_ptr(nullptr),
  265. port_get_connections_ptr(nullptr),
  266. port_get_all_connections_ptr(nullptr),
  267. port_set_name_ptr(nullptr),
  268. port_set_alias_ptr(nullptr),
  269. port_unset_alias_ptr(nullptr),
  270. port_get_aliases_ptr(nullptr),
  271. port_request_monitor_ptr(nullptr),
  272. port_request_monitor_by_name_ptr(nullptr),
  273. port_ensure_monitor_ptr(nullptr),
  274. port_monitoring_input_ptr(nullptr),
  275. connect_ptr(nullptr),
  276. disconnect_ptr(nullptr),
  277. port_disconnect_ptr(nullptr),
  278. port_name_size_ptr(nullptr),
  279. port_type_size_ptr(nullptr),
  280. port_type_get_buffer_size_ptr(nullptr),
  281. port_get_latency_range_ptr(nullptr),
  282. port_set_latency_range_ptr(nullptr),
  283. recompute_total_latencies_ptr(nullptr),
  284. get_ports_ptr(nullptr),
  285. port_by_name_ptr(nullptr),
  286. port_by_id_ptr(nullptr),
  287. free_ptr(nullptr),
  288. midi_get_event_count_ptr(nullptr),
  289. midi_event_get_ptr(nullptr),
  290. midi_clear_buffer_ptr(nullptr),
  291. midi_event_write_ptr(nullptr),
  292. midi_event_reserve_ptr(nullptr),
  293. release_timebase_ptr(nullptr),
  294. set_sync_callback_ptr(nullptr),
  295. set_sync_timeout_ptr(nullptr),
  296. set_timebase_callback_ptr(nullptr),
  297. transport_locate_ptr(nullptr),
  298. transport_query_ptr(nullptr),
  299. get_current_transport_frame_ptr(nullptr),
  300. transport_reposition_ptr(nullptr),
  301. transport_start_ptr(nullptr),
  302. transport_stop_ptr(nullptr),
  303. set_property_ptr(nullptr),
  304. get_property_ptr(nullptr),
  305. free_description_ptr(nullptr),
  306. get_properties_ptr(nullptr),
  307. get_all_properties_ptr(nullptr),
  308. remove_property_ptr(nullptr),
  309. remove_properties_ptr(nullptr),
  310. remove_all_properties_ptr(nullptr),
  311. set_property_change_callback_ptr(nullptr)
  312. {
  313. # if defined(CARLA_OS_MAC)
  314. const char* const filename("libjack.dylib");
  315. # elif defined(CARLA_OS_WIN64)
  316. const char* const filename("libjack64.dll");
  317. # elif defined(CARLA_OS_WIN)
  318. const char* const filename("libjack.dll");
  319. # else
  320. const char* const filename("libjack.so.0");
  321. # endif
  322. lib = lib_open(filename);
  323. if (lib == nullptr)
  324. {
  325. fprintf(stderr, "Failed to load JACK DLL, reason:\n%s\n", lib_error(filename));
  326. return;
  327. }
  328. else
  329. {
  330. fprintf(stdout, "%s loaded sucessfully!\n", filename);
  331. }
  332. #define JOIN(a, b) a ## b
  333. #define LIB_SYMBOL(NAME) JOIN(NAME, _ptr) = lib_symbol<jacksym_##NAME>(lib, "jack_" #NAME);
  334. LIB_SYMBOL(get_version)
  335. LIB_SYMBOL(get_version_string)
  336. LIB_SYMBOL(client_open)
  337. LIB_SYMBOL(client_rename)
  338. LIB_SYMBOL(client_close)
  339. LIB_SYMBOL(client_name_size)
  340. LIB_SYMBOL(get_client_name)
  341. LIB_SYMBOL(get_uuid_for_client_name)
  342. LIB_SYMBOL(get_client_name_by_uuid)
  343. LIB_SYMBOL(activate)
  344. LIB_SYMBOL(deactivate)
  345. LIB_SYMBOL(is_realtime)
  346. LIB_SYMBOL(set_thread_init_callback)
  347. LIB_SYMBOL(on_shutdown)
  348. LIB_SYMBOL(on_info_shutdown)
  349. LIB_SYMBOL(set_process_callback)
  350. LIB_SYMBOL(set_freewheel_callback)
  351. LIB_SYMBOL(set_buffer_size_callback)
  352. LIB_SYMBOL(set_sample_rate_callback)
  353. LIB_SYMBOL(set_client_registration_callback)
  354. LIB_SYMBOL(set_port_registration_callback)
  355. LIB_SYMBOL(set_port_rename_callback)
  356. LIB_SYMBOL(set_port_connect_callback)
  357. LIB_SYMBOL(set_graph_order_callback)
  358. LIB_SYMBOL(set_xrun_callback)
  359. LIB_SYMBOL(set_latency_callback)
  360. LIB_SYMBOL(set_freewheel)
  361. LIB_SYMBOL(set_buffer_size)
  362. LIB_SYMBOL(get_sample_rate)
  363. LIB_SYMBOL(get_buffer_size)
  364. LIB_SYMBOL(cpu_load)
  365. LIB_SYMBOL(port_register)
  366. LIB_SYMBOL(port_unregister)
  367. LIB_SYMBOL(port_get_buffer)
  368. LIB_SYMBOL(port_name)
  369. LIB_SYMBOL(port_uuid)
  370. LIB_SYMBOL(port_short_name)
  371. LIB_SYMBOL(port_flags)
  372. LIB_SYMBOL(port_type)
  373. LIB_SYMBOL(port_is_mine)
  374. LIB_SYMBOL(port_connected)
  375. LIB_SYMBOL(port_connected_to)
  376. LIB_SYMBOL(port_get_connections)
  377. LIB_SYMBOL(port_get_all_connections)
  378. LIB_SYMBOL(port_set_name)
  379. LIB_SYMBOL(port_set_alias)
  380. LIB_SYMBOL(port_unset_alias)
  381. LIB_SYMBOL(port_get_aliases)
  382. LIB_SYMBOL(port_request_monitor)
  383. LIB_SYMBOL(port_request_monitor_by_name)
  384. LIB_SYMBOL(port_ensure_monitor)
  385. LIB_SYMBOL(port_monitoring_input)
  386. LIB_SYMBOL(connect)
  387. LIB_SYMBOL(disconnect)
  388. LIB_SYMBOL(port_disconnect)
  389. LIB_SYMBOL(port_name_size)
  390. LIB_SYMBOL(port_type_size)
  391. LIB_SYMBOL(port_type_get_buffer_size)
  392. LIB_SYMBOL(port_get_latency_range)
  393. LIB_SYMBOL(port_set_latency_range)
  394. LIB_SYMBOL(recompute_total_latencies)
  395. LIB_SYMBOL(get_ports)
  396. LIB_SYMBOL(port_by_name)
  397. LIB_SYMBOL(port_by_id)
  398. LIB_SYMBOL(free)
  399. LIB_SYMBOL(midi_get_event_count)
  400. LIB_SYMBOL(midi_event_get)
  401. LIB_SYMBOL(midi_clear_buffer)
  402. LIB_SYMBOL(midi_event_write)
  403. LIB_SYMBOL(midi_event_reserve)
  404. LIB_SYMBOL(release_timebase)
  405. LIB_SYMBOL(set_sync_callback)
  406. LIB_SYMBOL(set_sync_timeout)
  407. LIB_SYMBOL(set_timebase_callback)
  408. LIB_SYMBOL(transport_locate)
  409. LIB_SYMBOL(transport_query)
  410. LIB_SYMBOL(get_current_transport_frame)
  411. LIB_SYMBOL(transport_reposition)
  412. LIB_SYMBOL(transport_start)
  413. LIB_SYMBOL(transport_stop)
  414. LIB_SYMBOL(set_property)
  415. LIB_SYMBOL(get_property)
  416. LIB_SYMBOL(free_description)
  417. LIB_SYMBOL(get_properties)
  418. LIB_SYMBOL(get_all_properties)
  419. LIB_SYMBOL(remove_property)
  420. LIB_SYMBOL(remove_properties)
  421. LIB_SYMBOL(remove_all_properties)
  422. LIB_SYMBOL(set_property_change_callback)
  423. #undef JOIN
  424. #undef LIB_SYMBOL
  425. }
  426. ~JackBridge() noexcept
  427. {
  428. if (lib != nullptr)
  429. {
  430. lib_close(lib);
  431. lib = nullptr;
  432. }
  433. }
  434. CARLA_DECLARE_NON_COPY_STRUCT(JackBridge);
  435. };
  436. // -----------------------------------------------------------------------------
  437. static const JackBridge& getBridgeInstance() noexcept
  438. {
  439. static const JackBridge bridge;
  440. return bridge;
  441. }
  442. // -----------------------------------------------------------------------------
  443. #ifdef __WINE__
  444. struct WineBridge {
  445. void* ptr;
  446. JackLatencyCallback latency_cb;
  447. JackProcessCallback process_cb;
  448. JackThreadInitCallback thread_init_cb;
  449. JackGraphOrderCallback graph_order_cb;
  450. JackXRunCallback xrun_cb;
  451. JackBufferSizeCallback bufsize_cb;
  452. JackSampleRateCallback srate_cb;
  453. JackPortRegistrationCallback port_reg_cb;
  454. JackClientRegistrationCallback client_reg_cb;
  455. JackPortConnectCallback port_conn_cb;
  456. JackPortRenameCallback port_rename_cb;
  457. JackFreewheelCallback freewheel_cb;
  458. JackShutdownCallback shutdown_cb;
  459. JackInfoShutdownCallback info_shutdown_cb;
  460. JackSyncCallback sync_cb;
  461. JackTimebaseCallback timebase_cb;
  462. JackSessionCallback session_cb;
  463. JackPropertyChangeCallback prop_change_cb;
  464. WineBridge() noexcept
  465. : ptr(nullptr),
  466. latency_cb(nullptr),
  467. process_cb(nullptr),
  468. thread_init_cb(nullptr),
  469. graph_order_cb(nullptr),
  470. xrun_cb(nullptr),
  471. bufsize_cb(nullptr),
  472. srate_cb(nullptr),
  473. port_reg_cb(nullptr),
  474. client_reg_cb(nullptr),
  475. port_conn_cb(nullptr),
  476. port_rename_cb(nullptr),
  477. freewheel_cb(nullptr),
  478. shutdown_cb(nullptr),
  479. info_shutdown_cb(nullptr),
  480. sync_cb(nullptr),
  481. timebase_cb(nullptr),
  482. session_cb(nullptr),
  483. prop_change_cb(nullptr) {}
  484. static /*const*/ WineBridge& getInstance() noexcept
  485. {
  486. static /*const*/ WineBridge bridge;
  487. return bridge;
  488. }
  489. void set_ptr(void* p) noexcept { ptr = p; }
  490. void set_latency (JackLatencyCallback cb) noexcept { latency_cb = cb; }
  491. void set_process (JackProcessCallback cb) noexcept { process_cb = cb; }
  492. void set_thread_init (JackThreadInitCallback cb) noexcept { thread_init_cb = cb; }
  493. void set_graph_order (JackGraphOrderCallback cb) noexcept { graph_order_cb = cb; }
  494. void set_xrun (JackXRunCallback cb) noexcept { xrun_cb = cb; }
  495. void set_bufsize (JackBufferSizeCallback cb) noexcept { bufsize_cb = cb; }
  496. void set_srate (JackSampleRateCallback cb) noexcept { srate_cb = cb; }
  497. void set_port_reg (JackPortRegistrationCallback cb) noexcept { port_reg_cb = cb; }
  498. void set_client_reg (JackClientRegistrationCallback cb) noexcept { client_reg_cb = cb; }
  499. void set_port_conn (JackPortConnectCallback cb) noexcept { port_conn_cb = cb; }
  500. void set_port_rename (JackPortRenameCallback cb) noexcept { port_rename_cb = cb; }
  501. void set_freewheel (JackFreewheelCallback cb) noexcept { freewheel_cb = cb; }
  502. void set_shutdown (JackShutdownCallback cb) noexcept { shutdown_cb = cb; }
  503. void set_info_shutdown(JackInfoShutdownCallback cb) noexcept { info_shutdown_cb = cb; }
  504. void set_sync (JackSyncCallback cb) noexcept { sync_cb = cb; }
  505. void set_timebase (JackTimebaseCallback cb) noexcept { timebase_cb = cb; }
  506. void set_session (JackSessionCallback cb) noexcept { session_cb = cb; }
  507. void set_prop_change (JackPropertyChangeCallback cb) noexcept { prop_change_cb = cb; }
  508. static void latency(jack_latency_callback_mode_t mode, void* arg)
  509. {
  510. return getInstance().latency_cb(mode, getInstance().ptr);
  511. }
  512. static int process(jack_nframes_t nframes, void* arg)
  513. {
  514. return getInstance().process_cb(nframes, getInstance().ptr);
  515. }
  516. static void thread_init(void* arg)
  517. {
  518. return getInstance().thread_init_cb(getInstance().ptr);
  519. }
  520. static int graph_order(void* arg)
  521. {
  522. return getInstance().graph_order_cb(getInstance().ptr);
  523. }
  524. static int xrun(void* arg)
  525. {
  526. return getInstance().xrun_cb(getInstance().ptr);
  527. }
  528. static int bufsize(jack_nframes_t nframes, void* arg)
  529. {
  530. return getInstance().bufsize_cb(nframes, getInstance().ptr);
  531. }
  532. static int srate(jack_nframes_t nframes, void* arg)
  533. {
  534. return getInstance().srate_cb(nframes, getInstance().ptr);
  535. }
  536. static void port_reg(jack_port_id_t port, int register_, void* arg)
  537. {
  538. return getInstance().port_reg_cb(port, register_, getInstance().ptr);
  539. }
  540. static void client_reg(const char* name, int register_, void* arg)
  541. {
  542. return getInstance().client_reg_cb(name, register_, getInstance().ptr);
  543. }
  544. static void port_conn(jack_port_id_t a, jack_port_id_t b, int connect, void* arg)
  545. {
  546. return getInstance().port_conn_cb(a, b, connect, getInstance().ptr);
  547. }
  548. static int port_rename(jack_port_id_t port, const char* old_name, const char* new_name, void* arg)
  549. {
  550. return getInstance().port_rename_cb(port, old_name, new_name, getInstance().ptr);
  551. }
  552. static void freewheel(int starting, void* arg)
  553. {
  554. return getInstance().freewheel_cb(starting, getInstance().ptr);
  555. }
  556. static void shutdown(void* arg)
  557. {
  558. return getInstance().shutdown_cb(getInstance().ptr);
  559. }
  560. static void info_shutdown(jack_status_t code, const char* reason, void* arg)
  561. {
  562. return getInstance().info_shutdown_cb(code, reason, getInstance().ptr);
  563. }
  564. static int sync(jack_transport_state_t state, jack_position_t* pos, void* arg)
  565. {
  566. return getInstance().sync_cb(state, pos, getInstance().ptr);
  567. }
  568. static void timebase(jack_transport_state_t state, jack_nframes_t nframes, jack_position_t* pos, int new_pos, void* arg)
  569. {
  570. return getInstance().timebase_cb(state, nframes, pos, new_pos, getInstance().ptr);
  571. }
  572. static void session(jack_session_event_t* event, void* arg)
  573. {
  574. return getInstance().session_cb(event, getInstance().ptr);
  575. }
  576. static void prop_change(jack_uuid_t subject, const char* key, jack_property_change_t change, void* arg)
  577. {
  578. return getInstance().prop_change_cb(subject, key, change, getInstance().ptr);
  579. }
  580. CARLA_DECLARE_NON_COPY_STRUCT(WineBridge);
  581. };
  582. #endif // __WINE__
  583. #endif // ! (defined(JACKBRIDGE_DIRECT) || defined(JACKBRIDGE_DUMMY))
  584. // -----------------------------------------------------------------------------
  585. bool jackbridge_is_ok() noexcept
  586. {
  587. #if defined(JACKBRIDGE_DUMMY)
  588. return false;
  589. #elif defined(JACKBRIDGE_DIRECT)
  590. return true;
  591. #else
  592. return (getBridgeInstance().lib != nullptr);
  593. #endif
  594. }
  595. // -----------------------------------------------------------------------------
  596. void jackbridge_get_version(int* major_ptr, int* minor_ptr, int* micro_ptr, int* proto_ptr)
  597. {
  598. #if defined(JACKBRIDGE_DUMMY)
  599. #elif defined(JACKBRIDGE_DIRECT)
  600. return jack_get_version(major_ptr, minor_ptr, micro_ptr, proto_ptr);
  601. #else
  602. if (getBridgeInstance().get_version_ptr != nullptr)
  603. return getBridgeInstance().get_version_ptr(major_ptr, minor_ptr, micro_ptr, proto_ptr);
  604. #endif
  605. if (major_ptr != nullptr)
  606. *major_ptr = 0;
  607. if (minor_ptr != nullptr)
  608. *minor_ptr = 0;
  609. if (micro_ptr != nullptr)
  610. *micro_ptr = 0;
  611. if (proto_ptr != nullptr)
  612. *proto_ptr = 0;
  613. }
  614. const char* jackbridge_get_version_string()
  615. {
  616. #if defined(JACKBRIDGE_DUMMY)
  617. #elif defined(JACKBRIDGE_DIRECT)
  618. return jack_get_version_string();
  619. #else
  620. if (getBridgeInstance().get_version_string_ptr != nullptr)
  621. return getBridgeInstance().get_version_string_ptr();
  622. #endif
  623. return nullptr;
  624. }
  625. // -----------------------------------------------------------------------------
  626. jack_client_t* jackbridge_client_open(const char* client_name, uint32_t options, jack_status_t* status)
  627. {
  628. carla_stdout("%s called", __FUNCTION__);
  629. #if defined(JACKBRIDGE_DUMMY)
  630. #elif defined(JACKBRIDGE_DIRECT)
  631. return jack_client_open(client_name, static_cast<jack_options_t>(options), status);
  632. #else
  633. if (getBridgeInstance().client_open_ptr != nullptr)
  634. return getBridgeInstance().client_open_ptr(client_name, static_cast<jack_options_t>(options), status);
  635. #endif
  636. if (status != nullptr)
  637. *status = JackServerError;
  638. return nullptr;
  639. }
  640. bool jackbridge_client_close(jack_client_t* client)
  641. {
  642. carla_stdout("%s called", __FUNCTION__);
  643. #if defined(JACKBRIDGE_DUMMY)
  644. #elif defined(JACKBRIDGE_DIRECT)
  645. return (jack_client_close(client) == 0);
  646. #else
  647. if (getBridgeInstance().client_close_ptr != nullptr)
  648. return (getBridgeInstance().client_close_ptr(client) == 0);
  649. #endif
  650. return false;
  651. }
  652. // -----------------------------------------------------------------------------
  653. int jackbridge_client_name_size()
  654. {
  655. carla_stdout("%s called", __FUNCTION__);
  656. #if defined(JACKBRIDGE_DUMMY)
  657. #elif defined(JACKBRIDGE_DIRECT)
  658. return jack_client_name_size();
  659. #else
  660. if (getBridgeInstance().client_name_size_ptr != nullptr)
  661. return getBridgeInstance().client_name_size_ptr();
  662. #endif
  663. return 33;
  664. }
  665. char* jackbridge_get_client_name(jack_client_t* client)
  666. {
  667. carla_stdout("%s called", __FUNCTION__);
  668. #if defined(JACKBRIDGE_DUMMY)
  669. #elif defined(JACKBRIDGE_DIRECT)
  670. return jack_get_client_name(client);
  671. #else
  672. if (getBridgeInstance().get_client_name_ptr != nullptr)
  673. return getBridgeInstance().get_client_name_ptr(client);
  674. #endif
  675. return nullptr;
  676. }
  677. // -----------------------------------------------------------------------------
  678. char* jackbridge_get_uuid_for_client_name(jack_client_t* client, const char* name)
  679. {
  680. carla_stdout("%s called", __FUNCTION__);
  681. #if defined(JACKBRIDGE_DUMMY)
  682. #elif defined(JACKBRIDGE_DIRECT)
  683. return jack_get_uuid_for_client_name(client, name);
  684. #else
  685. if (getBridgeInstance().get_uuid_for_client_name_ptr != nullptr)
  686. return getBridgeInstance().get_uuid_for_client_name_ptr(client, name);
  687. #endif
  688. return nullptr;
  689. }
  690. char* jackbridge_get_client_name_by_uuid(jack_client_t* client, const char* uuid)
  691. {
  692. carla_stdout("%s called", __FUNCTION__);
  693. #if defined(JACKBRIDGE_DUMMY)
  694. #elif defined(JACKBRIDGE_DIRECT)
  695. return jack_get_client_name_by_uuid(client, uuid);
  696. #else
  697. if (getBridgeInstance().get_client_name_by_uuid_ptr != nullptr)
  698. return getBridgeInstance().get_client_name_by_uuid_ptr(client, uuid);
  699. #endif
  700. return nullptr;
  701. }
  702. // -----------------------------------------------------------------------------
  703. bool jackbridge_activate(jack_client_t* client)
  704. {
  705. carla_stdout("%s called", __FUNCTION__);
  706. #if defined(JACKBRIDGE_DUMMY)
  707. #elif defined(JACKBRIDGE_DIRECT)
  708. return (jack_activate(client) == 0);
  709. #else
  710. if (getBridgeInstance().activate_ptr != nullptr)
  711. return (getBridgeInstance().activate_ptr(client) == 0);
  712. #endif
  713. return false;
  714. }
  715. bool jackbridge_deactivate(jack_client_t* client)
  716. {
  717. carla_stdout("%s called", __FUNCTION__);
  718. #if defined(JACKBRIDGE_DUMMY)
  719. #elif defined(JACKBRIDGE_DIRECT)
  720. return (jack_deactivate(client) == 0);
  721. #else
  722. if (getBridgeInstance().deactivate_ptr != nullptr)
  723. return (getBridgeInstance().deactivate_ptr(client) == 0);
  724. #endif
  725. return false;
  726. }
  727. bool jackbridge_is_realtime(jack_client_t* client)
  728. {
  729. carla_stdout("%s called", __FUNCTION__);
  730. #if defined(JACKBRIDGE_DUMMY)
  731. #elif defined(JACKBRIDGE_DIRECT)
  732. return jack_is_realtime(client);
  733. #else
  734. if (getBridgeInstance().is_realtime_ptr != nullptr)
  735. return getBridgeInstance().is_realtime_ptr(client);
  736. #endif
  737. return false;
  738. }
  739. // -----------------------------------------------------------------------------
  740. bool jackbridge_set_thread_init_callback(jack_client_t* client, JackThreadInitCallback thread_init_callback, void* arg)
  741. {
  742. carla_stdout("%s called", __FUNCTION__);
  743. #if defined(JACKBRIDGE_DUMMY)
  744. #elif defined(JACKBRIDGE_DIRECT)
  745. return (jack_set_thread_init_callback(client, thread_init_callback, arg) == 0);
  746. #else
  747. if (getBridgeInstance().set_thread_init_callback_ptr != nullptr)
  748. {
  749. # ifdef __WINE__
  750. WineBridge::getInstance().set_thread_init(thread_init_callback);
  751. return (getBridgeInstance().set_thread_init_callback_ptr(client, WineBridge::thread_init, arg) == 0);
  752. # else
  753. return (getBridgeInstance().set_thread_init_callback_ptr(client, thread_init_callback, arg) == 0);
  754. # endif
  755. }
  756. #endif
  757. return false;
  758. }
  759. void jackbridge_on_shutdown(jack_client_t* client, JackShutdownCallback shutdown_callback, void* arg)
  760. {
  761. carla_stdout("%s called", __FUNCTION__);
  762. #if defined(JACKBRIDGE_DUMMY)
  763. #elif defined(JACKBRIDGE_DIRECT)
  764. jack_on_shutdown(client, shutdown_callback, arg);
  765. #else
  766. if (getBridgeInstance().on_shutdown_ptr != nullptr)
  767. {
  768. # ifdef __WINE__
  769. WineBridge::getInstance().set_shutdown(shutdown_callback);
  770. getBridgeInstance().on_shutdown_ptr(client, WineBridge::shutdown, arg);
  771. # else
  772. getBridgeInstance().on_shutdown_ptr(client, shutdown_callback, arg);
  773. # endif
  774. }
  775. #endif
  776. }
  777. void jackbridge_on_info_shutdown(jack_client_t* client, JackInfoShutdownCallback shutdown_callback, void* arg)
  778. {
  779. carla_stdout("%s called", __FUNCTION__);
  780. #if defined(JACKBRIDGE_DUMMY)
  781. #elif defined(JACKBRIDGE_DIRECT)
  782. jack_on_info_shutdown(client, shutdown_callback, arg);
  783. #else
  784. if (getBridgeInstance().on_info_shutdown_ptr != nullptr)
  785. {
  786. # ifdef __WINE__
  787. WineBridge::getInstance().set_info_shutdown(shutdown_callback);
  788. getBridgeInstance().on_info_shutdown_ptr(client, WineBridge::info_shutdown, arg);
  789. # else
  790. getBridgeInstance().on_info_shutdown_ptr(client, shutdown_callback, arg);
  791. # endif
  792. }
  793. #endif
  794. }
  795. bool jackbridge_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg)
  796. {
  797. carla_stdout("%s called", __FUNCTION__);
  798. #if defined(JACKBRIDGE_DUMMY)
  799. #elif defined(JACKBRIDGE_DIRECT)
  800. return (jack_set_process_callback(client, process_callback, arg) == 0);
  801. #else
  802. if (getBridgeInstance().set_process_callback_ptr != nullptr)
  803. {
  804. # ifdef __WINE__
  805. WineBridge::getInstance().set_process(process_callback);
  806. return (getBridgeInstance().set_process_callback_ptr(client, WineBridge::process, arg) == 0);
  807. # else
  808. return (getBridgeInstance().set_process_callback_ptr(client, process_callback, arg) == 0);
  809. # endif
  810. }
  811. #endif
  812. return false;
  813. }
  814. bool jackbridge_set_freewheel_callback(jack_client_t* client, JackFreewheelCallback freewheel_callback, void* arg)
  815. {
  816. carla_stdout("%s called", __FUNCTION__);
  817. #if defined(JACKBRIDGE_DUMMY)
  818. #elif defined(JACKBRIDGE_DIRECT)
  819. return (jack_set_freewheel_callback(client, freewheel_callback, arg) == 0);
  820. #else
  821. if (getBridgeInstance().set_freewheel_callback_ptr != nullptr)
  822. {
  823. # ifdef __WINE__
  824. WineBridge::getInstance().set_freewheel(freewheel_callback);
  825. return (getBridgeInstance().set_freewheel_callback_ptr(client, WineBridge::freewheel, arg) == 0);
  826. # else
  827. return (getBridgeInstance().set_freewheel_callback_ptr(client, freewheel_callback, arg) == 0);
  828. # endif
  829. }
  830. #endif
  831. return false;
  832. }
  833. bool jackbridge_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback bufsize_callback, void* arg)
  834. {
  835. carla_stdout("%s called", __FUNCTION__);
  836. #if defined(JACKBRIDGE_DUMMY)
  837. #elif defined(JACKBRIDGE_DIRECT)
  838. return (jack_set_buffer_size_callback(client, bufsize_callback, arg) == 0);
  839. #else
  840. if (getBridgeInstance().set_buffer_size_callback_ptr != nullptr)
  841. {
  842. # ifdef __WINE__
  843. WineBridge::getInstance().set_ptr(arg);
  844. WineBridge::getInstance().set_bufsize(bufsize_callback);
  845. return (getBridgeInstance().set_buffer_size_callback_ptr(client, WineBridge::bufsize, arg) == 0);
  846. # else
  847. return (getBridgeInstance().set_buffer_size_callback_ptr(client, bufsize_callback, arg) == 0);
  848. # endif
  849. }
  850. #endif
  851. return false;
  852. }
  853. bool jackbridge_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback srate_callback, void* arg)
  854. {
  855. carla_stdout("%s called", __FUNCTION__);
  856. #if defined(JACKBRIDGE_DUMMY)
  857. #elif defined(JACKBRIDGE_DIRECT)
  858. return (jack_set_sample_rate_callback(client, srate_callback, arg) == 0);
  859. #else
  860. if (getBridgeInstance().set_sample_rate_callback_ptr != nullptr)
  861. {
  862. # ifdef __WINE__
  863. WineBridge::getInstance().set_srate(srate_callback);
  864. return (getBridgeInstance().set_sample_rate_callback_ptr(client, WineBridge::srate, arg) == 0);
  865. # else
  866. return (getBridgeInstance().set_sample_rate_callback_ptr(client, srate_callback, arg) == 0);
  867. # endif
  868. }
  869. #endif
  870. return false;
  871. }
  872. bool jackbridge_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback registration_callback, void* arg)
  873. {
  874. carla_stdout("%s called", __FUNCTION__);
  875. #if defined(JACKBRIDGE_DUMMY)
  876. #elif defined(JACKBRIDGE_DIRECT)
  877. return (jack_set_client_registration_callback(client, registration_callback, arg) == 0);
  878. #else
  879. if (getBridgeInstance().set_client_registration_callback_ptr != nullptr)
  880. {
  881. # ifdef __WINE__
  882. WineBridge::getInstance().set_client_reg(registration_callback);
  883. return (getBridgeInstance().set_client_registration_callback_ptr(client, WineBridge::client_reg, arg) == 0);
  884. # else
  885. return (getBridgeInstance().set_client_registration_callback_ptr(client, registration_callback, arg) == 0);
  886. # endif
  887. }
  888. #endif
  889. return false;
  890. }
  891. bool jackbridge_set_port_registration_callback(jack_client_t* client, JackPortRegistrationCallback registration_callback, void *arg)
  892. {
  893. carla_stdout("%s called", __FUNCTION__);
  894. #if defined(JACKBRIDGE_DUMMY)
  895. #elif defined(JACKBRIDGE_DIRECT)
  896. return (jack_set_port_registration_callback(client, registration_callback, arg) == 0);
  897. #else
  898. if (getBridgeInstance().set_port_registration_callback_ptr != nullptr)
  899. {
  900. # ifdef __WINE__
  901. WineBridge::getInstance().set_port_reg(registration_callback);
  902. return (getBridgeInstance().set_port_registration_callback_ptr(client, WineBridge::port_reg, arg) == 0);
  903. # else
  904. return (getBridgeInstance().set_port_registration_callback_ptr(client, registration_callback, arg) == 0);
  905. # endif
  906. }
  907. #endif
  908. return false;
  909. }
  910. bool jackbridge_set_port_rename_callback(jack_client_t* client, JackPortRenameCallback rename_callback, void* arg)
  911. {
  912. carla_stdout("%s called", __FUNCTION__);
  913. #if defined(JACKBRIDGE_DUMMY)
  914. #elif defined(JACKBRIDGE_DIRECT)
  915. return (jack_set_port_rename_callback(client, rename_callback, arg) == 0);
  916. #else
  917. if (getBridgeInstance().get_version_string_ptr != nullptr) // don't use this on JACK1
  918. return false;
  919. if (getBridgeInstance().set_port_rename_callback_ptr != nullptr)
  920. {
  921. # ifdef __WINE__
  922. WineBridge::getInstance().set_port_rename(rename_callback);
  923. return (getBridgeInstance().set_port_rename_callback_ptr(client, WineBridge::port_rename, arg) == 0);
  924. # else
  925. return (getBridgeInstance().set_port_rename_callback_ptr(client, rename_callback, arg) == 0);
  926. # endif
  927. }
  928. #endif
  929. return false;
  930. }
  931. bool jackbridge_set_port_connect_callback(jack_client_t* client, JackPortConnectCallback connect_callback, void* arg)
  932. {
  933. carla_stdout("%s called", __FUNCTION__);
  934. #if defined(JACKBRIDGE_DUMMY)
  935. #elif defined(JACKBRIDGE_DIRECT)
  936. return (jack_set_port_connect_callback(client, connect_callback, arg) == 0);
  937. #else
  938. if (getBridgeInstance().set_port_connect_callback_ptr != nullptr)
  939. {
  940. # ifdef __WINE__
  941. WineBridge::getInstance().set_port_conn(connect_callback);
  942. return (getBridgeInstance().set_port_connect_callback_ptr(client, WineBridge::port_conn, arg) == 0);
  943. # else
  944. return (getBridgeInstance().set_port_connect_callback_ptr(client, connect_callback, arg) == 0);
  945. # endif
  946. }
  947. #endif
  948. return false;
  949. }
  950. bool jackbridge_set_graph_order_callback(jack_client_t* client, JackGraphOrderCallback graph_callback, void* arg)
  951. {
  952. carla_stdout("%s called", __FUNCTION__);
  953. #if defined(JACKBRIDGE_DUMMY)
  954. #elif defined(JACKBRIDGE_DIRECT)
  955. return (jack_set_graph_order_callback(client, graph_callback, arg) == 0);
  956. #else
  957. if (getBridgeInstance().set_graph_order_callback_ptr != nullptr)
  958. {
  959. # ifdef __WINE__
  960. WineBridge::getInstance().set_graph_order(graph_callback);
  961. return (getBridgeInstance().set_graph_order_callback_ptr(client, WineBridge::graph_order, arg) == 0);
  962. # else
  963. return (getBridgeInstance().set_graph_order_callback_ptr(client, graph_callback, arg) == 0);
  964. # endif
  965. }
  966. #endif
  967. return false;
  968. }
  969. bool jackbridge_set_xrun_callback(jack_client_t* client, JackXRunCallback xrun_callback, void* arg)
  970. {
  971. carla_stdout("%s called", __FUNCTION__);
  972. #if defined(JACKBRIDGE_DUMMY)
  973. #elif defined(JACKBRIDGE_DIRECT)
  974. return (jack_set_xrun_callback(client, xrun_callback, arg) == 0);
  975. #else
  976. if (getBridgeInstance().set_xrun_callback_ptr != nullptr)
  977. {
  978. # ifdef __WINE__
  979. WineBridge::getInstance().set_xrun(xrun_callback);
  980. return (getBridgeInstance().set_xrun_callback_ptr(client, WineBridge::xrun, arg) == 0);
  981. # else
  982. return (getBridgeInstance().set_xrun_callback_ptr(client, xrun_callback, arg) == 0);
  983. # endif
  984. }
  985. #endif
  986. return false;
  987. }
  988. bool jackbridge_set_latency_callback(jack_client_t* client, JackLatencyCallback latency_callback, void* arg)
  989. {
  990. carla_stdout("%s called", __FUNCTION__);
  991. #if defined(JACKBRIDGE_DUMMY)
  992. #elif defined(JACKBRIDGE_DIRECT)
  993. return (jack_set_latency_callback(client, latency_callback, arg) == 0);
  994. #else
  995. if (getBridgeInstance().set_latency_callback_ptr != nullptr)
  996. {
  997. # ifdef __WINE__
  998. WineBridge::getInstance().set_latency(latency_callback);
  999. return (getBridgeInstance().set_latency_callback_ptr(client, WineBridge::latency, arg) == 0);
  1000. # else
  1001. return (getBridgeInstance().set_latency_callback_ptr(client, latency_callback, arg) == 0);
  1002. # endif
  1003. }
  1004. #endif
  1005. return false;
  1006. }
  1007. // -----------------------------------------------------------------------------
  1008. bool jackbridge_set_freewheel(jack_client_t* client, bool onoff)
  1009. {
  1010. carla_stdout("%s called", __FUNCTION__);
  1011. #if defined(JACKBRIDGE_DUMMY)
  1012. #elif defined(JACKBRIDGE_DIRECT)
  1013. return jack_set_freewheel(client, onoff);
  1014. #else
  1015. if (getBridgeInstance().set_freewheel_ptr != nullptr)
  1016. return getBridgeInstance().set_freewheel_ptr(client, onoff);
  1017. #endif
  1018. return false;
  1019. }
  1020. bool jackbridge_set_buffer_size(jack_client_t* client, jack_nframes_t nframes)
  1021. {
  1022. carla_stdout("%s called", __FUNCTION__);
  1023. #if defined(JACKBRIDGE_DUMMY)
  1024. #elif defined(JACKBRIDGE_DIRECT)
  1025. return jack_set_buffer_size(client, nframes);
  1026. #else
  1027. if (getBridgeInstance().set_buffer_size_ptr != nullptr)
  1028. return getBridgeInstance().set_buffer_size_ptr(client, nframes);
  1029. #endif
  1030. return false;
  1031. }
  1032. // -----------------------------------------------------------------------------
  1033. jack_nframes_t jackbridge_get_sample_rate(jack_client_t* client)
  1034. {
  1035. carla_stdout("%s called", __FUNCTION__);
  1036. #if defined(JACKBRIDGE_DUMMY)
  1037. #elif defined(JACKBRIDGE_DIRECT)
  1038. return jack_get_sample_rate(client);
  1039. #else
  1040. if (getBridgeInstance().get_sample_rate_ptr != nullptr)
  1041. return getBridgeInstance().get_sample_rate_ptr(client);
  1042. #endif
  1043. return 0;
  1044. }
  1045. jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client)
  1046. {
  1047. carla_stdout("%s called", __FUNCTION__);
  1048. #if defined(JACKBRIDGE_DUMMY)
  1049. #elif defined(JACKBRIDGE_DIRECT)
  1050. return jack_get_buffer_size(client);
  1051. #else
  1052. if (getBridgeInstance().get_buffer_size_ptr != nullptr)
  1053. return getBridgeInstance().get_buffer_size_ptr(client);
  1054. #endif
  1055. return 0;
  1056. }
  1057. float jackbridge_cpu_load(jack_client_t* client)
  1058. {
  1059. carla_stdout("%s called", __FUNCTION__);
  1060. #if defined(JACKBRIDGE_DUMMY)
  1061. #elif defined(JACKBRIDGE_DIRECT)
  1062. return jack_cpu_load(client);
  1063. #else
  1064. if (getBridgeInstance().cpu_load_ptr != nullptr)
  1065. return getBridgeInstance().cpu_load_ptr(client);
  1066. #endif
  1067. return 0.0f;
  1068. }
  1069. // -----------------------------------------------------------------------------
  1070. jack_port_t* jackbridge_port_register(jack_client_t* client, const char* port_name, const char* port_type, uint64_t flags, uint64_t buffer_size)
  1071. {
  1072. carla_stdout("%s called", __FUNCTION__);
  1073. #if defined(JACKBRIDGE_DUMMY)
  1074. #elif defined(JACKBRIDGE_DIRECT)
  1075. return jack_port_register(client, port_name, port_type, flags, buffer_size);
  1076. #else
  1077. if (getBridgeInstance().port_register_ptr != nullptr)
  1078. return getBridgeInstance().port_register_ptr(client, port_name, port_type, flags, buffer_size);
  1079. #endif
  1080. return nullptr;
  1081. }
  1082. bool jackbridge_port_unregister(jack_client_t* client, jack_port_t* port)
  1083. {
  1084. carla_stdout("%s called", __FUNCTION__);
  1085. #if defined(JACKBRIDGE_DUMMY)
  1086. #elif defined(JACKBRIDGE_DIRECT)
  1087. return (jack_port_unregister(client, port) == 0);
  1088. #else
  1089. if (getBridgeInstance().port_unregister_ptr != nullptr)
  1090. return (getBridgeInstance().port_unregister_ptr(client, port) == 0);
  1091. #endif
  1092. return false;
  1093. }
  1094. void* jackbridge_port_get_buffer(jack_port_t* port, jack_nframes_t nframes)
  1095. {
  1096. carla_stdout("%s called", __FUNCTION__);
  1097. #if defined(JACKBRIDGE_DUMMY)
  1098. #elif defined(JACKBRIDGE_DIRECT)
  1099. return jack_port_get_buffer(port, nframes);
  1100. #else
  1101. if (getBridgeInstance().port_get_buffer_ptr != nullptr)
  1102. return getBridgeInstance().port_get_buffer_ptr(port, nframes);
  1103. #endif
  1104. return nullptr;
  1105. }
  1106. // -----------------------------------------------------------------------------
  1107. const char* jackbridge_port_name(const jack_port_t* port)
  1108. {
  1109. carla_stdout("%s called", __FUNCTION__);
  1110. #if defined(JACKBRIDGE_DUMMY)
  1111. #elif defined(JACKBRIDGE_DIRECT)
  1112. return jack_port_name(port);
  1113. #else
  1114. if (getBridgeInstance().port_name_ptr != nullptr)
  1115. return getBridgeInstance().port_name_ptr(port);
  1116. #endif
  1117. return nullptr;
  1118. }
  1119. jack_uuid_t jackbridge_port_uuid(const jack_port_t* port)
  1120. {
  1121. carla_stdout("%s called", __FUNCTION__);
  1122. #if defined(JACKBRIDGE_DUMMY)
  1123. #elif defined(JACKBRIDGE_DIRECT)
  1124. return jack_port_uuid(port);
  1125. #else
  1126. if (getBridgeInstance().port_uuid_ptr != nullptr)
  1127. return getBridgeInstance().port_uuid_ptr(port);
  1128. #endif
  1129. return 0;
  1130. }
  1131. const char* jackbridge_port_short_name(const jack_port_t* port)
  1132. {
  1133. carla_stdout("%s called", __FUNCTION__);
  1134. #if defined(JACKBRIDGE_DUMMY)
  1135. #elif defined(JACKBRIDGE_DIRECT)
  1136. return jack_port_short_name(port);
  1137. #else
  1138. if (getBridgeInstance().port_short_name_ptr != nullptr)
  1139. return getBridgeInstance().port_short_name_ptr(port);
  1140. #endif
  1141. return nullptr;
  1142. }
  1143. int jackbridge_port_flags(const jack_port_t* port)
  1144. {
  1145. carla_stdout("%s called", __FUNCTION__);
  1146. #if defined(JACKBRIDGE_DUMMY)
  1147. #elif defined(JACKBRIDGE_DIRECT)
  1148. return jack_port_flags(port);
  1149. #else
  1150. if (getBridgeInstance().port_flags_ptr != nullptr)
  1151. return getBridgeInstance().port_flags_ptr(port);
  1152. #endif
  1153. return 0x0;
  1154. }
  1155. const char* jackbridge_port_type(const jack_port_t* port)
  1156. {
  1157. carla_stdout("%s called", __FUNCTION__);
  1158. #if defined(JACKBRIDGE_DUMMY)
  1159. #elif defined(JACKBRIDGE_DIRECT)
  1160. return jack_port_type(port);
  1161. #else
  1162. if (getBridgeInstance().port_type_ptr != nullptr)
  1163. return getBridgeInstance().port_type_ptr(port);
  1164. #endif
  1165. return nullptr;
  1166. }
  1167. bool jackbridge_port_is_mine(const jack_client_t* client, const jack_port_t* port)
  1168. {
  1169. carla_stdout("%s called", __FUNCTION__);
  1170. #if defined(JACKBRIDGE_DUMMY)
  1171. #elif defined(JACKBRIDGE_DIRECT)
  1172. return jack_port_is_mine(client, port);
  1173. #else
  1174. if (getBridgeInstance().port_is_mine_ptr != nullptr)
  1175. return getBridgeInstance().port_is_mine_ptr(client, port);
  1176. #endif
  1177. return false;
  1178. }
  1179. int jackbridge_port_connected(const jack_port_t* port)
  1180. {
  1181. carla_stdout("%s called", __FUNCTION__);
  1182. #if defined(JACKBRIDGE_DUMMY)
  1183. #elif defined(JACKBRIDGE_DIRECT)
  1184. return jack_port_connected(port);
  1185. #else
  1186. if (getBridgeInstance().port_connected_ptr != nullptr)
  1187. return getBridgeInstance().port_connected_ptr(port);
  1188. #endif
  1189. return 0;
  1190. }
  1191. bool jackbridge_port_connected_to(const jack_port_t* port, const char* port_name)
  1192. {
  1193. carla_stdout("%s called", __FUNCTION__);
  1194. #if defined(JACKBRIDGE_DUMMY)
  1195. #elif defined(JACKBRIDGE_DIRECT)
  1196. return jack_port_connected_to(port, port_name);
  1197. #else
  1198. if (getBridgeInstance().port_connected_to_ptr != nullptr)
  1199. return getBridgeInstance().port_connected_to_ptr(port, port_name);
  1200. #endif
  1201. return false;
  1202. }
  1203. const char** jackbridge_port_get_connections(const jack_port_t* port)
  1204. {
  1205. carla_stdout("%s called", __FUNCTION__);
  1206. #if defined(JACKBRIDGE_DUMMY)
  1207. #elif defined(JACKBRIDGE_DIRECT)
  1208. return jack_port_get_connections(port);
  1209. #else
  1210. if (getBridgeInstance().port_get_connections_ptr != nullptr)
  1211. return getBridgeInstance().port_get_connections_ptr(port);
  1212. #endif
  1213. return nullptr;
  1214. }
  1215. const char** jackbridge_port_get_all_connections(const jack_client_t* client, const jack_port_t* port)
  1216. {
  1217. carla_stdout("%s called", __FUNCTION__);
  1218. #if defined(JACKBRIDGE_DUMMY)
  1219. #elif defined(JACKBRIDGE_DIRECT)
  1220. return jack_port_get_all_connections(client, port);
  1221. #else
  1222. if (getBridgeInstance().port_get_all_connections_ptr != nullptr)
  1223. return getBridgeInstance().port_get_all_connections_ptr(client, port);
  1224. #endif
  1225. return nullptr;
  1226. }
  1227. // -----------------------------------------------------------------------------
  1228. bool jackbridge_port_set_name(jack_port_t* port, const char* port_name)
  1229. {
  1230. carla_stdout("%s called", __FUNCTION__);
  1231. #if defined(JACKBRIDGE_DUMMY)
  1232. #elif defined(JACKBRIDGE_DIRECT)
  1233. return (jack_port_set_name(port, port_name) == 0);
  1234. #else
  1235. if (getBridgeInstance().get_version_string_ptr != nullptr) // don't use this on JACK1
  1236. return false;
  1237. if (getBridgeInstance().port_set_name_ptr != nullptr)
  1238. return (getBridgeInstance().port_set_name_ptr(port, port_name) == 0);
  1239. #endif
  1240. return false;
  1241. }
  1242. bool jackbridge_port_set_alias(jack_port_t* port, const char* alias)
  1243. {
  1244. carla_stdout("%s called", __FUNCTION__);
  1245. #if defined(JACKBRIDGE_DUMMY)
  1246. #elif defined(JACKBRIDGE_DIRECT)
  1247. return (jack_port_set_alias(port, alias) == 0);
  1248. #else
  1249. if (getBridgeInstance().port_set_alias_ptr != nullptr)
  1250. return (getBridgeInstance().port_set_alias_ptr(port, alias) == 0);
  1251. #endif
  1252. return false;
  1253. }
  1254. bool jackbridge_port_unset_alias(jack_port_t* port, const char* alias)
  1255. {
  1256. carla_stdout("%s called", __FUNCTION__);
  1257. #if defined(JACKBRIDGE_DUMMY)
  1258. #elif defined(JACKBRIDGE_DIRECT)
  1259. return (jack_port_unset_alias(port, alias) == 0);
  1260. #else
  1261. if (getBridgeInstance().port_unset_alias_ptr != nullptr)
  1262. return (getBridgeInstance().port_unset_alias_ptr(port, alias) == 0);
  1263. #endif
  1264. return false;
  1265. }
  1266. int jackbridge_port_get_aliases(const jack_port_t* port, char* const aliases[2])
  1267. {
  1268. carla_stdout("%s called", __FUNCTION__);
  1269. #if defined(JACKBRIDGE_DUMMY)
  1270. #elif defined(JACKBRIDGE_DIRECT)
  1271. return (jack_port_get_aliases(port, aliases) == 0);
  1272. #else
  1273. if (getBridgeInstance().port_get_aliases_ptr != nullptr)
  1274. return getBridgeInstance().port_get_aliases_ptr(port, aliases);
  1275. #endif
  1276. return 0;
  1277. }
  1278. // -----------------------------------------------------------------------------
  1279. bool jackbridge_port_request_monitor(jack_port_t* port, bool onoff)
  1280. {
  1281. carla_stdout("%s called", __FUNCTION__);
  1282. #if defined(JACKBRIDGE_DUMMY)
  1283. #elif defined(JACKBRIDGE_DIRECT)
  1284. return (jack_port_request_monitor(port, onoff) == 0);
  1285. #else
  1286. if (getBridgeInstance().port_request_monitor_ptr != nullptr)
  1287. return (getBridgeInstance().port_request_monitor_ptr(port, onoff) == 0);
  1288. #endif
  1289. return false;
  1290. }
  1291. bool jackbridge_port_request_monitor_by_name(jack_client_t* client, const char* port_name, bool onoff)
  1292. {
  1293. carla_stdout("%s called", __FUNCTION__);
  1294. #if defined(JACKBRIDGE_DUMMY)
  1295. #elif defined(JACKBRIDGE_DIRECT)
  1296. return (jack_port_request_monitor_by_name(client, port_name, onoff) == 0);
  1297. #else
  1298. if (getBridgeInstance().port_request_monitor_by_name_ptr != nullptr)
  1299. return (getBridgeInstance().port_request_monitor_by_name_ptr(client, port_name, onoff) == 0);
  1300. #endif
  1301. return false;
  1302. }
  1303. bool jackbridge_port_ensure_monitor(jack_port_t* port, bool onoff)
  1304. {
  1305. carla_stdout("%s called", __FUNCTION__);
  1306. #if defined(JACKBRIDGE_DUMMY)
  1307. #elif defined(JACKBRIDGE_DIRECT)
  1308. return (jack_port_ensure_monitor(port, onoff) == 0);
  1309. #else
  1310. if (getBridgeInstance().port_ensure_monitor_ptr != nullptr)
  1311. return (getBridgeInstance().port_ensure_monitor_ptr(port, onoff) == 0);
  1312. #endif
  1313. return false;
  1314. }
  1315. bool jackbridge_port_monitoring_input(jack_port_t* port)
  1316. {
  1317. carla_stdout("%s called", __FUNCTION__);
  1318. #if defined(JACKBRIDGE_DUMMY)
  1319. #elif defined(JACKBRIDGE_DIRECT)
  1320. return jack_port_monitoring_input(port);
  1321. #else
  1322. if (getBridgeInstance().port_monitoring_input_ptr != nullptr)
  1323. return getBridgeInstance().port_monitoring_input_ptr(port);
  1324. #endif
  1325. return false;
  1326. }
  1327. // -----------------------------------------------------------------------------
  1328. bool jackbridge_connect(jack_client_t* client, const char* source_port, const char* destination_port)
  1329. {
  1330. carla_stdout("%s called", __FUNCTION__);
  1331. #if defined(JACKBRIDGE_DUMMY)
  1332. #elif defined(JACKBRIDGE_DIRECT)
  1333. return (jack_connect(client, source_port, destination_port) == 0);
  1334. #else
  1335. if (getBridgeInstance().connect_ptr != nullptr)
  1336. return (getBridgeInstance().connect_ptr(client, source_port, destination_port) == 0);
  1337. #endif
  1338. return false;
  1339. }
  1340. bool jackbridge_disconnect(jack_client_t* client, const char* source_port, const char* destination_port)
  1341. {
  1342. carla_stdout("%s called", __FUNCTION__);
  1343. #if defined(JACKBRIDGE_DUMMY)
  1344. #elif defined(JACKBRIDGE_DIRECT)
  1345. return (jack_disconnect(client, source_port, destination_port) == 0);
  1346. #else
  1347. if (getBridgeInstance().disconnect_ptr != nullptr)
  1348. return (getBridgeInstance().disconnect_ptr(client, source_port, destination_port) == 0);
  1349. #endif
  1350. return false;
  1351. }
  1352. bool jackbridge_port_disconnect(jack_client_t* client, jack_port_t* port)
  1353. {
  1354. carla_stdout("%s called", __FUNCTION__);
  1355. #if defined(JACKBRIDGE_DUMMY)
  1356. #elif defined(JACKBRIDGE_DIRECT)
  1357. return (jack_port_disconnect(client, port) == 0);
  1358. #else
  1359. if (getBridgeInstance().port_disconnect_ptr != nullptr)
  1360. return (getBridgeInstance().port_disconnect_ptr(client, port) == 0);
  1361. #endif
  1362. return false;
  1363. }
  1364. // -----------------------------------------------------------------------------
  1365. int jackbridge_port_name_size()
  1366. {
  1367. carla_stdout("%s called", __FUNCTION__);
  1368. #if defined(JACKBRIDGE_DUMMY)
  1369. #elif defined(JACKBRIDGE_DIRECT)
  1370. return jack_port_name_size();
  1371. #else
  1372. if (getBridgeInstance().port_name_size_ptr != nullptr)
  1373. return getBridgeInstance().port_name_size_ptr();
  1374. #endif
  1375. return 256;
  1376. }
  1377. int jackbridge_port_type_size()
  1378. {
  1379. carla_stdout("%s called", __FUNCTION__);
  1380. #if defined(JACKBRIDGE_DUMMY)
  1381. #elif defined(JACKBRIDGE_DIRECT)
  1382. return jack_port_type_size();
  1383. #else
  1384. if (getBridgeInstance().port_type_size_ptr != nullptr)
  1385. return getBridgeInstance().port_type_size_ptr();
  1386. #endif
  1387. return 32;
  1388. }
  1389. uint32_t jackbridge_port_type_get_buffer_size(jack_client_t* client, const char* port_type)
  1390. {
  1391. carla_stdout("%s called", __FUNCTION__);
  1392. #if defined(JACKBRIDGE_DUMMY)
  1393. #elif defined(JACKBRIDGE_DIRECT)
  1394. return jack_port_type_get_buffer_size(client, port_type);
  1395. #else
  1396. if (getBridgeInstance().port_type_get_buffer_size_ptr != nullptr)
  1397. return getBridgeInstance().port_type_get_buffer_size_ptr(client, port_type);
  1398. #endif
  1399. return 0;
  1400. }
  1401. // -----------------------------------------------------------------------------
  1402. void jackbridge_port_get_latency_range(jack_port_t* port, uint32_t mode, jack_latency_range_t* range)
  1403. {
  1404. carla_stdout("%s called", __FUNCTION__);
  1405. #if defined(JACKBRIDGE_DUMMY)
  1406. #elif defined(JACKBRIDGE_DIRECT)
  1407. return jack_port_get_latency_range(port, static_cast<jack_latency_callback_mode_t>(mode), range);
  1408. #else
  1409. if (getBridgeInstance().port_get_latency_range_ptr != nullptr)
  1410. return getBridgeInstance().port_get_latency_range_ptr(port, static_cast<jack_latency_callback_mode_t>(mode), range);
  1411. #endif
  1412. range->min = 0;
  1413. range->max = 0;
  1414. }
  1415. void jackbridge_port_set_latency_range(jack_port_t* port, uint32_t mode, jack_latency_range_t* range)
  1416. {
  1417. carla_stdout("%s called", __FUNCTION__);
  1418. #if defined(JACKBRIDGE_DUMMY)
  1419. #elif defined(JACKBRIDGE_DIRECT)
  1420. jack_port_set_latency_range(port, static_cast<jack_latency_callback_mode_t>(mode), range);
  1421. #else
  1422. if (getBridgeInstance().port_set_latency_range_ptr != nullptr)
  1423. getBridgeInstance().port_set_latency_range_ptr(port, static_cast<jack_latency_callback_mode_t>(mode), range);
  1424. #endif
  1425. }
  1426. bool jackbridge_recompute_total_latencies(jack_client_t* client)
  1427. {
  1428. carla_stdout("%s called", __FUNCTION__);
  1429. #if defined(JACKBRIDGE_DUMMY)
  1430. #elif defined(JACKBRIDGE_DIRECT)
  1431. return (jack_recompute_total_latencies(client) == 0);
  1432. #else
  1433. if (getBridgeInstance().recompute_total_latencies_ptr != nullptr)
  1434. return (getBridgeInstance().recompute_total_latencies_ptr(client) == 0);
  1435. #endif
  1436. return false;
  1437. }
  1438. // -----------------------------------------------------------------------------
  1439. const char** jackbridge_get_ports(jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, uint64_t flags)
  1440. {
  1441. carla_stdout("%s called", __FUNCTION__);
  1442. #if defined(JACKBRIDGE_DUMMY)
  1443. #elif defined(JACKBRIDGE_DIRECT)
  1444. return jack_get_ports(client, port_name_pattern, type_name_pattern, flags);
  1445. #else
  1446. if (getBridgeInstance().get_ports_ptr != nullptr)
  1447. return getBridgeInstance().get_ports_ptr(client, port_name_pattern, type_name_pattern, flags);
  1448. #endif
  1449. return nullptr;
  1450. }
  1451. jack_port_t* jackbridge_port_by_name(jack_client_t* client, const char* port_name)
  1452. {
  1453. carla_stdout("%s called", __FUNCTION__);
  1454. #if defined(JACKBRIDGE_DUMMY)
  1455. #elif defined(JACKBRIDGE_DIRECT)
  1456. return jack_port_by_name(client, port_name);
  1457. #else
  1458. if (getBridgeInstance().port_by_name_ptr != nullptr)
  1459. return getBridgeInstance().port_by_name_ptr(client, port_name);
  1460. #endif
  1461. return nullptr;
  1462. }
  1463. jack_port_t* jackbridge_port_by_id(jack_client_t* client, jack_port_id_t port_id)
  1464. {
  1465. carla_stdout("%s called", __FUNCTION__);
  1466. #if defined(JACKBRIDGE_DUMMY)
  1467. #elif defined(JACKBRIDGE_DIRECT)
  1468. return jack_port_by_id(client, port_id);
  1469. #else
  1470. if (getBridgeInstance().port_by_id_ptr != nullptr)
  1471. return getBridgeInstance().port_by_id_ptr(client, port_id);
  1472. #endif
  1473. return nullptr;
  1474. }
  1475. // -----------------------------------------------------------------------------
  1476. void jackbridge_free(void* ptr)
  1477. {
  1478. carla_stdout("%s called", __FUNCTION__);
  1479. #if defined(JACKBRIDGE_DUMMY)
  1480. #elif defined(JACKBRIDGE_DIRECT)
  1481. return jack_free(ptr);
  1482. #else
  1483. if (getBridgeInstance().free_ptr != nullptr)
  1484. return getBridgeInstance().free_ptr(ptr);
  1485. // just in case
  1486. std::free(ptr);
  1487. #endif
  1488. }
  1489. // -----------------------------------------------------------------------------
  1490. uint32_t jackbridge_midi_get_event_count(void* port_buffer)
  1491. {
  1492. carla_stdout("%s called", __FUNCTION__);
  1493. #if defined(JACKBRIDGE_DUMMY)
  1494. #elif defined(JACKBRIDGE_DIRECT)
  1495. return jack_midi_get_event_count(port_buffer);
  1496. #else
  1497. if (getBridgeInstance().midi_get_event_count_ptr != nullptr)
  1498. return getBridgeInstance().midi_get_event_count_ptr(port_buffer);
  1499. #endif
  1500. return 0;
  1501. }
  1502. bool jackbridge_midi_event_get(jack_midi_event_t* event, void* port_buffer, uint32_t event_index)
  1503. {
  1504. carla_stdout("%s called", __FUNCTION__);
  1505. #if defined(JACKBRIDGE_DUMMY)
  1506. #elif defined(JACKBRIDGE_DIRECT)
  1507. return (jack_midi_event_get(event, port_buffer, event_index) == 0);
  1508. #else
  1509. if (getBridgeInstance().midi_event_get_ptr != nullptr)
  1510. return (getBridgeInstance().midi_event_get_ptr(event, port_buffer, event_index) == 0);
  1511. #endif
  1512. return false;
  1513. }
  1514. void jackbridge_midi_clear_buffer(void* port_buffer)
  1515. {
  1516. carla_stdout("%s called", __FUNCTION__);
  1517. #if defined(JACKBRIDGE_DUMMY)
  1518. #elif defined(JACKBRIDGE_DIRECT)
  1519. jack_midi_clear_buffer(port_buffer);
  1520. #else
  1521. if (getBridgeInstance().midi_clear_buffer_ptr != nullptr)
  1522. getBridgeInstance().midi_clear_buffer_ptr(port_buffer);
  1523. #endif
  1524. }
  1525. bool jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, uint32_t data_size)
  1526. {
  1527. carla_stdout("%s called", __FUNCTION__);
  1528. #if defined(JACKBRIDGE_DUMMY)
  1529. #elif defined(JACKBRIDGE_DIRECT)
  1530. return (jack_midi_event_write(port_buffer, time, data, data_size) == 0);
  1531. #else
  1532. if (getBridgeInstance().midi_event_write_ptr != nullptr)
  1533. return (getBridgeInstance().midi_event_write_ptr(port_buffer, time, data, data_size) == 0);
  1534. #endif
  1535. return false;
  1536. }
  1537. jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, uint32_t data_size)
  1538. {
  1539. carla_stdout("%s called", __FUNCTION__);
  1540. #if defined(JACKBRIDGE_DUMMY)
  1541. #elif defined(JACKBRIDGE_DIRECT)
  1542. return jack_midi_event_reserve(port_buffer, time, data_size);
  1543. #else
  1544. if (getBridgeInstance().midi_event_reserve_ptr != nullptr)
  1545. return getBridgeInstance().midi_event_reserve_ptr(port_buffer, time, data_size);
  1546. #endif
  1547. return nullptr;
  1548. }
  1549. // -----------------------------------------------------------------------------
  1550. bool jackbridge_release_timebase(jack_client_t* client)
  1551. {
  1552. carla_stdout("%s called", __FUNCTION__);
  1553. #if defined(JACKBRIDGE_DUMMY)
  1554. #elif defined(JACKBRIDGE_DIRECT)
  1555. return (jack_release_timebase(client) == 0);
  1556. #else
  1557. if (getBridgeInstance().release_timebase_ptr != nullptr)
  1558. return (getBridgeInstance().release_timebase_ptr(client) == 0);
  1559. #endif
  1560. return false;
  1561. }
  1562. bool jackbridge_set_sync_callback(jack_client_t* client, JackSyncCallback sync_callback, void* arg)
  1563. {
  1564. carla_stdout("%s called", __FUNCTION__);
  1565. #if defined(JACKBRIDGE_DUMMY)
  1566. #elif defined(JACKBRIDGE_DIRECT)
  1567. return (jack_set_sync_callback(client, sync_callback, arg) == 0);
  1568. #else
  1569. if (getBridgeInstance().set_sync_callback_ptr != nullptr)
  1570. {
  1571. # ifdef __WINE__
  1572. WineBridge::getInstance().set_sync(sync_callback);
  1573. return (getBridgeInstance().set_sync_callback_ptr(client, WineBridge::sync, arg) == 0);
  1574. # else
  1575. return (getBridgeInstance().set_sync_callback_ptr(client, sync_callback, arg) == 0);
  1576. # endif
  1577. }
  1578. #endif
  1579. return false;
  1580. }
  1581. bool jackbridge_set_sync_timeout(jack_client_t* client, jack_time_t timeout)
  1582. {
  1583. carla_stdout("%s called", __FUNCTION__);
  1584. #if defined(JACKBRIDGE_DUMMY)
  1585. #elif defined(JACKBRIDGE_DIRECT)
  1586. return (jack_set_sync_timeout(client, timeout) == 0);
  1587. #else
  1588. if (getBridgeInstance().set_sync_timeout_ptr != nullptr)
  1589. return (getBridgeInstance().set_sync_timeout_ptr(client, timeout) == 0);
  1590. #endif
  1591. return false;
  1592. }
  1593. bool jackbridge_set_timebase_callback(jack_client_t* client, bool conditional, JackTimebaseCallback timebase_callback, void* arg)
  1594. {
  1595. carla_stdout("%s called", __FUNCTION__);
  1596. #if defined(JACKBRIDGE_DUMMY)
  1597. #elif defined(JACKBRIDGE_DIRECT)
  1598. return (jack_set_timebase_callback(client, conditional, timebase_callback, arg) == 0);
  1599. #else
  1600. if (getBridgeInstance().set_timebase_callback_ptr != nullptr)
  1601. {
  1602. # ifdef __WINE__
  1603. WineBridge::getInstance().set_timebase(timebase_callback);
  1604. return (getBridgeInstance().set_timebase_callback_ptr(client, conditional, WineBridge::timebase, arg) == 0);
  1605. # else
  1606. return (getBridgeInstance().set_timebase_callback_ptr(client, conditional, timebase_callback, arg) == 0);
  1607. # endif
  1608. }
  1609. #endif
  1610. return false;
  1611. }
  1612. bool jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame)
  1613. {
  1614. carla_stdout("%s called", __FUNCTION__);
  1615. #if defined(JACKBRIDGE_DUMMY)
  1616. #elif defined(JACKBRIDGE_DIRECT)
  1617. return (jack_transport_locate(client, frame) == 0);
  1618. #else
  1619. if (getBridgeInstance().transport_locate_ptr != nullptr)
  1620. return (getBridgeInstance().transport_locate_ptr(client, frame) == 0);
  1621. #endif
  1622. return false;
  1623. }
  1624. uint32_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos)
  1625. {
  1626. carla_stdout("%s called", __FUNCTION__);
  1627. #if defined(JACKBRIDGE_DUMMY)
  1628. #elif defined(JACKBRIDGE_DIRECT)
  1629. return jack_transport_query(client, pos);
  1630. #else
  1631. if (getBridgeInstance().transport_query_ptr != nullptr)
  1632. return getBridgeInstance().transport_query_ptr(client, pos);
  1633. #endif
  1634. if (pos != nullptr)
  1635. {
  1636. // invalidate
  1637. pos->unique_1 = 0;
  1638. pos->unique_2 = 1;
  1639. }
  1640. return JackTransportStopped;
  1641. }
  1642. jack_nframes_t jackbridge_get_current_transport_frame(const jack_client_t* client)
  1643. {
  1644. carla_stdout("%s called", __FUNCTION__);
  1645. #if defined(JACKBRIDGE_DUMMY)
  1646. #elif defined(JACKBRIDGE_DIRECT)
  1647. return jack_get_current_transport_frame(client);
  1648. #else
  1649. if (getBridgeInstance().get_current_transport_frame_ptr != nullptr)
  1650. return getBridgeInstance().get_current_transport_frame_ptr(client);
  1651. #endif
  1652. return 0;
  1653. }
  1654. bool jackbridge_transport_reposition(jack_client_t* client, const jack_position_t* pos)
  1655. {
  1656. carla_stdout("%s called", __FUNCTION__);
  1657. #if defined(JACKBRIDGE_DUMMY)
  1658. #elif defined(JACKBRIDGE_DIRECT)
  1659. return (jack_transport_reposition(client, pos) == 0);
  1660. #else
  1661. if (getBridgeInstance().transport_reposition_ptr != nullptr)
  1662. return (getBridgeInstance().transport_reposition_ptr(client, pos) == 0);
  1663. #endif
  1664. return false;
  1665. }
  1666. void jackbridge_transport_start(jack_client_t* client)
  1667. {
  1668. carla_stdout("%s called", __FUNCTION__);
  1669. #if defined(JACKBRIDGE_DUMMY)
  1670. #elif defined(JACKBRIDGE_DIRECT)
  1671. jack_transport_start(client);
  1672. #else
  1673. if (getBridgeInstance().transport_start_ptr != nullptr)
  1674. getBridgeInstance().transport_start_ptr(client);
  1675. #endif
  1676. }
  1677. void jackbridge_transport_stop(jack_client_t* client)
  1678. {
  1679. carla_stdout("%s called", __FUNCTION__);
  1680. #if defined(JACKBRIDGE_DUMMY)
  1681. #elif defined(JACKBRIDGE_DIRECT)
  1682. jack_transport_stop(client);
  1683. #else
  1684. if (getBridgeInstance().transport_stop_ptr != nullptr)
  1685. getBridgeInstance().transport_stop_ptr(client);
  1686. #endif
  1687. }
  1688. // -----------------------------------------------------------------------------
  1689. bool jackbridge_set_property(jack_client_t* client, jack_uuid_t subject, const char* key, const char* value, const char* type)
  1690. {
  1691. carla_stdout("%s called", __FUNCTION__);
  1692. #if defined(JACKBRIDGE_DUMMY)
  1693. #elif defined(JACKBRIDGE_DIRECT)
  1694. return (jack_set_property(client, subject, key, value, type) == 0);
  1695. #else
  1696. if (getBridgeInstance().set_property_ptr != nullptr)
  1697. return (getBridgeInstance().set_property_ptr(client, subject, key, value, type) == 0);
  1698. #endif
  1699. return false;
  1700. }
  1701. bool jackbridge_get_property(jack_uuid_t subject, const char* key, char** value, char** type)
  1702. {
  1703. carla_stdout("%s called", __FUNCTION__);
  1704. #if defined(JACKBRIDGE_DUMMY)
  1705. #elif defined(JACKBRIDGE_DIRECT)
  1706. return (jack_get_property(subject, key, value, type) == 0);
  1707. #else
  1708. if (getBridgeInstance().get_property_ptr != nullptr)
  1709. return (getBridgeInstance().get_property_ptr(subject, key, value, type) == 0);
  1710. #endif
  1711. return false;
  1712. }
  1713. void jackbridge_free_description(jack_description_t* desc, bool free_description_itself)
  1714. {
  1715. carla_stdout("%s called", __FUNCTION__);
  1716. #if defined(JACKBRIDGE_DUMMY)
  1717. #elif defined(JACKBRIDGE_DIRECT)
  1718. jack_free_description(desc, free_description_itself);
  1719. #else
  1720. if (getBridgeInstance().free_description_ptr != nullptr)
  1721. getBridgeInstance().free_description_ptr(desc, free_description_itself);
  1722. #endif
  1723. }
  1724. bool jackbridge_get_properties(jack_uuid_t subject, jack_description_t* desc)
  1725. {
  1726. carla_stdout("%s called", __FUNCTION__);
  1727. #if defined(JACKBRIDGE_DUMMY)
  1728. #elif defined(JACKBRIDGE_DIRECT)
  1729. return (jack_get_properties(subject, desc) == 0);
  1730. #else
  1731. if (getBridgeInstance().get_properties_ptr != nullptr)
  1732. return (getBridgeInstance().get_properties_ptr(subject, desc) == 0);
  1733. #endif
  1734. return false;
  1735. }
  1736. bool jackbridge_get_all_properties(jack_description_t** descs)
  1737. {
  1738. carla_stdout("%s called", __FUNCTION__);
  1739. #if defined(JACKBRIDGE_DUMMY)
  1740. #elif defined(JACKBRIDGE_DIRECT)
  1741. return (jack_get_all_properties(descs) == 0);
  1742. #else
  1743. if (getBridgeInstance().get_all_properties_ptr != nullptr)
  1744. return (getBridgeInstance().get_all_properties_ptr(descs) == 0);
  1745. #endif
  1746. return false;
  1747. }
  1748. bool jackbridge_remove_property(jack_client_t* client, jack_uuid_t subject, const char* key)
  1749. {
  1750. carla_stdout("%s called", __FUNCTION__);
  1751. #if defined(JACKBRIDGE_DUMMY)
  1752. #elif defined(JACKBRIDGE_DIRECT)
  1753. return (jack_remove_property(client, subject, key) == 0);
  1754. #else
  1755. if (getBridgeInstance().remove_property_ptr != nullptr)
  1756. return (getBridgeInstance().remove_property_ptr(client, subject, key) == 0);
  1757. #endif
  1758. return false;
  1759. }
  1760. int jackbridge_remove_properties(jack_client_t* client, jack_uuid_t subject)
  1761. {
  1762. carla_stdout("%s called", __FUNCTION__);
  1763. #if defined(JACKBRIDGE_DUMMY)
  1764. #elif defined(JACKBRIDGE_DIRECT)
  1765. return jack_remove_properties(client, subject);
  1766. #else
  1767. if (getBridgeInstance().remove_properties_ptr != nullptr)
  1768. return getBridgeInstance().remove_properties_ptr(client, subject);
  1769. #endif
  1770. return 0;
  1771. }
  1772. bool jackbridge_remove_all_properties(jack_client_t* client)
  1773. {
  1774. carla_stdout("%s called", __FUNCTION__);
  1775. #if defined(JACKBRIDGE_DUMMY)
  1776. #elif defined(JACKBRIDGE_DIRECT)
  1777. return (jack_remove_all_properties(client) == 0);
  1778. #else
  1779. if (getBridgeInstance().remove_all_properties_ptr != nullptr)
  1780. return (getBridgeInstance().remove_all_properties_ptr(client) == 0);
  1781. #endif
  1782. return false;
  1783. }
  1784. bool jackbridge_set_property_change_callback(jack_client_t* client, JackPropertyChangeCallback callback, void* arg)
  1785. {
  1786. carla_stdout("%s called", __FUNCTION__);
  1787. #if defined(JACKBRIDGE_DUMMY)
  1788. #elif defined(JACKBRIDGE_DIRECT)
  1789. return (jack_set_property_change_callback(client, callback, arg) == 0);
  1790. #else
  1791. if (getBridgeInstance().set_property_change_callback_ptr != nullptr)
  1792. {
  1793. # ifdef __WINE__
  1794. WineBridge::getInstance().set_prop_change(callback);
  1795. return (getBridgeInstance().set_property_change_callback_ptr(client, WineBridge::prop_change, arg) == 0);
  1796. # else
  1797. return (getBridgeInstance().set_property_change_callback_ptr(client, callback, arg) == 0);
  1798. # endif
  1799. }
  1800. #endif
  1801. return false;
  1802. }
  1803. // -----------------------------------------------------------------------------