fix all manner of wrongness with port buffer offsets
[ardour.git] / libs / ardour / midi_port.cc
index 40cb48f54fea229affd560232810bb27782496d1..75fd269cdee989f4e64fc28a1ccf863e4d242370 100644 (file)
@@ -39,7 +39,7 @@ MidiPort::~MidiPort()
 }
 
 void
-MidiPort::cycle_start (nframes_t nframes)
+MidiPort::cycle_start (pframes_t nframes)
 {
        _buffer->clear ();
        assert (_buffer->size () == 0);
@@ -50,7 +50,7 @@ MidiPort::cycle_start (nframes_t nframes)
 }
 
 MidiBuffer &
-MidiPort::get_midi_buffer (nframes_t nframes, nframes_t offset)
+MidiPort::get_midi_buffer (framecnt_t nframes)
 {
        if (_has_been_mixed_down) {
                return *_buffer;
@@ -59,7 +59,7 @@ MidiPort::get_midi_buffer (nframes_t nframes, nframes_t offset)
        if (receives_input ()) {
 
                void* jack_buffer = jack_port_get_buffer (_jack_port, nframes);
-               const nframes_t event_count = jack_midi_get_event_count(jack_buffer);
+               const pframes_t event_count = jack_midi_get_event_count(jack_buffer);
 
                assert (event_count < _buffer->capacity());
 
@@ -67,16 +67,21 @@ MidiPort::get_midi_buffer (nframes_t nframes, nframes_t offset)
                   into our MidiBuffer
                */
 
-               nframes_t off = offset + _port_offset;
-
-               for (nframes_t i = 0; i < event_count; ++i) {
+               for (pframes_t i = 0; i < event_count; ++i) {
 
                        jack_midi_event_t ev;
 
                        jack_midi_event_get (&ev, jack_buffer, i);
 
-                       if (ev.time > off && ev.time < off+nframes) {
+                        if (ev.buffer[0] == 0xfe) {
+                                /* throw away active sensing */
+                                continue;
+                        }
+
+                       if (ev.time >= _port_offset && ev.time < (_port_offset + nframes)) {
                                _buffer->push_back (ev);
+                       } else {
+                               cerr << "Dropping incoming MIDI at time " << ev.time << "; offset=" << _port_offset << " limit=" << (_port_offset + nframes) << "\n";
                        }
                }
 
@@ -97,7 +102,7 @@ MidiPort::get_midi_buffer (nframes_t nframes, nframes_t offset)
 
 
 void
-MidiPort::cycle_end (nframes_t /*nframes*/)
+MidiPort::cycle_end (pframes_t /*nframes*/)
 {
        _has_been_mixed_down = false;
 }
@@ -109,7 +114,7 @@ MidiPort::cycle_split ()
 }
 
 void
-MidiPort::flush_buffers (nframes_t nframes, nframes64_t time, nframes_t offset)
+MidiPort::flush_buffers (pframes_t nframes, framepos_t time)
 {
        if (sends_output ()) {
 
@@ -128,22 +133,18 @@ MidiPort::flush_buffers (nframes_t nframes, nframes64_t time, nframes_t offset)
                _resolve_in_process = false;
 
                for (MidiBuffer::iterator i = _buffer->begin(); i != _buffer->end(); ++i) {
-                       const Evoral::Event<nframes_t>& ev = *i;
+                       const Evoral::Event<framepos_t>& ev = *i;
 
                        // event times are in frames, relative to cycle start
 
-                       // XXX split cycle start or cycle start?
-
-                       assert(ev.time() < (nframes+offset+_port_offset));
+                       assert (ev.time() < (nframes + _port_offset));
 
-                       if (ev.time() >= offset + _port_offset) {
+                       if (ev.time() >= _port_offset) {
                                if (jack_midi_event_write (jack_buffer, (jack_nframes_t) ev.time(), ev.buffer(), ev.size()) != 0) {
-                                        cerr << "write failed, drop flushed note off on the floor, time " << ev.time() << " > " << offset << " + " << _port_offset 
-                                             << endl;                  
+                                        cerr << "write failed, drop flushed note off on the floor, time " << ev.time() << " > " << _port_offset << endl;
                                 }
                         } else {
-                                cerr << "drop flushed note off on the floor, time " << ev.time() << " > " << offset << " + " << _port_offset 
-                                     << endl;
+                                cerr << "drop flushed event on the floor, time " << ev.time() << " < " << _port_offset << endl;
                         }
                }
        }
@@ -156,8 +157,8 @@ MidiPort::transport_stopped ()
 }
 
 size_t
-MidiPort::raw_buffer_size (nframes_t nframes) const
+MidiPort::raw_buffer_size (pframes_t nframes) const
 {
-       return jack_midi_max_event_size(jack_port_get_buffer(_jack_port, nframes));
+       return jack_midi_max_event_size (jack_port_get_buffer (_jack_port, nframes));
 }