Set encoder quality for existing ExportFormatSpecs
[ardour.git] / libs / ardour / midi_buffer.cc
index 3a03a03f9ee5b48545386b33be297664a5b00100..1be24ab801364f60f6e21de6b29861fab800ccfa 100644 (file)
@@ -80,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.
@@ -87,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, samplecnt_t nframes, sampleoffset_t dst_offset, sampleoffset_t /* src_offset*/)
 {
        assert (src.type() == DataType::MIDI);
        assert (&src != this);
@@ -101,19 +109,40 @@ MidiBuffer::read_from (const Buffer& src, framecnt_t nframes, framecnt_t dst_off
                assert (_size == 0);
        }
 
-       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() >= offset && ev.time() < (nframes + offset)) {
-                       push_back (ev);
+               const Evoral::Event<TimeType> ev(*i, false);
+
+               if (dst_offset >= 0) {
+                       /* Positive offset: shifting events from internal
+                          buffer view of time (always relative to to start of
+                          current possibly split cycle) to from global/port
+                          view of time (always relative to start of process
+                          cycle).
+
+                          Check it is within range of this (split) cycle, then shift.
+                       */
+                       if (ev.time() >= 0 && ev.time() < nframes) {
+                               push_back (ev.time() + dst_offset, ev.size(), ev.buffer());
+                       } else {
+                               cerr << "\t!!!! MIDI event @ " <<  ev.time() << " skipped, not within range 0 .. " << nframes << ": ";
+                       }
                } else {
-                       cerr << "MIDI event @ " <<  ev.time() << " skipped, not within range "
-                            << offset << " .. " << (nframes + offset) << ":";
-                               for (size_t xx = 0; xx < ev.size(); ++xx) {
-                                       cerr << ' ' << hex << (int) ev.buffer()[xx];
-                               }
-                               cerr << dec << endl;
+                       /* Negative offset: shifting events from global/port
+                          view of time (always relative to start of process
+                          cycle) back to internal buffer view of time (always
+                          relative to to start of current possibly split
+                          cycle.
+
+                          Shift first, then check it is within range of this
+                          (split) cycle.
+                       */
+                       const samplepos_t evtime = ev.time() + dst_offset;
+
+                       if (evtime >= 0 && evtime < nframes) {
+                               push_back (evtime, ev.size(), ev.buffer());
+                       } else {
+                               cerr << "\t!!!! MIDI event @ " <<  evtime << " (based on " << ev.time() << " + " << dst_offset << ") skipped, not within range 0 .. " << nframes << ": ";
+                       }
                }
        }
 
@@ -121,7 +150,7 @@ MidiBuffer::read_from (const Buffer& src, framecnt_t nframes, framecnt_t dst_off
 }
 
 void
-MidiBuffer::merge_from (const Buffer& src, framecnt_t /*nframes*/, framecnt_t /*dst_offset*/, framecnt_t /*src_offset*/)
+MidiBuffer::merge_from (const Buffer& src, samplecnt_t /*nframes*/, sampleoffset_t /*dst_offset*/, sampleoffset_t /*src_offset*/)
 {
        const MidiBuffer* mbuf = dynamic_cast<const MidiBuffer*>(&src);
        assert (mbuf);
@@ -139,7 +168,7 @@ MidiBuffer::merge_from (const Buffer& src, framecnt_t /*nframes*/, framecnt_t /*
  * @return false if operation failed (not enough room)
  */
 bool
-MidiBuffer::push_back(const Evoral::MIDIEvent<TimeType>& ev)
+MidiBuffer::push_back(const Evoral::Event<TimeType>& ev)
 {
        return push_back (ev.time(), ev.size(), ev.buffer());
 }
@@ -191,7 +220,7 @@ MidiBuffer::push_back(TimeType time, size_t size, const uint8_t* data)
 }
 
 bool
-MidiBuffer::insert_event(const Evoral::MIDIEvent<TimeType>& ev)
+MidiBuffer::insert_event(const Evoral::Event<TimeType>& ev)
 {
        if (size() == 0) {
                return push_back(ev);
@@ -244,7 +273,7 @@ MidiBuffer::insert_event(const Evoral::MIDIEvent<TimeType>& ev)
 uint32_t
 MidiBuffer::write(TimeType time, Evoral::EventType type, uint32_t size, const uint8_t* buf)
 {
-       insert_event(Evoral::MIDIEvent<TimeType>(type, time, size, const_cast<uint8_t*>(buf)));
+       insert_event(Evoral::Event<TimeType>(type, time, size, const_cast<uint8_t*>(buf)));
        return size;
 }
 
@@ -278,7 +307,7 @@ MidiBuffer::reserve(TimeType time, size_t size)
 
 
 void
-MidiBuffer::silence (framecnt_t /*nframes*/, framecnt_t /*offset*/)
+MidiBuffer::silence (samplecnt_t /*nframes*/, samplecnt_t /*offset*/)
 {
        /* XXX iterate over existing events, find all in range given by offset & nframes,
           and delete them.
@@ -572,4 +601,3 @@ MidiBuffer::merge_in_place (const MidiBuffer &other)
 
        return true;
 }
-