[Jack-Devel] jack midi event reserve vs. write

Hanspeter Portner ventosus at airpost.net
Tue Dec 20 13:30:47 CET 2016

On 20.12.2016 12:09, ROBERT WOLF wrote:
> What exactly is the difference between *jack_midi_event_reserve* and
> *jack_midi_event_write* ?
> In particular, if I call *jack_midi_event_write*, does it actually copy the data
> from the buffer, which I provide?

For a simple MIDI message

  const size_t sz = 3;
  const uint8_t src [sz] = {0x90, 0x2f, 0x7f};

think of jack_midi_event_write as a convenience wrapper around
jack_midi_event_reserve and memcpy

  uint8_t *dst = jack_midi_event_reserve(client, 0, sz);
    memcpy(dst, src, sz);
    ; // no space left on buffer

which is equivalent to

  if(jack_midi_event_write(client, 0, src, sz) != 0)
    ; // no space left on buffer

> Or does it use that same buffer.
> Another question is how can I send midi events generated from GUI, (which does
> not run in the audio callback)?
> My guess is to cache them somewhere and transmit them inside the callback?
> Am I guessing correctly?

The common practice is to use lock-free single-reader/single-writer ring buffers
to exchange data between worker/GUI and audio threads.

JACK readily ships its own implementation of such a structure [1].

[1] http://jackaudio.org/api/ringbuffer_8h.html

More information about the Jackaudio mailing list