diff options
author | Robin Gareus <robin@gareus.org> | 2014-10-24 15:18:38 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-10-24 15:18:38 +0200 |
commit | e025cc008c94c8e5588af745cca7135c76c935df (patch) | |
tree | 3d74e09dc941a3eea13ce971a2680fbccefacf67 /libs/backends | |
parent | ad09be8c7875c043acc77bd1c249b74ebc74f8f8 (diff) |
use x-macros to simplify weak-jack implementation
Diffstat (limited to 'libs/backends')
-rw-r--r-- | libs/backends/jack/weak_libjack.c | 450 | ||||
-rw-r--r-- | libs/backends/jack/weak_libjack.def | 121 | ||||
-rw-r--r-- | libs/backends/jack/weak_libjack.h | 12 | ||||
-rw-r--r-- | libs/backends/jack/wscript | 1 |
4 files changed, 235 insertions, 349 deletions
diff --git a/libs/backends/jack/weak_libjack.c b/libs/backends/jack/weak_libjack.c index 51cc0e9851..e48f11b89d 100644 --- a/libs/backends/jack/weak_libjack.c +++ b/libs/backends/jack/weak_libjack.c @@ -37,13 +37,6 @@ int have_libjack (void) { #include <dlfcn.h> #endif -#include <jack/jack.h> -#include <jack/ringbuffer.h> -#include <jack/transport.h> -#include <jack/midiport.h> -#include <jack/session.h> -#include <jack/thread.h> - static void* lib_open(const char* const so) { #ifdef PLATFORM_WINDOWS return (void*) LoadLibraryA(so); @@ -69,109 +62,24 @@ typedef void * __attribute__ ((__may_alias__)) pvoid_t; #define MAPSYM(SYM, FAIL) *(pvoid_t *)(&_j._ ## SYM) = lib_symbol(lib, "jack_" # SYM); \ if (!_j._ ## SYM) err |= FAIL; #endif + typedef void (* func_t) (void); /* function pointers to the real jack API */ static struct WeakJack { - func_t _client_open; - func_t _client_close; - func_t _get_client_name; - - func_t _get_buffer_size; - func_t _get_sample_rate; - func_t _frames_since_cycle_start; - func_t _frame_time; - func_t _last_frame_time; - func_t _cpu_load; - func_t _is_realtime; - - func_t _set_freewheel; - func_t _set_buffer_size; - - func_t _on_shutdown; - func_t _on_info_shutdown; - func_t _set_process_callback; - func_t _set_freewheel_callback; - func_t _set_buffer_size_callback; - func_t _set_sample_rate_callback; - func_t _set_port_registration_callback; - func_t _set_port_connect_callback; - func_t _set_graph_order_callback; - func_t _set_xrun_callback; - func_t _set_latency_callback; - func_t _set_error_function; - - func_t _activate; - func_t _deactivate; - - func_t _recompute_total_latencies; - func_t _port_get_total_latency; - func_t _port_get_latency_range; - func_t _port_set_latency_range; - func_t _port_get_buffer; - func_t _port_request_monitor; - func_t _port_ensure_monitor; - func_t _port_monitoring_input; - - func_t _port_name; - func_t _port_flags; - func_t _get_ports; - func_t _port_name_size; - func_t _port_type_size; - func_t _port_type_get_buffer_size; - func_t _port_by_name; - func_t _port_by_id; - func_t _port_register; - func_t _port_unregister; - func_t _port_type; - func_t _port_get_connections; - func_t _port_get_all_connections; - func_t _port_set_name; - func_t _port_disconnect; - func_t _connect; - func_t _disconnect; - func_t _free; - func_t _cycle_wait; - func_t _cycle_signal; - func_t _set_process_thread; - func_t _set_thread_init_callback; - - func_t _get_current_transport_frame; - func_t _transport_locate; - func_t _transport_start; - func_t _transport_stop; - func_t _transport_query; - func_t _set_sync_callback; - func_t _set_timebase_callback; - func_t _release_timebase; - - func_t _midi_get_event_count; - func_t _midi_event_get; - func_t _midi_event_write; - func_t _midi_clear_buffer; - - func_t _set_session_callback; - func_t _session_reply; - func_t _session_event_free; - - func_t _ringbuffer_create; - func_t _ringbuffer_free; - func_t _ringbuffer_reset; - func_t _ringbuffer_read_advance; - func_t _ringbuffer_write_advance; - func_t _ringbuffer_read_space; - func_t _ringbuffer_write_space; - func_t _ringbuffer_read; - func_t _ringbuffer_write; - func_t _ringbuffer_mlock; - - func_t _client_real_time_priority; - func_t _client_max_real_time_priority; - func_t _acquire_real_time_scheduling; - func_t _drop_real_time_scheduling; - func_t _client_stop_thread; - func_t _client_kill_thread; - func_t _client_create_thread; + func_t _client_open; // special case due to varargs + +#define JCFUN(ERR, RTYPE, NAME, RVAL) func_t _ ## NAME ; +#define JPFUN(ERR, RTYPE, NAME, DEF, ARGS, RVAL) func_t _ ## NAME ; +#define JXFUN(ERR, RTYPE, NAME, DEF, ARGS, CODE) func_t _ ## NAME ; +#define JVFUN(ERR, NAME, DEF, ARGS, CODE) func_t _ ## NAME ; + +#include "weak_libjack.def" + +#undef JCFUN +#undef JPFUN +#undef JXFUN +#undef JVFUN } _j; static int _status = -1; @@ -207,107 +115,38 @@ static void init_weak_jack(void) return; } + /* found library, now lookup functions */ MAPSYM(client_open, 2) - MAPSYM(client_close, 1) - MAPSYM(get_client_name, 1) - MAPSYM(get_sample_rate, 1) - MAPSYM(get_buffer_size, 1) - MAPSYM(frames_since_cycle_start, 1) - MAPSYM(frame_time, 1) - MAPSYM(last_frame_time, 1) - MAPSYM(cpu_load, 1) - MAPSYM(is_realtime, 1) - MAPSYM(set_freewheel, 1) - MAPSYM(set_buffer_size, 1) - MAPSYM(on_shutdown, 0) - MAPSYM(on_info_shutdown, 0) - MAPSYM(set_process_callback, 1) - MAPSYM(set_freewheel_callback, 1) - MAPSYM(set_buffer_size_callback, 1) - MAPSYM(set_sample_rate_callback, 1) - MAPSYM(set_port_registration_callback, 1) - MAPSYM(set_port_connect_callback, 1) - MAPSYM(set_graph_order_callback, 1) - MAPSYM(set_xrun_callback, 1) - MAPSYM(set_latency_callback, 1) - MAPSYM(set_error_function, 1) - MAPSYM(activate, 1) - MAPSYM(deactivate, 1) - MAPSYM(recompute_total_latencies, 0) - MAPSYM(port_get_total_latency, 0) - MAPSYM(port_get_latency_range, 0) - MAPSYM(port_set_latency_range, 0) - MAPSYM(port_get_buffer, 1) - MAPSYM(port_request_monitor, 1) - MAPSYM(port_ensure_monitor, 1) - MAPSYM(port_monitoring_input, 1) - MAPSYM(port_name, 1) - MAPSYM(port_flags, 1) - MAPSYM(get_ports, 1) - MAPSYM(port_name_size, 1) - MAPSYM(port_type_size, 1) - MAPSYM(port_type_get_buffer_size, 1) - MAPSYM(port_by_name, 1) - MAPSYM(port_by_id, 1) - MAPSYM(port_register, 1) - MAPSYM(port_unregister, 1) - MAPSYM(port_type, 1) - MAPSYM(port_get_connections, 1) - MAPSYM(port_get_all_connections, 1) - MAPSYM(port_set_name, 1) - MAPSYM(port_disconnect, 1) - MAPSYM(connect, 1) - MAPSYM(disconnect, 1) - MAPSYM(free, 0) - MAPSYM(cycle_wait, 0) - MAPSYM(cycle_signal, 0) - MAPSYM(set_process_thread, 0) - MAPSYM(set_thread_init_callback, 0) - MAPSYM(get_current_transport_frame, 1) - MAPSYM(transport_locate, 1) - MAPSYM(transport_start, 1) - MAPSYM(transport_stop, 1) - MAPSYM(transport_query, 1) - MAPSYM(set_sync_callback, 1) - MAPSYM(set_timebase_callback, 1) - MAPSYM(release_timebase, 1) - MAPSYM(midi_get_event_count, 1) - MAPSYM(midi_event_get, 1) - MAPSYM(midi_event_write, 1) - MAPSYM(midi_clear_buffer, 1) - MAPSYM(set_session_callback, 0) - MAPSYM(session_reply, 0) - MAPSYM(session_event_free, 0) - MAPSYM(ringbuffer_create, 1) - MAPSYM(ringbuffer_free, 1) - MAPSYM(ringbuffer_reset, 1) - MAPSYM(ringbuffer_read_advance, 1) - MAPSYM(ringbuffer_write_advance, 1) - MAPSYM(ringbuffer_read_space, 1) - MAPSYM(ringbuffer_write_space, 1) - MAPSYM(ringbuffer_read, 1) - MAPSYM(ringbuffer_write, 1) - MAPSYM(ringbuffer_mlock, 0) - MAPSYM(client_real_time_priority, 0) - MAPSYM(client_max_real_time_priority, 0) - MAPSYM(acquire_real_time_scheduling, 0) - MAPSYM(client_create_thread, 0) - MAPSYM(drop_real_time_scheduling, 0) - MAPSYM(client_stop_thread, 0) - MAPSYM(client_kill_thread, 0) + +#define JCFUN(ERR, RTYPE, NAME, RVAL) MAPSYM(NAME, ERR) +#define JPFUN(ERR, RTYPE, NAME, DEF, ARGS, RVAL) MAPSYM(NAME, ERR) +#define JXFUN(ERR, RTYPE, NAME, DEF, ARGS, CODE) MAPSYM(NAME, ERR) +#define JVFUN(ERR, NAME, DEF, ARGS, CODE) MAPSYM(NAME, ERR) + +#include "weak_libjack.def" + +#undef JCFUN +#undef JPFUN +#undef JXFUN +#undef JVFUN /* if a required symbol is not found, disable JACK completly */ if (err) { _j._client_open = NULL; } - _status = err; } /******************************************************************************* - * Macros to wrap jack API + * helper macros */ +#if defined(__GNUC__) && (__GNUC__ > 2) && !defined(NDEBUG) +#define likely(expr) (__builtin_expect (!!(expr), 1)) +#else +#define likely(expr) (expr) +#endif + #ifndef NDEBUG # define WJACK_WARNING(NAME) \ fprintf(stderr, "*** WEAK-JACK: function 'jack_%s' ignored\n", "" # NAME); @@ -315,10 +154,51 @@ static void init_weak_jack(void) # define WJACK_WARNING(NAME) ; #endif -/* abstraction for jack_client functions */ -#define JCFUN(RTYPE, NAME, RVAL) \ +/****************************************************************************** + * JACK API wrapper functions. + * + * if a function pointer is set in the static struct WeakJack _j, + * the function is called directly. + * Otherwise a dummy NOOP implementation is provided. + * The latter is mainly for compile-time warnings. + * + * If libjack is not found, jack_client_open() will fail. + * In that case the application should not call any other libjack + * functions. Hence a real implementation is not needed. + * (jack ringbuffer may be an exception for some apps) + */ + +/* expand ellipsis for jack-session */ +jack_client_t * WJACK_client_open2 (const char *client_name, jack_options_t options, jack_status_t *status, const char *uuid) { + if (_j._client_open) { + return ((jack_client_t* (*)(const char *, jack_options_t, jack_status_t *, ...))(_j._client_open))(client_name, options, status, uuid); + } else { + WJACK_WARNING(client_open); + if (status) *status = 0; + return NULL; + } +} + +jack_client_t * WJACK_client_open1 (const char *client_name, jack_options_t options, jack_status_t *status) { + if (_j._client_open) { + return ((jack_client_t* (*)(const char *, jack_options_t, jack_status_t *, ...))_j._client_open)(client_name, options, status); + } else { + WJACK_WARNING(client_open); + if (status) *status = 0; + return NULL; + } +} + +/******************************************************************************* + * Macros to wrap jack API + */ + +/* abstraction for jack_client functions + * rtype jack_function_name (jack_client_t *client) { return rval; } + */ +#define JCFUN(ERR, RTYPE, NAME, RVAL) \ RTYPE WJACK_ ## NAME (jack_client_t *client) { \ - if (_j._ ## NAME) { \ + if likely(_j._ ## NAME) { \ return ((RTYPE (*)(jack_client_t *client)) _j._ ## NAME)(client); \ } else { \ WJACK_WARNING(NAME) \ @@ -326,10 +206,12 @@ static void init_weak_jack(void) } \ } -/* abstraction for NOOP functions */ -#define JPFUN(RTYPE, NAME, DEF, ARGS, RVAL) \ +/* abstraction for NOOP functions with return value + * rtype jack_function_name (ARGS) { return rval; } + */ +#define JPFUN(ERR, RTYPE, NAME, DEF, ARGS, RVAL) \ RTYPE WJACK_ ## NAME DEF { \ - if (_j._ ## NAME) { \ + if likely(_j._ ## NAME) { \ return ((RTYPE (*)DEF) _j._ ## NAME) ARGS; \ } else { \ WJACK_WARNING(NAME) \ @@ -337,10 +219,15 @@ static void init_weak_jack(void) } \ } -/* abstraction for functions with return-value-pointer args */ -#define JXFUN(RTYPE, NAME, DEF, ARGS, CODE) \ +/* abstraction for functions that need custom code. + * e.g. functions with return-value-pointer args, + * use CODE to initialize value + * + * rtype jack_function_name (ARGS) { CODE } + */ +#define JXFUN(ERR, RTYPE, NAME, DEF, ARGS, CODE) \ RTYPE WJACK_ ## NAME DEF { \ - if (_j._ ## NAME) { \ + if likely(_j._ ## NAME) { \ return ((RTYPE (*)DEF) _j._ ## NAME) ARGS; \ } else { \ WJACK_WARNING(NAME) \ @@ -348,153 +235,24 @@ static void init_weak_jack(void) } \ } -/* abstraction for void functions with return-value-pointer args */ -#define JVFUN(RTYPE, NAME, DEF, ARGS, CODE) \ - RTYPE WJACK_ ## NAME DEF { \ - if (_j._ ## NAME) { \ - ((RTYPE (*)DEF) _j._ ## NAME) ARGS; \ +/* abstraction for void functions with return-value-pointer args + * void jack_function_name (ARGS) { CODE } + */ +#define JVFUN(ERR, NAME, DEF, ARGS, CODE) \ + void WJACK_ ## NAME DEF { \ + if likely(_j._ ## NAME) { \ + ((void (*)DEF) _j._ ## NAME) ARGS; \ } else { \ WJACK_WARNING(NAME) \ CODE \ } \ } -/****************************************************************************** - * wrapper functions. - * - * if a function pointer is set in the static struct WeakJack _j, - * call the function, if not a dummy NOOP implementation is provided. - * - * The latter is mainly for the benefit for compile-time (warnings), - * if libjack is not found, jack_client_open() will fail and none - * of the application will never call any of the other functions. - */ +#include "weak_libjack.def" -/* <jack/jack.h> */ +#undef JCFUN +#undef JPFUN +#undef JXFUN +#undef JVFUN -/* expand ellipsis for jack-session */ -jack_client_t * WJACK_client_open2 (const char *client_name, jack_options_t options, jack_status_t *status, const char *uuid) { - if (_j._client_open) { - return ((jack_client_t* (*)(const char *, jack_options_t, jack_status_t *, ...))(_j._client_open))(client_name, options, status, uuid); - } else { - WJACK_WARNING(client_open); - if (status) *status = 0; - return NULL; - } -} - -jack_client_t * WJACK_client_open1 (const char *client_name, jack_options_t options, jack_status_t *status) { - if (_j._client_open) { - return ((jack_client_t* (*)(const char *, jack_options_t, jack_status_t *, ...))_j._client_open)(client_name, options, status); - } else { - WJACK_WARNING(client_open); - if (status) *status = 0; - return NULL; - } -} - -JCFUN(int, client_close, 0) -JCFUN(char*, get_client_name, NULL) -JVFUN(void, on_shutdown, (jack_client_t *c, JackShutdownCallback s, void *a), (c,s,a),) -JVFUN(void, on_info_shutdown, (jack_client_t *c, JackInfoShutdownCallback s, void *a), (c,s,a),) - -JPFUN(int, set_process_callback, (jack_client_t *c, JackProcessCallback p, void *a), (c,p,a), -1) -JPFUN(int, set_freewheel_callback, (jack_client_t *c, JackFreewheelCallback p, void *a), (c,p,a), -1) -JPFUN(int, set_buffer_size_callback, (jack_client_t *c, JackBufferSizeCallback p, void *a), (c,p,a), -1) -JPFUN(int, set_sample_rate_callback, (jack_client_t *c, JackSampleRateCallback p, void *a), (c,p,a), -1) -JPFUN(int, set_port_registration_callback, (jack_client_t *c, JackPortRegistrationCallback p, void *a), (c,p,a), -1) -JPFUN(int, set_port_connect_callback, (jack_client_t *c, JackPortConnectCallback p, void *a), (c,p,a), -1) -JPFUN(int, set_graph_order_callback, (jack_client_t *c, JackGraphOrderCallback g, void *a), (c,g,a), -1) -JPFUN(int, set_xrun_callback, (jack_client_t *c, JackXRunCallback g, void *a), (c,g,a), -1) -JPFUN(int, set_latency_callback, (jack_client_t *c, JackLatencyCallback g, void *a), (c,g,a), -1) -JVFUN(void, set_error_function, (void (*f)(const char *)), (f),) - -JCFUN(int, activate, -1) -JCFUN(int, deactivate, -1) - -JCFUN(jack_nframes_t, get_sample_rate, 0) -JCFUN(jack_nframes_t, get_buffer_size, 0) -JPFUN(jack_nframes_t, frames_since_cycle_start, (const jack_client_t *c), (c), 0) -JPFUN(jack_nframes_t, frame_time, (const jack_client_t *c), (c), 0) -JPFUN(jack_nframes_t, last_frame_time, (const jack_client_t *c), (c), 0) -JCFUN(float, cpu_load, 0) -JCFUN(int, is_realtime, 0) - -JPFUN(int, set_freewheel, (jack_client_t *c, int o), (c,o), 0) -JPFUN(int, set_buffer_size, (jack_client_t *c, jack_nframes_t b), (c,b), 0) - -JCFUN(int, recompute_total_latencies, 0) -JPFUN(jack_nframes_t, port_get_total_latency, (jack_client_t *c, jack_port_t *p), (c,p), 0) -JVFUN(void, port_get_latency_range, (jack_port_t *p, jack_latency_callback_mode_t m, jack_latency_range_t *r), (p,m,r), if (r) {r->min = r->max = 0;}) -JVFUN(void, port_set_latency_range, (jack_port_t *p, jack_latency_callback_mode_t m, jack_latency_range_t *r), (p,m,r),) -JPFUN(void*, port_get_buffer, (jack_port_t *p, jack_nframes_t n), (p,n), NULL) -JPFUN(int, port_request_monitor, (jack_port_t *p, int o), (p,o), 0) -JPFUN(int, port_ensure_monitor, (jack_port_t *p, int o), (p,o), 0) -JPFUN(int, port_monitoring_input, (jack_port_t *p), (p), 0) - -JPFUN(const char*, port_name, (const jack_port_t *p), (p), NULL) -JPFUN(int, port_flags, (const jack_port_t *p), (p), 0) -JPFUN(const char**, get_ports,(jack_client_t *c, const char *p, const char *t, unsigned long f), (c,p,t,f), NULL) -JPFUN(int, port_name_size, (void), (), 0) -JPFUN(int, port_type_size, (void), (), 0) -JPFUN(size_t, port_type_get_buffer_size, (jack_client_t *c, const char *t), (c,t), 0) -JPFUN(jack_port_t*, port_by_name, (jack_client_t *c, const char *n), (c,n), NULL) -JPFUN(jack_port_t*, port_by_id, (jack_client_t *c, jack_port_id_t i), (c,i), NULL) -JPFUN(jack_port_t*, port_register, (jack_client_t *c, const char *n, const char *t, unsigned long f, unsigned long b), (c,n,t,f,b), NULL) -JPFUN(int, port_unregister, (jack_client_t *c, jack_port_t *p), (c,p), 0) -JPFUN(const char *, port_type, (const jack_port_t *p), (p), 0) -JPFUN(const char **, port_get_connections, (const jack_port_t *p), (p), 0) -JPFUN(const char **, port_get_all_connections, (const jack_client_t *c, const jack_port_t *p), (c,p), 0) -JPFUN(int, port_set_name, (jack_port_t *p, const char *n), (p,n), 0) -JPFUN(int, port_disconnect, (jack_client_t *c, jack_port_t *p), (c,p), 0) -JPFUN(int, connect, (jack_client_t *c, const char *s, const char *d), (c,s,d), -1) -JPFUN(int, disconnect, (jack_client_t *c, const char *s, const char *d), (c,s,d), -1) -JVFUN(void, free, (void *p), (p), free(p);) -JCFUN(jack_nframes_t, cycle_wait, 0) -JVFUN(void, cycle_signal, (jack_client_t *c, int s), (c,s),) -JPFUN(int, set_process_thread, (jack_client_t *c, JackThreadCallback p, void *a), (c,p,a), -1) -JPFUN(int, set_thread_init_callback, (jack_client_t *c, JackThreadInitCallback p, void *a), (c,p,a), -1) - -JPFUN(int, transport_locate, (jack_client_t *c, jack_nframes_t f), (c,f), 0) -JVFUN(void, transport_start, (jack_client_t *c), (c),) -JVFUN(void, transport_stop, (jack_client_t *c), (c),) -JPFUN(jack_nframes_t, get_current_transport_frame, (const jack_client_t *c), (c), 0) -JXFUN(jack_transport_state_t, transport_query, (const jack_client_t *c, jack_position_t *p), (c,p), memset(p, 0, sizeof(jack_position_t)); return 0;) -JPFUN(int, set_sync_callback, (jack_client_t *c, JackSyncCallback p, void *a), (c,p,a), -1) -JPFUN(int, set_timebase_callback, (jack_client_t *c, int l, JackTimebaseCallback p, void *a), (c,l,p,a), -1) -JCFUN(int, release_timebase, 0) - -/* <jack/midiport.h> */ -JPFUN(uint32_t, midi_get_event_count, (void* p), (p), 0) -JPFUN(int, midi_event_get, (jack_midi_event_t *e, void *p, uint32_t i), (e,p,i), -1) -JPFUN(int, midi_event_write, (void *b, jack_nframes_t t, const jack_midi_data_t *d, size_t s), (b,t,d,s), -1) -JVFUN(void, midi_clear_buffer, (void *b), (b),) - -/* <jack/session.h> */ -JPFUN(int, set_session_callback, (jack_client_t *c, JackSessionCallback s, void *a), (c,s,a), -1) -JPFUN(int, session_reply, (jack_client_t *c, jack_session_event_t *e), (c,e), -1) -JVFUN(void, session_event_free, (jack_session_event_t *e), (e), ) - -/* <jack/ringbuffer.h> */ -JPFUN(jack_ringbuffer_t *, ringbuffer_create, (size_t s), (s), NULL) -JVFUN(void, ringbuffer_free, (jack_ringbuffer_t *rb), (rb), ) -JVFUN(void, ringbuffer_reset, (jack_ringbuffer_t *rb), (rb), ) -JVFUN(void, ringbuffer_read_advance, (jack_ringbuffer_t *rb, size_t c), (rb,c), ) -JVFUN(void, ringbuffer_write_advance, (jack_ringbuffer_t *rb, size_t c), (rb,c), ) -JPFUN(size_t, ringbuffer_read_space, (const jack_ringbuffer_t *rb), (rb), 0) -JPFUN(size_t, ringbuffer_write_space, (const jack_ringbuffer_t *rb), (rb), 0) -JPFUN(size_t, ringbuffer_read, (jack_ringbuffer_t *rb, char *d, size_t c), (rb,d,c), 0) -JPFUN(size_t, ringbuffer_write, (jack_ringbuffer_t *rb, const char *s, size_t c), (rb,s,c), 0) -JPFUN(int, ringbuffer_mlock, (jack_ringbuffer_t *rb), (rb), 0) - -/* <jack/thread.h> */ -JCFUN(int, client_real_time_priority, 0) -JCFUN(int, client_max_real_time_priority, 0) -JPFUN(int, acquire_real_time_scheduling, (jack_native_thread_t t, int p), (t,p), 0) -JPFUN(int, drop_real_time_scheduling, (jack_native_thread_t t), (t), 0) -JPFUN(int, client_stop_thread, (jack_client_t* c, jack_native_thread_t t), (c,t), 0) -JPFUN(int, client_kill_thread, (jack_client_t* c, jack_native_thread_t t), (c,t), 0) -JPFUN(int, client_create_thread, \ - (jack_client_t* c, jack_native_thread_t *t, int p, int r, void *(*f)(void*), void *a), (c,t,p,r,f,a), 0) - -#endif +#endif // end USE_WEAK_JACK diff --git a/libs/backends/jack/weak_libjack.def b/libs/backends/jack/weak_libjack.def new file mode 100644 index 0000000000..8da9ac6872 --- /dev/null +++ b/libs/backends/jack/weak_libjack.def @@ -0,0 +1,121 @@ +/* macro-absraction of the JACK API + * + * see weak_libjack.c for details, in general arguments are: + * + * [required], [return type], [name], [arguments], [code or return value] + * + * This file is included multiple times with different macro definitions + * do not add header guards. + * see https://en.wikibooks.org/wiki/C_Programming/Preprocessor#X-Macros + */ + +#ifndef USE_WEAK_JACK + +/* <jack/jack.h> */ +JCFUN(1, int, client_close, 0) +JCFUN(1, char*, get_client_name, NULL) +JVFUN(0, on_shutdown, (jack_client_t *c, JackShutdownCallback s, void *a), (c,s,a),) +JVFUN(0, on_info_shutdown, (jack_client_t *c, JackInfoShutdownCallback s, void *a), (c,s,a),) + +JPFUN(1, int, set_process_callback, (jack_client_t *c, JackProcessCallback p, void *a), (c,p,a), -1) +JPFUN(1, int, set_freewheel_callback, (jack_client_t *c, JackFreewheelCallback p, void *a), (c,p,a), -1) +JPFUN(1, int, set_buffer_size_callback, (jack_client_t *c, JackBufferSizeCallback p, void *a), (c,p,a), -1) +JPFUN(1, int, set_sample_rate_callback, (jack_client_t *c, JackSampleRateCallback p, void *a), (c,p,a), -1) +JPFUN(1, int, set_port_registration_callback, (jack_client_t *c, JackPortRegistrationCallback p, void *a), (c,p,a), -1) +JPFUN(1, int, set_port_connect_callback, (jack_client_t *c, JackPortConnectCallback p, void *a), (c,p,a), -1) +JPFUN(1, int, set_graph_order_callback, (jack_client_t *c, JackGraphOrderCallback g, void *a), (c,g,a), -1) +JPFUN(1, int, set_xrun_callback, (jack_client_t *c, JackXRunCallback g, void *a), (c,g,a), -1) +JPFUN(1, int, set_latency_callback, (jack_client_t *c, JackLatencyCallback g, void *a), (c,g,a), -1) +JVFUN(1, set_error_function, (void (*f)(const char *)), (f),) + +JCFUN(1, int, activate, -1) +JCFUN(1, int, deactivate, -1) + +JCFUN(1, jack_nframes_t, get_sample_rate, 0) +JCFUN(1, jack_nframes_t, get_buffer_size, 0) +JPFUN(1, jack_nframes_t, frames_since_cycle_start, (const jack_client_t *c), (c), 0) +JPFUN(1, jack_nframes_t, frame_time, (const jack_client_t *c), (c), 0) +JPFUN(1, jack_nframes_t, last_frame_time, (const jack_client_t *c), (c), 0) +JCFUN(1, float, cpu_load, 0) +JCFUN(1, int, is_realtime, 0) + +JPFUN(1, int, set_freewheel, (jack_client_t *c, int o), (c,o), 0) +JPFUN(1, int, set_buffer_size, (jack_client_t *c, jack_nframes_t b), (c,b), 0) + +JCFUN(0, int, recompute_total_latencies, 0) +JPFUN(0, jack_nframes_t, port_get_total_latency, (jack_client_t *c, jack_port_t *p), (c,p), 0) +JVFUN(0, port_get_latency_range, (jack_port_t *p, jack_latency_callback_mode_t m, jack_latency_range_t *r), (p,m,r), if (r) {r->min = r->max = 0;}) +JVFUN(0, port_set_latency_range, (jack_port_t *p, jack_latency_callback_mode_t m, jack_latency_range_t *r), (p,m,r),) + +JPFUN(1, void*, port_get_buffer, (jack_port_t *p, jack_nframes_t n), (p,n), NULL) +JPFUN(1, int, port_request_monitor, (jack_port_t *p, int o), (p,o), 0) +JPFUN(1, int, port_ensure_monitor, (jack_port_t *p, int o), (p,o), 0) +JPFUN(1, int, port_monitoring_input, (jack_port_t *p), (p), 0) + +JPFUN(1, const char*, port_name, (const jack_port_t *p), (p), NULL) +JPFUN(1, int, port_flags, (const jack_port_t *p), (p), 0) +JPFUN(1, const char**, get_ports,(jack_client_t *c, const char *p, const char *t, unsigned long f), (c,p,t,f), NULL) +JPFUN(1, int, port_name_size, (void), (), 0) +JPFUN(1, int, port_type_size, (void), (), 0) +JPFUN(1, size_t, port_type_get_buffer_size, (jack_client_t *c, const char *t), (c,t), 0) +JPFUN(1, jack_port_t*, port_by_name, (jack_client_t *c, const char *n), (c,n), NULL) +JPFUN(1, jack_port_t*, port_by_id, (jack_client_t *c, jack_port_id_t i), (c,i), NULL) +JPFUN(1, jack_port_t*, port_register, (jack_client_t *c, const char *n, const char *t, unsigned long f, unsigned long b), (c,n,t,f,b), NULL) +JPFUN(1, int, port_unregister, (jack_client_t *c, jack_port_t *p), (c,p), 0) +JPFUN(1, const char *, port_type, (const jack_port_t *p), (p), 0) +JPFUN(1, const char **, port_get_connections, (const jack_port_t *p), (p), 0) +JPFUN(1, const char **, port_get_all_connections, (const jack_client_t *c, const jack_port_t *p), (c,p), 0) +JPFUN(1, int, port_set_name, (jack_port_t *p, const char *n), (p,n), 0) +JPFUN(1, int, port_disconnect, (jack_client_t *c, jack_port_t *p), (c,p), 0) +JPFUN(1, int, connect, (jack_client_t *c, const char *s, const char *d), (c,s,d), -1) +JPFUN(1, int, disconnect, (jack_client_t *c, const char *s, const char *d), (c,s,d), -1) +JVFUN(0, free, (void *p), (p), free(p);) + +JCFUN(1, jack_nframes_t, cycle_wait, 0) +JVFUN(1, cycle_signal, (jack_client_t *c, int s), (c,s),) +JPFUN(1, int, set_process_thread, (jack_client_t *c, JackThreadCallback p, void *a), (c,p,a), -1) +JPFUN(1, int, set_thread_init_callback, (jack_client_t *c, JackThreadInitCallback p, void *a), (c,p,a), -1) + +JPFUN(1, int, transport_locate, (jack_client_t *c, jack_nframes_t f), (c,f), 0) +JVFUN(1, transport_start, (jack_client_t *c), (c),) +JVFUN(1, transport_stop, (jack_client_t *c), (c),) +JPFUN(1, jack_nframes_t, get_current_transport_frame, (const jack_client_t *c), (c), 0) +JXFUN(1, jack_transport_state_t, transport_query, (const jack_client_t *c, jack_position_t *p), (c,p), memset(p, 0, sizeof(jack_position_t)); return 0;) +JPFUN(1, int, set_sync_callback, (jack_client_t *c, JackSyncCallback p, void *a), (c,p,a), -1) +JPFUN(1, int, set_timebase_callback, (jack_client_t *c, int l, JackTimebaseCallback p, void *a), (c,l,p,a), -1) +JCFUN(1, int, release_timebase, 0) + +/* <jack/midiport.h> */ +JPFUN(1, uint32_t, midi_get_event_count, (void* p), (p), 0) +JPFUN(1, int, midi_event_get, (jack_midi_event_t *e, void *p, uint32_t i), (e,p,i), -1) +JPFUN(1, int, midi_event_write, (void *b, jack_nframes_t t, const jack_midi_data_t *d, size_t s), (b,t,d,s), -1) +JVFUN(1, midi_clear_buffer, (void *b), (b),) + +/* <jack/session.h> */ +JPFUN(0, int, set_session_callback, (jack_client_t *c, JackSessionCallback s, void *a), (c,s,a), -1) +JPFUN(0, int, session_reply, (jack_client_t *c, jack_session_event_t *e), (c,e), -1) +JVFUN(0, session_event_free, (jack_session_event_t *e), (e), ) + +/* <jack/ringbuffer.h> */ +JPFUN(1, jack_ringbuffer_t *, ringbuffer_create, (size_t s), (s), NULL) +JVFUN(1, ringbuffer_free, (jack_ringbuffer_t *rb), (rb), ) +JVFUN(1, ringbuffer_reset, (jack_ringbuffer_t *rb), (rb), ) +JVFUN(1, ringbuffer_read_advance, (jack_ringbuffer_t *rb, size_t c), (rb,c), ) +JVFUN(1, ringbuffer_write_advance, (jack_ringbuffer_t *rb, size_t c), (rb,c), ) +JPFUN(1, size_t, ringbuffer_read_space, (const jack_ringbuffer_t *rb), (rb), 0) +JPFUN(1, size_t, ringbuffer_write_space, (const jack_ringbuffer_t *rb), (rb), 0) +JPFUN(1, size_t, ringbuffer_read, (jack_ringbuffer_t *rb, char *d, size_t c), (rb,d,c), 0) +JPFUN(1, size_t, ringbuffer_write, (jack_ringbuffer_t *rb, const char *s, size_t c), (rb,s,c), 0) +JPFUN(0, int, ringbuffer_mlock, (jack_ringbuffer_t *rb), (rb), 0) + +/* <jack/thread.h> */ +JCFUN(0, int, client_real_time_priority, 0) +JCFUN(0, int, client_max_real_time_priority, 0) +JPFUN(0, int, acquire_real_time_scheduling, (jack_native_thread_t t, int p), (t,p), 0) +JPFUN(0, int, drop_real_time_scheduling, (jack_native_thread_t t), (t), 0) +JPFUN(1, int, client_stop_thread, (jack_client_t* c, jack_native_thread_t t), (c,t), 0) +JPFUN(1, int, client_kill_thread, (jack_client_t* c, jack_native_thread_t t), (c,t), 0) +JPFUN(1, int, client_create_thread, \ + (jack_client_t* c, jack_native_thread_t *t, int p, int r, void *(*f)(void*), void *a), (c,t,p,r,f,a), 0) + +#endif // end USE_WEAK_JACK diff --git a/libs/backends/jack/weak_libjack.h b/libs/backends/jack/weak_libjack.h index 3985014dfb..10e2751d0f 100644 --- a/libs/backends/jack/weak_libjack.h +++ b/libs/backends/jack/weak_libjack.h @@ -2,6 +2,10 @@ * * (C) 2014 Robin Gareus <robin@gareus.org> * + * The wrapped jack API itself is + * (C) 2001 Paul Davis + * (C) 2004 Jack O'Quin + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) @@ -152,12 +156,14 @@ int have_libjack(void); /* var-args hack */ #define jack_client_open1 WJACK_client_open1 #define jack_client_open2 WJACK_client_open2 -#include <jack/types.h> + +#include <jack/types.h> // needed for jack_client_open abstraction #ifdef __cplusplus extern "C" { #endif + jack_client_t * WJACK_client_open1 ( const char *client_name, jack_options_t options, jack_status_t *status); @@ -170,13 +176,13 @@ jack_client_t * WJACK_client_open2 ( } #endif -#else +#else /* directly use JACK API */ /* var-args hack */ #define jack_client_open1 jack_client_open #define jack_client_open2 jack_client_open -#endif // USE_WEAK_JACK +#endif // end USE_WEAK_JACK #include <jack/jack.h> #include <jack/transport.h> diff --git a/libs/backends/jack/wscript b/libs/backends/jack/wscript index 3f99a2127e..033024c710 100644 --- a/libs/backends/jack/wscript +++ b/libs/backends/jack/wscript @@ -75,6 +75,7 @@ def build(bld): obj.uselib += [ 'JACK' ] else: obj.defines += [ 'USE_WEAK_JACK' ] + obj.deps = [ 'weak_libjack.def' ] # # device discovery code in the jack backend needs ALSA |