diff --git a/jackdriver.c b/jackdriver.c index 9db4d52..aef4d87 100644 --- a/jackdriver.c +++ b/jackdriver.c @@ -150,12 +150,24 @@ process_midi_input(JACK_SEQ* seq,jack_nframes_t nframes) jack_midi_event_t event; void *port_buffer = jack_port_get_buffer(seq->input_port[k], nframes); + // this is used for direct pass-through of system messages + void *out_buffer = seq->passthrough && k < seq->n_out? + jack_port_get_buffer(seq->output_port[k], nframes):0; if (port_buffer == NULL) { fprintf(stderr, "jack_port_get_buffer failed, cannot receive anything.\n"); return; } + if (out_buffer) + { +#ifdef JACK_MIDI_NEEDS_NFRAMES + jack_midi_clear_buffer(out_buffer, nframes); +#else + jack_midi_clear_buffer(out_buffer); +#endif + } + #ifdef JACK_MIDI_NEEDS_NFRAMES events = jack_midi_get_event_count(port_buffer, nframes); #else @@ -174,7 +186,7 @@ process_midi_input(JACK_SEQ* seq,jack_nframes_t nframes) { //successful event get - if (event.size <= 3 && event.size >= 1) + if (event.size <= 3 && event.size >= 1 && event.buffer[0] < 0xf0) { //not sysex or something @@ -185,6 +197,16 @@ process_midi_input(JACK_SEQ* seq,jack_nframes_t nframes) memcpy(rev.data, event.buffer, rev.len); queue_message(seq->ringbuffer_in[k],&rev); } + else if (out_buffer && event.size >= 1 && event.buffer[0] >= 0xf0) + { + // direct pass-through of system messages +#ifdef JACK_MIDI_NEEDS_NFRAMES + uint8_t *buffer = jack_midi_event_reserve(out_buffer, event.time, event.size, nframes); +#else + uint8_t *buffer = jack_midi_event_reserve(out_buffer, event.time, event.size); +#endif + if (buffer) memcpy(buffer, event.buffer, event.size); + } } } @@ -211,11 +233,14 @@ process_midi_output(JACK_SEQ* seq,jack_nframes_t nframes) return; } + if (!seq->passthrough) + { #ifdef JACK_MIDI_NEEDS_NFRAMES - jack_midi_clear_buffer(port_buffer, nframes); + jack_midi_clear_buffer(port_buffer, nframes); #else - jack_midi_clear_buffer(port_buffer); + jack_midi_clear_buffer(port_buffer); #endif + } while (jack_ringbuffer_read_space(seq->ringbuffer_out[k])) { diff --git a/jackdriver.h b/jackdriver.h index 1fbec0f..4a94c86 100644 --- a/jackdriver.h +++ b/jackdriver.h @@ -11,8 +11,7 @@ typedef struct _jseq jack_client_t *jack_client; jack_port_t **output_port; jack_port_t **input_port; - uint8_t n_in; - uint8_t n_out; + uint8_t n_in, n_out, passthrough; } JACK_SEQ; extern int jack_quit; diff --git a/midizap.c b/midizap.c index 175398f..d29e05c 100644 --- a/midizap.c +++ b/midizap.c @@ -20,7 +20,7 @@ typedef struct input_event EV; Display *display; JACK_SEQ seq; -int jack_num_outputs = 0, debug_jack = 0; +int jack_num_outputs = 0, debug_jack = 0, passthrough = 0; int shift = 0; void @@ -1489,14 +1489,15 @@ handle_event(uint8_t *msg, uint8_t portno, int depth, int recursive) void help(char *progname) { - fprintf(stderr, "Usage: %s [-h] [-k] [-o[n]] [-j name] [-P[prio]] [-r rcfile] [-d[rskmj]]\n", progname); + fprintf(stderr, "Usage: %s [-hks] [-d[rskmj]] [-o[n]] [-j name] [-P[prio]] [-r rcfile]\n", progname); fprintf(stderr, "-h print this message\n"); + fprintf(stderr, "-d debug (r = regex, s = strokes, k = keys, m = midi, j = jack; default: all)\n"); + fprintf(stderr, "-j jack client name (default: midizap)\n"); fprintf(stderr, "-k keep track of key status (ignore double notes)\n"); fprintf(stderr, "-o set number of MIDI output ports (0-2, default: 1)\n"); - fprintf(stderr, "-j jack client name (default: midizap)\n"); fprintf(stderr, "-P set real-time priority (default: 90)\n"); fprintf(stderr, "-r config file name (default: MIDIZAP_CONFIG_FILE variable or ~/.midizaprc)\n"); - fprintf(stderr, "-d debug (r = regex, s = strokes, k = keys, m = midi, j = jack; default: all)\n"); + fprintf(stderr, "-s pass-through of system messages\n"); } uint8_t quit = 0; @@ -1573,7 +1574,7 @@ main(int argc, char **argv) // Start recording the command line to be passed to Jack session management. add_command(argv[0], 0); - while ((opt = getopt(argc, argv, "hko::d::j:r:P::")) != -1) { + while ((opt = getopt(argc, argv, "hko::d::j:r:P::s")) != -1) { switch (opt) { case 'h': help(argv[0]); @@ -1662,6 +1663,10 @@ main(int argc, char **argv) exit(1); } break; + case 's': + passthrough = 1; + add_command("-s", 1); + break; default: fprintf(stderr, "Try -h for help.\n"); exit(1); @@ -1687,6 +1692,7 @@ main(int argc, char **argv) seq.client_name = jack_client_name; seq.n_in = jack_num_outputs>1?jack_num_outputs:1; seq.n_out = jack_num_outputs>0?jack_num_outputs:0; + seq.passthrough = jack_num_outputs>0?passthrough:0; if (!init_jack(&seq, debug_jack)) { exit(1); }