hopefully fix the build, and actually use the options
[ardour.git] / libs / ardour / midi_buffer.cc
index 2a1426ab61f6b7b7242b60d6f56e288ba471338a..887545c6625e3b622de31d84fee25ab80db67f84 100644 (file)
@@ -27,7 +27,6 @@ using namespace ARDOUR;
 // FIXME: mirroring for MIDI buffers?
 MidiBuffer::MidiBuffer(size_t capacity)
        : Buffer(DataType::MIDI, capacity)
-       , _size(0)
        , _data(0)
 {
        if (capacity) {
@@ -100,6 +99,17 @@ MidiBuffer::read_from (const Buffer& src, nframes_t nframes, nframes_t dst_offse
        _silent = src.silent();
 }
 
+void
+MidiBuffer::merge_from (const Buffer& src, nframes_t nframes, nframes_t dst_offset, nframes_t src_offset)
+{
+       const MidiBuffer* mbuf = dynamic_cast<const MidiBuffer*>(&src);
+       assert (mbuf);
+       assert (mbuf != this);
+
+       /* XXX use nframes, and possible offsets */
+       merge_in_place (*mbuf);
+}
+
 /** Push an event into the buffer.
  *
  * Note that the raw MIDI pointed to by ev will be COPIED and unmodified.
@@ -124,11 +134,37 @@ MidiBuffer::push_back(const Evoral::MIDIEvent<TimeType>& ev)
                return false;
        }
 
+       push_back(ev.time(), ev.size(), ev.buffer());
+       
+       return true;
+}
+
+
+/** Push an event into the buffer.
+ * @return false if operation failed (not enough room)
+ */
+bool
+MidiBuffer::push_back(TimeType time, size_t size, const uint8_t* data)
+{
+       const size_t stamp_size = sizeof(TimeType);
+       /*cerr << "MidiBuffer: pushing event @ " << ev.time()
+               << " size = " << ev.size() << endl;*/
+       
+       if (_size + stamp_size + size >= _capacity) {
+               cerr << "MidiBuffer::push_back failed (buffer is full)" << endl;
+               return false;
+       }
+
+       if (!Evoral::midi_event_is_valid(data, size)) {
+               cerr << "WARNING: MidiBuffer ignoring illegal MIDI event" << endl;
+               return false;
+       }
+
        uint8_t* const write_loc = _data + _size;
-       *((TimeType*)write_loc) = ev.time();
-       memcpy(write_loc + stamp_size, ev.buffer(), ev.size());
+       *((TimeType*)write_loc) = time;
+       memcpy(write_loc + stamp_size, data, size);
 
-       _size += stamp_size + ev.size();
+       _size += stamp_size + size;
        _silent = false;
        
        return true;