put automation list into or out of Touch mode before adding an automation watch,...
[ardour.git] / libs / ardour / midi_ring_buffer.cc
index 4ad563eec9e9803dec3283ad4e5fbcc185c1830f..786ed3c080d33fb1f7b7748076896bf4a6ec7042 100644 (file)
 #include "ardour/event_type_map.h"
 
 using namespace std;
-using namespace ARDOUR;
 using namespace PBD;
 
+namespace ARDOUR {
+
 /** Read a block of MIDI events from this buffer into a MidiBuffer.
  *
  * Timestamps of events returned are relative to start (i.e. event with stamp 0
@@ -97,7 +98,9 @@ MidiRingBuffer<T>::read(MidiBuffer& dst, framepos_t start, framepos_t end, frame
                        break;
                } else if (ev_time + loop_offset < start) {
                        DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MRB event @ %1 before start @ %2\n", ev_time, start));
-                       break;
+                       this->increment_read_ptr (prefix_size);
+                       this->increment_read_ptr (ev_size);
+                       continue;
                } else {
                        DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MRB event @ %1 in range %2 .. %3\n", ev_time, start, end));
                }
@@ -192,6 +195,36 @@ MidiRingBuffer<T>::read(MidiBuffer& dst, framepos_t start, framepos_t end, frame
        return count;
 }
 
+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 = *((T*) peekbuf);
+               
+               if (ev_time >= end) {
+                       break;
+               }
+
+               ev_size = *((uint32_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)
@@ -279,3 +312,4 @@ MidiRingBuffer<T>::reset_tracker ()
 
 template class MidiRingBuffer<framepos_t>;
 
+}  // namespace ARDOUR