Collection of tools useful for audio production
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.

344 lines
15KB

  1. /*
  2. * JackBridge
  3. * Copyright (C) 2013 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the COPYING file
  16. */
  17. #ifndef __JACKBRIDGE_HPP__
  18. #define __JACKBRIDGE_HPP__
  19. #include "CarlaDefines.hpp"
  20. #ifndef JACKBRIDGE_EXPORT
  21. # undef CARLA_EXPORT
  22. # define CARLA_EXPORT
  23. #endif
  24. #ifdef JACKBRIDGE_DIRECT
  25. # include <jack/jack.h>
  26. # include <jack/midiport.h>
  27. # include <jack/transport.h>
  28. # include <jack/custom.h>
  29. #else
  30. #include <cstddef>
  31. #ifdef CARLA_PROPER_CPP11_SUPPORT
  32. # include <cstdint>
  33. #else
  34. # include <stdint.h>
  35. #endif
  36. #ifndef POST_PACKED_STRUCTURE
  37. # ifdef __GNUC__
  38. /* POST_PACKED_STRUCTURE needs to be a macro which
  39. expands into a compiler directive. The directive must
  40. tell the compiler to arrange the preceding structure
  41. declaration so that it is packed on byte-boundaries rather
  42. than use the natural alignment of the processor and/or
  43. compiler.
  44. */
  45. #define PRE_PACKED_STRUCTURE
  46. #define POST_PACKED_STRUCTURE __attribute__((__packed__))
  47. # else
  48. #ifdef _MSC_VER
  49. #define PRE_PACKED_STRUCTURE1 __pragma(pack(push,1))
  50. #define PRE_PACKED_STRUCTURE PRE_PACKED_STRUCTURE1
  51. /* PRE_PACKED_STRUCTURE needs to be a macro which
  52. expands into a compiler directive. The directive must
  53. tell the compiler to arrange the following structure
  54. declaration so that it is packed on byte-boundaries rather
  55. than use the natural alignment of the processor and/or
  56. compiler.
  57. */
  58. #define POST_PACKED_STRUCTURE ;__pragma(pack(pop))
  59. /* and POST_PACKED_STRUCTURE needs to be a macro which
  60. restores the packing to its previous setting */
  61. #else
  62. #define PRE_PACKED_STRUCTURE
  63. #define POST_PACKED_STRUCTURE
  64. #endif // _MSC_VER
  65. # endif // __GNUC__
  66. #endif
  67. #define JACK_DEFAULT_AUDIO_TYPE "32 bit float mono audio"
  68. #define JACK_DEFAULT_MIDI_TYPE "8 bit raw midi"
  69. #define JACK_HAS_CUSTOM_DATA_API 1
  70. #define JACK_HAS_PORT_IS_CONTROL_VOLTAGE_FLAG 1
  71. #define JackOpenOptions (JackSessionID|JackServerName|JackNoStartServer|JackUseExactName)
  72. #define JackLoadOptions (JackLoadInit|JackLoadName|JackUseExactName)
  73. #define JACK_POSITION_MASK (JackPositionBBT|JackPositionTimecode)
  74. #define EXTENDED_TIME_INFO
  75. enum JackOptions {
  76. JackNullOption = 0x00,
  77. JackNoStartServer = 0x01,
  78. JackUseExactName = 0x02,
  79. JackServerName = 0x04,
  80. JackLoadName = 0x08,
  81. JackLoadInit = 0x10,
  82. JackSessionID = 0x20
  83. };
  84. enum JackStatus {
  85. JackFailure = 0x01,
  86. JackInvalidOption = 0x02,
  87. JackNameNotUnique = 0x04,
  88. JackServerStarted = 0x08,
  89. JackServerFailed = 0x10,
  90. JackServerError = 0x20,
  91. JackNoSuchClient = 0x40,
  92. JackLoadFailure = 0x80,
  93. JackInitFailure = 0x100,
  94. JackShmFailure = 0x200,
  95. JackVersionError = 0x400,
  96. JackBackendError = 0x800,
  97. JackClientZombie = 0x1000
  98. };
  99. enum JackLatencyCallbackMode {
  100. JackCaptureLatency,
  101. JackPlaybackLatency
  102. };
  103. enum JackPortFlags {
  104. JackPortIsInput = 0x1,
  105. JackPortIsOutput = 0x2,
  106. JackPortIsPhysical = 0x4,
  107. JackPortCanMonitor = 0x8,
  108. JackPortIsTerminal = 0x10,
  109. JackPortIsControlVoltage = 0x100
  110. };
  111. enum JackTransportState {
  112. JackTransportStopped = 0,
  113. JackTransportRolling = 1,
  114. JackTransportLooping = 2,
  115. JackTransportStarting = 3,
  116. JackTransportNetStarting = 4
  117. };
  118. enum JackPositionBits {
  119. JackPositionBBT = 0x010,
  120. JackPositionTimecode = 0x020,
  121. JackBBTFrameOffset = 0x040,
  122. JackAudioVideoRatio = 0x080,
  123. JackVideoFrameOffset = 0x100
  124. };
  125. enum JackSessionEventType {
  126. JackSessionSave = 1,
  127. JackSessionSaveAndQuit = 2,
  128. JackSessionSaveTemplate = 3
  129. };
  130. enum JackSessionFlags {
  131. JackSessionSaveError = 0x01,
  132. JackSessionNeedTerminal = 0x02
  133. };
  134. enum JackCustomChange {
  135. JackCustomRemoved,
  136. JackCustomAdded,
  137. JackCustomReplaced
  138. };
  139. typedef uint32_t jack_nframes_t;
  140. typedef uint32_t jack_port_id_t;
  141. typedef uint64_t jack_time_t;
  142. typedef uint64_t jack_unique_t;
  143. typedef unsigned char jack_midi_data_t;
  144. typedef float jack_default_audio_sample_t;
  145. typedef enum JackOptions jack_options_t;
  146. typedef enum JackStatus jack_status_t;
  147. typedef enum JackLatencyCallbackMode jack_latency_callback_mode_t;
  148. typedef enum JackTransportState jack_transport_state_t;
  149. typedef enum JackPositionBits jack_position_bits_t;
  150. typedef enum JackSessionEventType jack_session_event_type_t;
  151. typedef enum JackSessionFlags jack_session_flags_t;
  152. typedef enum JackCustomChange jack_custom_change_t;
  153. struct _jack_midi_event {
  154. jack_nframes_t time;
  155. size_t size;
  156. jack_midi_data_t* buffer;
  157. };
  158. PRE_PACKED_STRUCTURE
  159. struct _jack_latency_range {
  160. jack_nframes_t min;
  161. jack_nframes_t max;
  162. } POST_PACKED_STRUCTURE;
  163. PRE_PACKED_STRUCTURE
  164. struct _jack_position {
  165. jack_unique_t unique_1;
  166. jack_time_t usecs;
  167. jack_nframes_t frame_rate;
  168. jack_nframes_t frame;
  169. jack_position_bits_t valid;
  170. int32_t bar;
  171. int32_t beat;
  172. int32_t tick;
  173. double bar_start_tick;
  174. float beats_per_bar;
  175. float beat_type;
  176. double ticks_per_beat;
  177. double beats_per_minute;
  178. double frame_time;
  179. double next_time;
  180. jack_nframes_t bbt_offset;
  181. float audio_frames_per_video_frame;
  182. jack_nframes_t video_offset;
  183. int32_t padding[7];
  184. jack_unique_t unique_2;
  185. } POST_PACKED_STRUCTURE;
  186. struct _jack_session_event {
  187. jack_session_event_type_t type;
  188. const char* session_dir;
  189. const char* client_uuid;
  190. char* command_line;
  191. jack_session_flags_t flags;
  192. uint32_t future;
  193. };
  194. struct _jack_session_command_t {
  195. const char* uuid;
  196. const char* client_name;
  197. const char* command;
  198. jack_session_flags_t flags;
  199. };
  200. typedef struct _jack_port jack_port_t;
  201. typedef struct _jack_client jack_client_t;
  202. typedef struct _jack_midi_event jack_midi_event_t;
  203. typedef struct _jack_latency_range jack_latency_range_t;
  204. typedef struct _jack_position jack_position_t;
  205. typedef struct _jack_session_event jack_session_event_t;
  206. typedef struct _jack_session_command_t jack_session_command_t;
  207. typedef void (*JackLatencyCallback)(jack_latency_callback_mode_t mode, void* arg);
  208. typedef int (*JackProcessCallback)(jack_nframes_t nframes, void* arg);
  209. typedef void (*JackThreadInitCallback)(void *arg);
  210. typedef int (*JackGraphOrderCallback)(void *arg);
  211. typedef int (*JackXRunCallback)(void* arg);
  212. typedef int (*JackBufferSizeCallback)(jack_nframes_t nframes, void* arg);
  213. typedef int (*JackSampleRateCallback)(jack_nframes_t nframes, void* arg);
  214. typedef void (*JackPortRegistrationCallback)(jack_port_id_t port, int register_, void* arg);
  215. typedef void (*JackClientRegistrationCallback)(const char* name, int register_, void* arg);
  216. typedef int (*JackClientRenameCallback)(const char* old_name, const char* new_name, void* arg);
  217. typedef void (*JackPortConnectCallback)(jack_port_id_t a, jack_port_id_t b, int connect, void* arg);
  218. typedef int (*JackPortRenameCallback)(jack_port_id_t port, const char* old_name, const char* new_name, void* arg);
  219. typedef void (*JackFreewheelCallback)(int starting, void* arg);
  220. typedef void (*JackShutdownCallback)(void* arg);
  221. typedef void (*JackInfoShutdownCallback)(jack_status_t code, const char* reason, void* arg);
  222. typedef int (*JackSyncCallback)(jack_transport_state_t state, jack_position_t* pos, void* arg);
  223. typedef void (*JackTimebaseCallback)(jack_transport_state_t state, jack_nframes_t nframes, jack_position_t* pos, int new_pos, void* arg);
  224. typedef void (*JackSessionCallback)(jack_session_event_t* event, void* arg);
  225. typedef void (*JackCustomDataAppearanceCallback)(const char* client_name, const char* key, jack_custom_change_t change, void* arg);
  226. #endif // ! JACKBRIDGE_DIRECT
  227. CARLA_EXPORT const char* jackbridge_get_version_string();
  228. CARLA_EXPORT jack_client_t* jackbridge_client_open(const char* client_name, jack_options_t options, jack_status_t* status, ...);
  229. CARLA_EXPORT const char* jackbridge_client_rename(jack_client_t* client, const char* new_name);
  230. CARLA_EXPORT bool jackbridge_client_close(jack_client_t* client);
  231. CARLA_EXPORT int jackbridge_client_name_size();
  232. CARLA_EXPORT char* jackbridge_get_client_name(jack_client_t* client);
  233. CARLA_EXPORT bool jackbridge_activate(jack_client_t* client);
  234. CARLA_EXPORT bool jackbridge_deactivate(jack_client_t* client);
  235. CARLA_EXPORT int jackbridge_get_client_pid(const char* name);
  236. CARLA_EXPORT int jackbridge_is_realtime(jack_client_t* client);
  237. CARLA_EXPORT bool jackbridge_set_thread_init_callback(jack_client_t* client, JackThreadInitCallback thread_init_callback, void* arg);
  238. CARLA_EXPORT void jackbridge_on_shutdown(jack_client_t* client, JackShutdownCallback shutdown_callback, void* arg);
  239. CARLA_EXPORT void jackbridge_on_info_shutdown(jack_client_t* client, JackInfoShutdownCallback shutdown_callback, void* arg);
  240. CARLA_EXPORT bool jackbridge_set_process_callback(jack_client_t* client, JackProcessCallback process_callback, void* arg);
  241. CARLA_EXPORT bool jackbridge_set_freewheel_callback(jack_client_t* client, JackFreewheelCallback freewheel_callback, void* arg);
  242. CARLA_EXPORT bool jackbridge_set_buffer_size_callback(jack_client_t* client, JackBufferSizeCallback bufsize_callback, void* arg);
  243. CARLA_EXPORT bool jackbridge_set_sample_rate_callback(jack_client_t* client, JackSampleRateCallback srate_callback, void* arg);
  244. CARLA_EXPORT bool jackbridge_set_client_registration_callback(jack_client_t* client, JackClientRegistrationCallback registration_callback, void* arg);
  245. #ifndef JACKBRIDGE_DIRECT
  246. CARLA_EXPORT bool jackbridge_set_client_rename_callback(jack_client_t* client, JackClientRenameCallback registration_callback, void* arg);
  247. #endif
  248. CARLA_EXPORT bool jackbridge_set_port_registration_callback(jack_client_t* client, JackPortRegistrationCallback registration_callback, void* arg);
  249. CARLA_EXPORT bool jackbridge_set_port_connect_callback(jack_client_t* client, JackPortConnectCallback connect_callback, void* arg);
  250. CARLA_EXPORT bool jackbridge_set_port_rename_callback(jack_client_t* client, JackPortRenameCallback rename_callback, void* arg);
  251. CARLA_EXPORT bool jackbridge_set_graph_order_callback(jack_client_t* client, JackGraphOrderCallback graph_callback, void* arg);
  252. CARLA_EXPORT bool jackbridge_set_xrun_callback(jack_client_t* client, JackXRunCallback xrun_callback, void* arg);
  253. CARLA_EXPORT bool jackbridge_set_latency_callback(jack_client_t* client, JackLatencyCallback latency_callback, void* arg);
  254. CARLA_EXPORT bool jackbridge_set_freewheel(jack_client_t* client, int onoff);
  255. CARLA_EXPORT bool jackbridge_set_buffer_size(jack_client_t* client, jack_nframes_t nframes);
  256. CARLA_EXPORT bool jackbridge_engine_takeover_timebase(jack_client_t* client);
  257. CARLA_EXPORT float jackbridge_cpu_load(jack_client_t* client);
  258. CARLA_EXPORT jack_nframes_t jackbridge_get_sample_rate(jack_client_t* client);
  259. CARLA_EXPORT jack_nframes_t jackbridge_get_buffer_size(jack_client_t* client);
  260. CARLA_EXPORT jack_port_t* jackbridge_port_register(jack_client_t* client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size);
  261. CARLA_EXPORT bool jackbridge_port_unregister(jack_client_t* client, jack_port_t* port);
  262. CARLA_EXPORT void* jackbridge_port_get_buffer(jack_port_t* port, jack_nframes_t nframes);
  263. CARLA_EXPORT const char* jackbridge_port_name(const jack_port_t* port);
  264. CARLA_EXPORT const char* jackbridge_port_short_name(const jack_port_t* port);
  265. CARLA_EXPORT int jackbridge_port_flags(const jack_port_t* port);
  266. CARLA_EXPORT const char* jackbridge_port_type(const jack_port_t* port);
  267. CARLA_EXPORT bool jackbridge_port_is_mine(const jack_client_t* client, const jack_port_t* port);
  268. CARLA_EXPORT bool jackbridge_port_connected(const jack_port_t* port);
  269. CARLA_EXPORT bool jackbridge_port_connected_to(const jack_port_t* port, const char* port_name);
  270. CARLA_EXPORT const char** jackbridge_port_get_connections(const jack_port_t* port);
  271. CARLA_EXPORT const char** jackbridge_port_get_all_connections(const jack_client_t* client, const jack_port_t* port);
  272. CARLA_EXPORT bool jackbridge_port_set_name(jack_port_t* port, const char* port_name);
  273. CARLA_EXPORT bool jackbridge_connect(jack_client_t* client, const char* source_port, const char* destination_port);
  274. CARLA_EXPORT bool jackbridge_disconnect(jack_client_t* client, const char* source_port, const char* destination_port);
  275. CARLA_EXPORT int jackbridge_port_name_size();
  276. CARLA_EXPORT void jackbridge_port_get_latency_range(jack_port_t* port, jack_latency_callback_mode_t mode, jack_latency_range_t* range);
  277. CARLA_EXPORT void jackbridge_port_set_latency_range(jack_port_t* port, jack_latency_callback_mode_t mode, jack_latency_range_t* range);
  278. CARLA_EXPORT bool jackbridge_recompute_total_latencies(jack_client_t* client);
  279. CARLA_EXPORT const char** jackbridge_get_ports(jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags);
  280. CARLA_EXPORT jack_port_t* jackbridge_port_by_name(jack_client_t* client, const char* port_name);
  281. CARLA_EXPORT jack_port_t* jackbridge_port_by_id(jack_client_t* client, jack_port_id_t port_id);
  282. CARLA_EXPORT void jackbridge_free(void* ptr);
  283. CARLA_EXPORT uint32_t jackbridge_midi_get_event_count(void* port_buffer);
  284. CARLA_EXPORT bool jackbridge_midi_event_get(jack_midi_event_t* event, void* port_buffer, uint32_t event_index);
  285. CARLA_EXPORT void jackbridge_midi_clear_buffer(void* port_buffer);
  286. CARLA_EXPORT bool jackbridge_midi_event_write(void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, size_t data_size);
  287. CARLA_EXPORT jack_midi_data_t* jackbridge_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size);
  288. CARLA_EXPORT int jackbridge_transport_locate(jack_client_t* client, jack_nframes_t frame);
  289. CARLA_EXPORT void jackbridge_transport_start(jack_client_t* client);
  290. CARLA_EXPORT void jackbridge_transport_stop(jack_client_t* client);
  291. CARLA_EXPORT jack_transport_state_t jackbridge_transport_query(const jack_client_t* client, jack_position_t* pos);
  292. CARLA_EXPORT bool jackbridge_custom_publish_data(jack_client_t* client, const char* key, const void* data, size_t size);
  293. CARLA_EXPORT bool jackbridge_custom_get_data(jack_client_t* client, const char* client_name, const char* key, void** data, size_t* size);
  294. CARLA_EXPORT bool jackbridge_custom_unpublish_data(jack_client_t* client, const char* key);
  295. CARLA_EXPORT bool jackbridge_custom_set_data_appearance_callback(jack_client_t* client, JackCustomDataAppearanceCallback callback, void* arg);
  296. CARLA_EXPORT const char** jackbridge_custom_get_keys(jack_client_t* client, const char* client_name);
  297. #endif // __JACKBRIDGE_HPP__