Add an option for direct pass-through of system messages.
parent
be5094bda7
commit
6c4dbb03cf
31
jackdriver.c
31
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]))
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
16
midizap.c
16
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue