[Jack-Devel] Fwd: Possible error codes for jack_midi_event_get()?

Hanspeter Portner dev at open-music-kontrollers.ch
Sat Jul 28 20:21:59 CEST 2018

On 28.07.2018 16:55, Matthias Geier wrote:
> Dear list.
> I'm the author of one of the Python bindings for JACK:
> https://jackclient-python.readthedocs.io/
> I was a bit lazy when implementing a generator function that's
> supposed to yield all incoming MIDI events one-by-one.
> Here's the code if somebody is interested (it's using CFFI and the
> _lib object is a wrapper for the JACK API):
>     def incoming_midi_events(self):
>         event = self._event
>         buf = _lib.jack_port_get_buffer(
>             self._ptr, self._client.blocksize)
>         for i in range(_lib.jack_midi_get_event_count(buf)):
>             err = _lib.jack_midi_event_get(event, buf, i)
>             # TODO: proper error handling if this ever happens:
>             assert not err, err
>             yield event.time, _ffi.buffer(event.buffer, event.size)
> As you can see, I didn't check the return value of
> jack_midi_event_get(), I just added an "assert" statement hoping that
> somebody would report it if the call to jack_midi_event_get() would
> ever fail.
> I didn't hear anything for a long time, but recently I got a bug
> report where the assertion was violated:
> https://github.com/spatialaudio/jackclient-python/issues/54
> This shows that jack_midi_event_get() can raise an error, even if I
> check with jack_midi_get_event_count() beforehand.
> My question is now: how should I react to this error?

For JACK1 error is only returned if midi_event_index >= midi_event_count [1].

For JACK2 the same is true; additionally it can fail if the MIDI port buffer is
invalid (whatever that means...) [2].

[1] https://github.com/jackaudio/jack1/blob/master/libjack/midiport.c#L96
[2] https://github.com/jackaudio/jack2/blob/master/common/JackMidiAPI.cpp#L67

> Shall I ...
> * discard the current event and continue reading further events?
> * discard the current and all following events in this block?
> * raise an error?
> * do something else?

Well, there is no valid event, so ignore it ?

> Can I guarantee that no incoming MIDI events get lost?

MIDI events can only get lost while multiplexed down from multiple ports into
one (and the latter can not take them all), iirc.

> Another related question: what error code is supposed to be returned?
> The documentation
> (http://www.jackaudio.org/api/group__MIDIAPI.html#ga838c794bd1451bfd47edde1c7cd1ff4f)
> mentions ENODATA, but according to my bug report, ENOBUFS (-105) was
> returned.
> Is this a bug in JACK or an omission in the documentation?

It is in the documentation, that it can fail [3].

[3] http://jackaudio.org/api/group__MIDIAPI.html#ga838c794bd1451bfd47edde1c7cd1ff4f

> I don't know which JACK version was used, the OS was Ubuntu 18.04 LTS 64 bits.
> cheers,
> Matthias

More information about the Jackaudio mailing list