allow to query export profile type
[ardour.git] / libs / ardour / midi_buffer.cc
index dc8deb7727a723ffd1f91e0209a4935db1756bba..41d638dc781fc84d221849bbefc5405344a3e1fc 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "ardour/debug.h"
 #include "ardour/midi_buffer.h"
+#include "ardour/port.h"
 
 using namespace std;
 using namespace ARDOUR;
@@ -35,6 +36,7 @@ using namespace PBD;
 MidiBuffer::MidiBuffer(size_t capacity)
        : Buffer (DataType::MIDI)
        , _data (0)
+       , _size (0)
 {
        if (capacity) {
                resize (capacity);
@@ -78,6 +80,14 @@ MidiBuffer::copy(const MidiBuffer& copy)
        memcpy(_data, copy._data, copy._size);
 }
 
+void
+MidiBuffer::copy(MidiBuffer const * const copy)
+{
+       assert(_capacity >= copy->size ());
+       _size = copy->size ();
+       memcpy(_data, copy->data(), _size);
+}
+
 
 /** Read events from @a src starting at time @a offset into the START of this buffer, for
  * time duration @a nframes.  Relative time, where 0 = start of buffer.
@@ -85,7 +95,7 @@ MidiBuffer::copy(const MidiBuffer& copy)
  * Note that offset and nframes refer to sample time, NOT buffer offsets or event counts.
  */
 void
-MidiBuffer::read_from (const Buffer& src, framecnt_t nframes, framecnt_t dst_offset, framecnt_t src_offset)
+MidiBuffer::read_from (const Buffer& src, framecnt_t nframes, framecnt_t dst_offset, framecnt_t /* src_offset*/)
 {
        assert (src.type() == DataType::MIDI);
        assert (&src != this);
@@ -99,15 +109,19 @@ MidiBuffer::read_from (const Buffer& src, framecnt_t nframes, framecnt_t dst_off
                assert (_size == 0);
        }
 
-       /* XXX use dst_offset somehow */
+       framecnt_t offset = Port::port_offset();
 
        for (MidiBuffer::const_iterator i = msrc.begin(); i != msrc.end(); ++i) {
                const Evoral::MIDIEvent<TimeType> ev(*i, false);
-               if (ev.time() >= src_offset && ev.time() < (nframes+src_offset)) {
+               if (ev.time() >= offset && ev.time() < (nframes + offset)) {
                        push_back (ev);
                } else {
                        cerr << "MIDI event @ " <<  ev.time() << " skipped, not within range "
-                            << src_offset << " .. " << (nframes + src_offset) << endl;
+                            << offset << " .. " << (nframes + offset) << ":";
+                               for (size_t xx = 0; xx < ev.size(); ++xx) {
+                                       cerr << ' ' << hex << (int) ev.buffer()[xx];
+                               }
+                               cerr << dec << endl;
                }
        }
 
@@ -135,26 +149,15 @@ MidiBuffer::merge_from (const Buffer& src, framecnt_t /*nframes*/, framecnt_t /*
 bool
 MidiBuffer::push_back(const Evoral::MIDIEvent<TimeType>& ev)
 {
-       const size_t stamp_size = sizeof(TimeType);
-
-       if (_size + stamp_size + ev.size() >= _capacity) {
-               cerr << "MidiBuffer::push_back failed (buffer is full)" << endl;
-               PBD::stacktrace (cerr, 20);
-               return false;
-       }
-
-       if (!Evoral::midi_event_is_valid(ev.buffer(), ev.size())) {
-               cerr << "WARNING: MidiBuffer ignoring illegal MIDI event" << endl;
-               return false;
-       }
-
-       push_back(ev.time(), ev.size(), ev.buffer());
-
-       return true;
+       return push_back (ev.time(), ev.size(), ev.buffer());
 }
 
 
-/** Push an event into the buffer.
+/** Push MIDI data into the buffer.
+ *
+ * Note that the raw MIDI pointed to by @param data will be COPIED and unmodified.
+ * That is, the caller still owns it, if it needs freeing it's Not My Problem(TM).
+ * Realtime safe.
  * @return false if operation failed (not enough room)
  */
 bool
@@ -178,14 +181,10 @@ MidiBuffer::push_back(TimeType time, size_t size, const uint8_t* data)
 #endif
 
        if (_size + stamp_size + size >= _capacity) {
-               cerr << "MidiBuffer::push_back2 failed (buffer is full; _size = " << _size << " capacity "
-                    << _capacity << " stamp " << stamp_size << " size = " << size << ")" << endl;
-               PBD::stacktrace (cerr, 20);
                return false;
        }
 
        if (!Evoral::midi_event_is_valid(data, size)) {
-               cerr << "WARNING: MidiBuffer ignoring illegal MIDI event" << endl;
                return false;
        }