diff --git a/libs/ardour/ardour/port_engine_shared.h b/libs/ardour/ardour/port_engine_shared.h index 6dbd012961..9dd0004d59 100644 --- a/libs/ardour/ardour/port_engine_shared.h +++ b/libs/ardour/ardour/port_engine_shared.h @@ -121,6 +121,16 @@ private: }; // class BackendPort +class LIBARDOUR_API BackendMIDIEvent +{ +public: + virtual ~BackendMIDIEvent () {} + virtual size_t size () const = 0; + virtual pframes_t timestamp () const = 0; + virtual const uint8_t* data () const = 0; + bool operator< (const BackendMIDIEvent &other) const; +}; + class LIBARDOUR_API PortEngineSharedImpl { public: diff --git a/libs/ardour/port_engine_shared.cc b/libs/ardour/port_engine_shared.cc index 5aae77f2a4..a9c2accaf1 100644 --- a/libs/ardour/port_engine_shared.cc +++ b/libs/ardour/port_engine_shared.cc @@ -186,7 +186,85 @@ BackendPort::update_connected_latency (bool for_playback) set_latency_range (lr, for_playback); } +bool +BackendMIDIEvent::operator< (const BackendMIDIEvent &other) const { + if (timestamp() == other.timestamp ()) { + /* concurrent MIDI events, sort + * - CC first (may include bank/patch) + * - Program Change + * - Note Off + * - Note On + * - Note Pressure + * - Channel Pressure + * - Pitch Bend + * - SysEx/RT, etc + * + * see Evoral::Sequence