ASIO to JACK driver for WINE
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1822 lines
62KB

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