+template<typename T>
+void
+MidiRingBuffer<T>::flush (framepos_t /*start*/, framepos_t end)
+{
+ const size_t prefix_size = sizeof(T) + sizeof(Evoral::EventType) + sizeof(uint32_t);
+
+ while (this->read_space() >= prefix_size) {
+ uint8_t peekbuf[prefix_size];
+ bool success;
+ uint32_t ev_size;
+ T ev_time;
+
+ success = this->peek (peekbuf, prefix_size);
+ /* this cannot fail, because we've already verified that there
+ is prefix_space to read
+ */
+ assert (success);
+
+ ev_time = *(reinterpret_cast<T*>((uintptr_t)peekbuf));
+
+ if (ev_time >= end) {
+ break;
+ }
+
+ ev_size = *(reinterpret_cast<uint32_t*>((uintptr_t)(peekbuf + sizeof(T) + sizeof (Evoral::EventType))));
+ this->increment_read_ptr (prefix_size);
+ this->increment_read_ptr (ev_size);
+ }
+}
+
+template<typename T>
+void
+MidiRingBuffer<T>::dump(ostream& str)
+{
+ size_t rspace;
+
+ if ((rspace = this->read_space()) == 0) {
+ str << "MRB::dump: empty\n";
+ return;
+ }
+
+ T ev_time;
+ Evoral::EventType ev_type;
+ uint32_t ev_size;
+
+ RingBufferNPT<uint8_t>::rw_vector vec;
+ RingBufferNPT<uint8_t>::get_read_vector (&vec);
+
+ if (vec.len[0] == 0) {
+ return;
+ }
+
+ str << this << ": Dump size = " << vec.len[0] + vec.len[1]
+ << " r@ " << RingBufferNPT<uint8_t>::get_read_ptr()
+ << " w@" << RingBufferNPT<uint8_t>::get_write_ptr() << endl;
+
+
+ uint8_t *buf = new uint8_t[vec.len[0] + vec.len[1]];
+ memcpy (buf, vec.buf[0], vec.len[0]);
+
+ if (vec.len[1]) {
+ memcpy (buf+vec.len[1], vec.buf[1], vec.len[1]);
+ }
+
+ uint8_t* data = buf;
+ const uint8_t* end = buf + vec.len[0] + vec.len[1];
+
+ while (data < end) {
+
+ memcpy (&ev_time, data, sizeof (T));
+ data += sizeof (T);
+ str << "\ttime " << ev_time;
+
+ if (data >= end) {
+ str << "(incomplete)\n ";
+ break;
+ }
+
+ memcpy (&ev_type, data, sizeof (ev_type));
+ data += sizeof (ev_type);
+ str << " type " << ev_type;
+
+ if (data >= end) {
+ str << "(incomplete)\n";
+ break;
+ }
+
+ memcpy (&ev_size, data, sizeof (ev_size));
+ data += sizeof (ev_size);
+ str << " size " << ev_size;
+
+ if (data >= end) {
+ str << "(incomplete)\n";
+ break;
+ }
+
+ for (uint32_t i = 0; i != ev_size && data < end; ++i) {
+ str << ' ' << hex << (int) data[i] << dec;
+ }
+
+ data += ev_size;
+
+ str << endl;
+ }
+
+ delete [] buf;
+}
+
+template<typename T>
+void
+MidiRingBuffer<T>::reset_tracker ()
+{
+ _tracker.reset ();
+}
+
+template<typename T>
+void
+MidiRingBuffer<T>::resolve_tracker (MidiBuffer& dst, framepos_t t)
+{
+ _tracker.resolve_notes (dst, t);
+}