00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "jack.h"
00025 #include <math.h>
00026 #include <dlfcn.h>
00027 #include <stdlib.h>
00028 #include <cassert>
00029 #include <iostream>
00030
00031
00032
00033
00034
00035 using std::cerr;
00036
00037 int libjack_is_present = 0;
00038 static void *libjack_handle = 0;
00039
00040 static void __attribute__((constructor)) tryload_libjack()
00041 {
00042 if (getenv("SKIP_LIBJACK") == 0) {
00043 libjack_handle = dlopen("libjack.so.0", RTLD_LAZY);
00044 }
00045 libjack_is_present = (libjack_handle != 0);
00046 }
00047
00048 void *load_jack_function(const char *fn_name)
00049 {
00050 void *fn = 0;
00051 if (!libjack_handle) {
00052 std::cerr << "libjack not found, so do not try to load " << fn_name << " ffs !\n";
00053 return 0;
00054 }
00055 fn = dlsym(libjack_handle, fn_name);
00056 if (!fn) {
00057 std::cerr << "could not dlsym(" << libjack_handle << "), " << dlerror() << "\n";
00058 }
00059 return fn;
00060 }
00061
00062 #define DECL_FUNCTION(return_type, fn_name, arguments_types, arguments) \
00063 typedef return_type (*fn_name##_ptr_t)arguments_types; \
00064 return_type fn_name arguments_types { \
00065 static fn_name##_ptr_t fn = 0; \
00066 if (fn == 0) { fn = (fn_name##_ptr_t)load_jack_function(#fn_name); } \
00067 if (fn) return (*fn)arguments; \
00068 else return 0; \
00069 }
00070
00071 #define DECL_VOID_FUNCTION(fn_name, arguments_types, arguments) \
00072 typedef void (*fn_name##_ptr_t)arguments_types; \
00073 void fn_name arguments_types { \
00074 static fn_name##_ptr_t fn = 0; \
00075 if (fn == 0) { fn = (fn_name##_ptr_t)load_jack_function(#fn_name); } \
00076 if (fn) (*fn)arguments; \
00077 }
00078
00079 DECL_VOID_FUNCTION(jack_get_version, (int *major_ptr, int *minor_ptr, int *micro_ptr, int *proto_ptr), (major_ptr, minor_ptr, micro_ptr, proto_ptr));
00080 DECL_FUNCTION(const char *, jack_get_version_string, (), ());
00081 DECL_FUNCTION(jack_client_t *, jack_client_open, (const char *client_name, jack_options_t options, jack_status_t *status, ...),
00082 (client_name, options, status));
00083 DECL_FUNCTION(int, jack_client_close, (jack_client_t *client), (client));
00084 DECL_FUNCTION(int, jack_client_new, (const char *client_name), (client_name));
00085 DECL_FUNCTION(int, jack_client_name_size, (), ());
00086 DECL_FUNCTION(char*, jack_get_client_name, (jack_client_t *client), (client));
00087 DECL_FUNCTION(int, jack_internal_client_new, (const char *client_name,
00088 const char *load_name,
00089 const char *load_init), (client_name, load_name, load_init));
00090 DECL_VOID_FUNCTION(jack_internal_client_close, (const char *client_name), (client_name));
00091 DECL_FUNCTION(int, jack_is_realtime, (jack_client_t *client), (client));
00092 DECL_VOID_FUNCTION(jack_on_shutdown, (jack_client_t *client, JackShutdownCallback shutdown_callback, void *arg), (client, function, arg));
00093 DECL_FUNCTION(int, jack_set_process_callback, (jack_client_t *client,
00094 JackProcessCallback process_callback,
00095 void *arg), (client, process_callback, arg));
00096 DECL_FUNCTION(jack_nframes_t, jack_thread_wait, (jack_client_t *client, int status), (client, status));
00097
00098
00099 DECL_FUNCTION(jack_nframes_t, jack_cycle_wait, (jack_client_t *client), (client));
00100 DECL_VOID_FUNCTION(jack_cycle_signal, (jack_client_t *client, , int status), (client, status));
00101 DECL_FUNCTION(int, jack_set_process_thread, (jack_client_t *client,
00102 JackThreadCallback fun,
00103 void *arg), (client, fun, arg));
00104 DECL_FUNCTION(int, jack_set_thread_init_callback, (jack_client_t *client,
00105 JackThreadInitCallback thread_init_callback,
00106 void *arg), (client, thread_init_callback, arg));
00107 DECL_FUNCTION(int, jack_set_freewheel_callback, (jack_client_t *client,
00108 JackFreewheelCallback freewheel_callback,
00109 void *arg), (client, freewheel_callback, arg));
00110 DECL_FUNCTION(int, jack_set_freewheel, (jack_client_t *client, int onoff), (client, onoff));
00111 DECL_FUNCTION(int, jack_set_buffer_size, (jack_client_t *client, jack_nframes_t nframes), (client, nframes));
00112 DECL_FUNCTION(int, jack_set_buffer_size_callback, (jack_client_t *client,
00113 JackBufferSizeCallback bufsize_callback,
00114 void *arg), (client, bufsize_callback, arg));
00115 DECL_FUNCTION(int, jack_set_sample_rate_callback, (jack_client_t *client,
00116 JackSampleRateCallback srate_callback,
00117 void *arg), (client, srate_callback, arg));
00118 DECL_FUNCTION(int, jack_set_client_registration_callback, (jack_client_t *client,
00119 JackClientRegistrationCallback registration_callback,
00120 void *arg), (client, registration_callback, arg));
00121 DECL_FUNCTION(int, jack_set_port_registration_callback, (jack_client_t *client,
00122 JackPortRegistrationCallback registration_callback,
00123 void *arg), (client, registration_callback, arg));
00124 DECL_FUNCTION(int, jack_set_port_connect_callback, (jack_client_t *client,
00125 JackPortConnectCallback connect_callback,
00126 void *arg), (client, connect_callback, arg));
00127 DECL_FUNCTION(int, jack_set_port_rename_callback, (jack_client_t *client,
00128 JackPortRenameCallback rename_callback,
00129 void *arg), (client, rename_callback, arg));
00130 DECL_FUNCTION(int, jack_set_graph_order_callback, (jack_client_t *client,
00131 JackGraphOrderCallback graph_callback,
00132 void *arg), (client, graph_callback, arg));
00133 DECL_FUNCTION(int, jack_set_xrun_callback, (jack_client_t *client,
00134 JackXRunCallback xrun_callback,
00135 void *arg), (client, xrun_callback, arg));
00136 DECL_FUNCTION(int, jack_activate, (jack_client_t *client), (client));
00137 DECL_FUNCTION(int, jack_deactivate, (jack_client_t *client), (client));
00138 DECL_FUNCTION(jack_port_t *, jack_port_register, (jack_client_t *client, const char *port_name, const char *port_type,
00139 unsigned long flags, unsigned long buffer_size),
00140 (client, port_name, port_type, flags, buffer_size));
00141 DECL_FUNCTION(int, jack_port_unregister, (jack_client_t *client, jack_port_t* port), (client, port));
00142 DECL_FUNCTION(void *, jack_port_get_buffer, (jack_port_t *port, jack_nframes_t nframes), (port, nframes));
00143 DECL_FUNCTION(const char*, jack_port_name, (const jack_port_t *port), (port));
00144 DECL_FUNCTION(const char*, jack_port_short_name, (const jack_port_t *port), (port));
00145 DECL_FUNCTION(int, jack_port_flags, (const jack_port_t *port), (port));
00146 DECL_FUNCTION(const char*, jack_port_type, (const jack_port_t *port), (port));
00147 DECL_FUNCTION(jack_port_type_id_t, jack_port_type_id, (const jack_port_t *port), (port));
00148 DECL_FUNCTION(int, jack_port_is_mine, (const jack_client_t *client, const jack_port_t* port), (client, port));
00149 DECL_FUNCTION(int, jack_port_connected, (const jack_port_t *port), (port));
00150 DECL_FUNCTION(int, jack_port_connected_to, (const jack_port_t *port, const char *port_name), (port, port_name));
00151 DECL_FUNCTION(const char**, jack_port_get_connections, (const jack_port_t *port), (port));
00152 DECL_FUNCTION(const char**, jack_port_get_all_connections, (const jack_port_t *port), (port));
00153 DECL_FUNCTION(int, jack_port_tie, (jack_port_t *src, jack_port_t *dst), (src, dst));
00154 DECL_FUNCTION(int, jack_port_untie, (jack_port_t *port), (port));
00155 DECL_FUNCTION(jack_nframes_t, jack_port_get_latency, (jack_port_t *port));
00156 DECL_FUNCTION(jack_nframes_t, jack_port_get_total_latency ,(jack_client_t *), (jack_port_t *port));
00157 DECL_VOID_FUNCTION(jack_port_set_latency, (jack_port_t *), (jack_nframes_t));
00158 DECL_FUNCTION(int, jack_recompute_total_latency, (jack_client_t*), (jack_port_t* port));
00159 DECL_FUNCTION(int, jack_recompute_total_latencies, (jack_client_t*));
00160
00161 DECL_FUNCTION(int, jack_port_set_name, (jack_port_t *port), (const char *port_name));
00162 DECL_FUNCTION(int, jack_port_set_alias, (jack_port_t *port), (const char *alias));
00163 DECL_FUNCTION(int, jack_port_unset_alias, (jack_port_t *port), (const char *alias));
00164 DECL_FUNCTION(int, jack_port_get_aliases, (const jack_port_t *port), (char* const aliases[2]));
00165 DECL_FUNCTION(int, jack_port_request_monitor, (jack_port_t *port), (int onoff));
00166 DECL_FUNCTION(int, jack_port_request_monitor_by_name, (jack_client_t *client), (const char *port_name), (int onoff));
00167 DECL_FUNCTION(int, jack_port_ensure_monitor, (jack_port_t *port), (int onoff));
00168 DECL_FUNCTION(int, jack_port_monitoring_input, (jack_port_t *port));
00169 DECL_FUNCTION(int, jack_connect, (jack_client_t *), (const char *source_port), (const char *destination_port));
00170 DECL_FUNCTION(int, jack_disconnect, (jack_client_t *), (const char *source_port), (const char *destination_port));
00171 DECL_FUNCTION(int, jack_port_disconnect, (jack_client_t *), (jack_port_t *));
00172 DECL_FUNCTION(int, jack_port_name_size,(void));
00173 DECL_FUNCTION(int, jack_port_type_size,(void));
00174
00175 DECL_FUNCTION(jack_nframes_t, jack_get_sample_rate, (jack_client_t *client), (client));
00176 DECL_FUNCTION(jack_nframes_t, jack_get_buffer_size, (jack_client_t *client), (client));
00177 DECL_FUNCTION(const char**, jack_get_ports, (jack_client_t *client, const char *port_name_pattern, const char * type_name_pattern,
00178 unsigned long flags), (client, port_name_pattern, type_name_pattern, flags));
00179 DECL_FUNCTION(jack_port_t *, jack_port_by_name, (jack_client_t *), (const char *port_name));
00180 DECL_FUNCTION(jack_port_t *, jack_port_by_id, (jack_client_t *client), (jack_port_id_t port_id));
00181
00182 DECL_FUNCTION(int, jack_engine_takeover_timebase, (jack_client_t *));
00183 DECL_FUNCTION(jack_nframes_t, jack_frames_since_cycle_start, (const jack_client_t *));
00184 DECL_FUNCTION(jack_time_t, jack_get_time());
00185 DECL_FUNCTION(jack_nframes_t, jack_time_to_frames, (const jack_client_t *client), (jack_time_t time));
00186 DECL_FUNCTION(jack_time_t, jack_frames_to_time, (const jack_client_t *client), (jack_nframes_t frames));
00187 DECL_FUNCTION(jack_nframes_t, jack_frame_time, (const jack_client_t *));
00188 DECL_FUNCTION(jack_nframes_t, jack_last_frame_time, (const jack_client_t *client));
00189 DECL_FUNCTION(float, jack_cpu_load, (jack_client_t *client));
00190 DECL_FUNCTION(pthread_t, jack_client_thread_id, (jack_client_t *));
00191 DECL_VOID_FUNCTION(jack_set_error_function, (print_function));
00192 DECL_VOID_FUNCTION(jack_set_info_function, (print_function));
00193
00194 DECL_FUNCTION(float, jack_get_max_delayed_usecs, (jack_client_t *client));
00195 DECL_FUNCTION(float, jack_get_xrun_delayed_usecs, (jack_client_t *client));
00196 DECL_VOID_FUNCTION(jack_reset_max_delayed_usecs, (jack_client_t *client));
00197
00198 DECL_FUNCTION(int, jack_release_timebase, (jack_client_t *client));
00199 DECL_FUNCTION(int, jack_set_sync_callback, (jack_client_t *client, (JackSyncCallback sync_callback), (void *arg));
00200 DECL_FUNCTION(int, jack_set_sync_timeout, (jack_client_t *client), (jack_time_t timeout));
00201 DECL_FUNCTION(int, jack_set_timebase_callback, (jack_client_t *client), (int conditional), (JackTimebaseCallback timebase_callback), (void *arg));
00202 DECL_FUNCTION(int, jack_transport_locate, (jack_client_t *client), (jack_nframes_t frame));
00203 DECL_FUNCTION(jack_transport_state_t, jack_transport_query, (const jack_client_t *client), (jack_position_t *pos));
00204 DECL_FUNCTION(jack_nframes_t, jack_get_current_transport_frame, (const jack_client_t *client));
00205 DECL_FUNCTION(int, jack_transport_reposition, (jack_client_t *client), (jack_position_t *pos));
00206 DECL_VOID_FUNCTION(jack_transport_start, (jack_client_t *client));
00207 DECL_VOID_FUNCTION(jack_transport_stop, (jack_client_t *client));
00208 DECL_VOID_FUNCTION(jack_get_transport_info, (jack_client_t *client), (jack_transport_info_t *tinfo));
00209 DECL_VOID_FUNCTION(jack_set_transport_info, (jack_client_t *client), (jack_transport_info_t *tinfo));
00210
00211 DECL_FUNCTION(int, jack_client_real_time_priority, (jack_client_t*));
00212 DECL_FUNCTION(int, jack_client_max_real_time_priority, (jack_client_t*));
00213 DECL_FUNCTION(int, jack_acquire_real_time_scheduling, (pthread_t thread), (int priority));
00214 DECL_FUNCTION(int, jack_client_create_thread, (jack_client_t* client),
00215 (pthread_t *thread),
00216 (int priority),
00217 (int realtime),
00218 (thread_routine routine),
00219 (void *arg));
00220 DECL_FUNCTION(int, jack_drop_real_time_scheduling, (pthread_t thread));
00221
00222 DECL_FUNCTION(int, jack_client_stop_thread, (jack_client_t* client), (pthread_t thread));
00223 DECL_FUNCTION(int, jack_client_kill_thread, (jack_client_t* client), (pthread_t thread));
00224 #ifndef WIN32
00225 DECL_VOID_FUNCTION(jack_set_thread_creator, (jack_thread_creator_t jtc));
00226 #endif
00227 DECL_FUNCTION(char *, jack_get_internal_client_name, (jack_client_t *client, (jack_intclient_t intclient));
00228 DECL_FUNCTION(jack_intclient_t, jack_internal_client_handle, (jack_client_t *client), (const char *client_name), (jack_status_t *status));
00229 DECL_FUNCTION(jack_intclient_t, jack_internal_client_load, (jack_client_t *client), (const char *client_name), (jack_options_t options), (jack_status_t *status), ...));
00230
00231 DECL_FUNCTION(jack_status_t, jack_internal_client_unload, (jack_client_t *client), jack_intclient_t intclient));
00232 DECL_VOID_FUNCTION(jack_free, (void* ptr));
00233
00234
00235
00236 DECL_FUNCTION(jack_nframes_t, jack_midi_get_event_count, (void* port_buffer));
00237 DECL_FUNCTION(int jack_midi_event_get(jack_midi_event_t* event, void* port_buffer, jack_nframes_t event_index);
00238 DECL_VOID_FUNCTION(jack_midi_clear_buffer, (void* port_buffer));
00239 DECL_FUNCTION(size_t, jack_midi_max_event_size, (void* port_buffer));
00240 DECL_FUNCTION(jack_midi_data_t*, jack_midi_event_reserve, (void* port_buffer), (jack_nframes_t time), (size_t data_size));
00241 DECL_FUNCTIO(int jack_midi_event_write, (void* port_buffer), (jack_nframes_t time), (const jack_midi_data_t* data), (size_t data_size));
00242 DECL_FUNCTION(jack_nframes_t, jack_midi_get_lost_event_count, (void* port_buffer));