simpler approach for Apple setrlimit() compatibility issue
[ardour.git] / libs / ardour / midi_state_tracker.cc
index 5e99c35294bab4745b8a8add5204cece6f4e7718..afe6f07db7438ea35c2293489bdd46d4ae3e5f38 100644 (file)
@@ -84,13 +84,31 @@ MidiStateTracker::remove (uint8_t note, uint8_t chn)
 }
 
 void
-MidiStateTracker::track (const MidiBuffer::iterator &from, const MidiBuffer::iterator &to)
+MidiStateTracker::track (const MidiBuffer::const_iterator &from, const MidiBuffer::const_iterator &to)
 {
-       for (MidiBuffer::iterator i = from; i != to; ++i) {
+       for (MidiBuffer::const_iterator i = from; i != to; ++i) {
                track(*i);
        }
 }
 
+void
+MidiStateTracker::track (const uint8_t* evbuf)
+{
+       const uint8_t type = evbuf[0] & 0xF0;
+       const uint8_t chan = evbuf[0] & 0x0F;
+       switch (type) {
+       case MIDI_CTL_ALL_NOTES_OFF:
+               reset();
+               break;
+       case MIDI_CMD_NOTE_ON:
+               add(evbuf[1], chan);
+               break;
+       case MIDI_CMD_NOTE_OFF:
+               remove(evbuf[1], chan);
+               break;
+       }
+}
+
 void
 MidiStateTracker::resolve_notes (MidiBuffer &dst, framepos_t time)
 {
@@ -173,7 +191,7 @@ MidiStateTracker::resolve_notes (MidiSource& src, Evoral::MusicalTime time)
                                                                                       this, (int) note, (int) channel, time));
                                _active_notes[note + 128 * channel]--;
                                /* don't stack events up at the same time */
-                               time += 1.0/128.0;
+                               time += Evoral::MusicalTime::tick();
                        }
                }
        }