-inline size_t
-MidiRingBuffer::read(MidiBuffer& dst, jack_nframes_t start, jack_nframes_t end)
-{
- if (read_space() == 0)
- return 0;
-
- size_t priv_read_ptr = g_atomic_int_get(&_read_ptr);
- jack_nframes_t time = _ev_buf[priv_read_ptr].time;
- size_t count = 0;
- size_t limit = read_space();
-
- assert(time >= start); // FIXME: deal with skipped cycles/lost notes somehow
-
- while (time <= end && limit > 0) {
- MidiEvent* const read_ev = &_ev_buf[priv_read_ptr];
- if (time >= start) {
- dst.push_back(*read_ev);
- printf("MRB - read %#X %d %d with time %u at index %zu\n",
- read_ev->buffer[0], read_ev->buffer[1], read_ev->buffer[2], read_ev->time,
- priv_read_ptr);
- } else {
- printf("MRB - SKIPPING - %#X %d %d with time %u at index %zu\n",
- read_ev->buffer[0], read_ev->buffer[1], read_ev->buffer[2], read_ev->time,
- priv_read_ptr);
- break;
- }
-
- clear_event(priv_read_ptr);
-
- ++count;
- --limit;
-
- priv_read_ptr = (priv_read_ptr + 1) % _size;
-
- assert(read_ev->time <= end);
- time = _ev_buf[priv_read_ptr].time;