-
-inline size_t
-MidiRingBuffer::write(nframes_t time, size_t size, const Byte* buf)
-{
- assert(size > 0);
-
- if (write_space() < (sizeof(nframes_t) + sizeof(size_t) + size)) {
- return 0;
- } else {
- MidiRingBufferBase<Byte>::write(sizeof(nframes_t), (Byte*)&time);
- MidiRingBufferBase<Byte>::write(sizeof(size_t), (Byte*)&size);
- MidiRingBufferBase<Byte>::write(size, buf);
- return size;
- }
-}
-
-
-inline size_t
-MidiRingBuffer::read(MidiBuffer& dst, nframes_t start, nframes_t end)
-{
- if (read_space() == 0)
- return 0;
-
- MidiEvent ev;
-
- size_t count = 0;
-
- while (read_space() > sizeof(nframes_t) + sizeof(size_t)) {
-
- full_peek(sizeof(nframes_t), (Byte*)&ev.time);
-
- if (ev.time > end)
- break;
-
- bool success = MidiRingBufferBase<Byte>::full_read(sizeof(nframes_t), (Byte*)&ev.time);
- if (success)
- success = MidiRingBufferBase<Byte>::full_read(sizeof(size_t), (Byte*)&ev.size);
-
- if (!success) {
- cerr << "MRB: READ ERROR (time/size)" << endl;
- continue;
- }
-
- if (ev.time >= start) {
- Byte* write_loc = dst.reserve(ev.time, ev.size);
- success = MidiRingBufferBase<Byte>::full_read(ev.size, write_loc);
-
- if (!success)
- cerr << "MRB: READ ERROR (data)" << endl;
-
- //printf("MRB - read %#X %d %d with time %u at index %zu\n",
- // ev.buffer[0], ev.buffer[1], ev.buffer[2], ev.time,
- // priv_read_ptr);
- //
- } else {
- printf("MRB - SKIPPING - %#X %d %d with time %u\n",
- ev.buffer[0], ev.buffer[1], ev.buffer[2], ev.time);
- break;
- }
-
- ++count;
-
- assert(ev.time <= end);
- }
-
- //printf("(R) read space: %zu\n", read_space());
-
- return count;
-}
-
-