25 #ifndef SRC_HEADERS_GX_JACK_H_ 26 #define SRC_HEADERS_GX_JACK_H_ 30 #include <jack/jack.h> 31 #include <jack/midiport.h> 32 #include <jack/ringbuffer.h> 34 #ifdef HAVE_JACK_SESSION 35 #include <jack/session.h> 52 : name_a(a), name_b(b), connect(conn) {}
70 void push(
const char *a,
const char *b,
bool conn);
99 #ifdef HAVE_JACK_SESSION 101 typedef int (*jack_set_session_callback_type)(
102 jack_client_t *, JackSessionCallback,
void *arg);
103 typedef char *(*jack_get_uuid_for_client_name_type)(
104 jack_client_t *,
const char *);
105 typedef char *(*jack_client_get_uuid_type)(jack_client_t *);
113 static const int max_midi_cc_cnt = 25;
114 std::atomic<bool> send_cc[max_midi_cc_cnt];
115 int cc_num[max_midi_cc_cnt];
116 int pg_num[max_midi_cc_cnt];
117 int bg_num[max_midi_cc_cnt];
118 int me_num[max_midi_cc_cnt];
121 bool send_midi_cc(
int _cc,
int _pg,
int _bgn,
int _num);
122 inline int next(
int i = -1)
const;
123 inline int size(
int i)
const {
return me_num[i]; }
124 inline void fill(
unsigned char *midi_send,
int i);
127 inline int MidiCC::next(
int i)
const {
128 while (++i < max_midi_cc_cnt) {
129 if (send_cc[i].load(std::memory_order_acquire)) {
136 inline void MidiCC::fill(
unsigned char *midi_send,
int i) {
138 midi_send[2] = bg_num[i];
140 midi_send[1] = pg_num[i];
141 midi_send[0] = cc_num[i];
142 send_cc[i].store(
false, std::memory_order_release);
152 static int gx_jack_srate_callback(jack_nframes_t,
void* arg);
153 static int gx_jack_xrun_callback(
void* arg);
154 static int gx_jack_buffersize_callback(jack_nframes_t,
void* arg);
155 static int gx_jack_process(jack_nframes_t,
void* arg);
156 static int gx_jack_insert_process(jack_nframes_t,
void* arg);
158 static void shutdown_callback_client(
void* arg);
159 static void shutdown_callback_client_insert(
void* arg);
160 void gx_jack_shutdown_callback();
161 static void gx_jack_portreg_callback(jack_port_id_t,
int,
void* arg);
162 static void gx_jack_portconn_callback(jack_port_id_t a, jack_port_id_t b,
int connect,
void* arg);
163 #ifdef HAVE_JACK_SESSION 164 jack_session_event_t *session_event;
165 jack_session_event_t *session_event_ins;
166 int session_callback_seen;
167 static void gx_jack_session_callback(jack_session_event_t *event,
void *arg);
168 static void gx_jack_session_callback_ins(jack_session_event_t *event,
void *arg);
169 static jack_set_session_callback_type jack_set_session_callback_fp;
170 static jack_get_uuid_for_client_name_type jack_get_uuid_for_client_name_fp;
171 static jack_client_get_uuid_type jack_client_get_uuid_fp;
173 void cleanup_slot(
bool otherthread);
174 void fetch_connection_data();
188 void report_xrun_clear();
190 void write_jack_port_connections(
192 std::string make_clientvar(
const std::string& s);
193 std::string replace_clientvar(
const std::string& s);
194 int is_power_of_two (
unsigned int x);
195 bool gx_jack_init(
bool startserver,
int wait_after_connect,
198 void gx_jack_callbacks();
199 void gx_jack_cleanup();
200 inline void check_overload();
201 void process_midi_cc(
void *buf, jack_nframes_t nframes);
216 bool get_is_rt() {
return client ? jack_is_realtime(client) :
false; }
217 jack_nframes_t
get_time_is() {
return client ? jack_frame_time(client) : 0; }
227 bool gx_jack_connection(
bool connect,
bool startserver,
230 void* get_midi_buffer(jack_nframes_t nframes);
231 bool send_midi_cc(
int cc_num,
int pgm_num,
int bgn,
int num);
235 static string get_default_instancename();
250 static void rt_watchdog_set_limit(
int limit);
251 #ifdef HAVE_JACK_SESSION 252 jack_session_event_t *get_last_session_event() {
255 jack_session_event_t *get_last_session_event_ins() {
258 int return_last_session_event();
259 int return_last_session_event_ins();
260 string get_uuid_insert();
266 inline bool GxJack::send_midi_cc(
int cc_num,
int pgm_num,
int bgn,
int num) {
270 return mmessage.send_midi_cc(cc_num, pgm_num, bgn, num);
275 #endif // SRC_HEADERS_GX_JACK_H_
void send_connection_changes(bool v)
void set_jack_down(bool v)
jack_nframes_t get_jack_sr()
Glib::Dispatcher & signal_portchange()
sigc::signal< void, string, string, bool > connection_changed
Glib::Dispatcher buffersize_change
PortConnection midi_output
PortConnection insert_out
jack_nframes_t get_jack_bs()
Glib::Dispatcher connection
gx_engine::GxEngine & engine
void set_jack_insert(bool v)
int atomic_get(volatile int &p)
Glib::Dispatcher new_data
void set_jack_exit(bool v)
sigc::signal< void, string, string, bool > & signal_connection_changed()
Glib::Dispatcher & signal_buffersize_change()
PortConnData(const char *a, const char *b, bool conn)
jack_transport_state_t transport_state
jack_client_t * client_insert
PortConnection midi_input
const string & get_instancename()
void atomic_set(volatile int *p, int v)
Glib::Dispatcher shutdown
sigc::signal< void > & signal_client_change()
Glib::Dispatcher portchange
gx_engine::GxEngine & engine
Glib::Dispatcher session_ins
sigc::signal< void > client_change
jack_transport_state_t old_transport_state
string client_insert_name
PortConnRing connection_queue
Glib::Dispatcher client_change_rt
jack_nframes_t get_time_is()