Add an option for direct pass-through of system messages.

master
Albert Graef 2018-09-08 17:55:12 +02:00
parent be5094bda7
commit 6c4dbb03cf
3 changed files with 40 additions and 10 deletions

View File

@ -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]))
{

View File

@ -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;

View File

@ -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);
}