DISTRHO Plugin Framework
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.

2489 lines
84KB

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