Gracefully ignore illegal MIDI events at the buffer level (i.e. from Jack).
authorDavid Robillard <d@drobilla.net>
Mon, 16 Feb 2009 00:53:26 +0000 (00:53 +0000)
committerDavid Robillard <d@drobilla.net>
Mon, 16 Feb 2009 00:53:26 +0000 (00:53 +0000)
Ardour should now be able to more or less tolerate crazy incoming MIDI (except for SYSEX).

git-svn-id: svn://localhost/ardour2/branches/3.0@4592 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/midi_source.h
libs/ardour/ardour/midi_track.h
libs/ardour/midi_buffer.cc
libs/ardour/midi_track.cc
libs/evoral/src/SMF.cpp
libs/evoral/src/Sequence.cpp

index 9e0188118612e1b8ddf6a578a2beec0d2d4ab54e..3f8ed82310e624baeaa0d0fa3dea99f072d8e506 100644 (file)
@@ -99,7 +99,8 @@ class MidiSource : public Source
   protected:
        virtual void flush_midi() = 0;
        
-       virtual nframes_t read_unlocked (MidiRingBuffer<nframes_t>& dst, nframes_t start, nframes_t cnt, nframes_t stamp_offset, nframes_t negative_stamp_offset) const = 0;
+       virtual nframes_t read_unlocked (MidiRingBuffer<nframes_t>& dst, nframes_t start, nframes_t cnt,
+                       nframes_t stamp_offset, nframes_t negative_stamp_offset) const = 0;
        virtual nframes_t write_unlocked (MidiRingBuffer<nframes_t>& dst, nframes_t cnt) = 0;
        
        mutable Glib::Mutex _lock;
index d4054066f1a546ce553c3f7d5e902399788e7b8e..04f3d055c3bc9514ac49b9130cb9d735c3f96549 100644 (file)
@@ -95,7 +95,6 @@ protected:
        int _set_state (const XMLNode&, bool call_base);
 
 private:
-
        void write_controller_messages(MidiBuffer& buf,
                        nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset);
 
index b0e46f8ad1a8cb03b625c52b532bb35d56ae8715..8a7d67e2e64aa7a2812d5cec5e0d45a9f29db4a9 100644 (file)
@@ -135,8 +135,12 @@ MidiBuffer::push_back(const Evoral::MIDIEvent<TimeType>& ev)
            << " stamp size: " << stamp_size << " \n";*/
        
        if (_size + stamp_size + ev.size() >= _capacity) {
-               cerr << "MidiBuffer::push_back failed (buffer is full)" 
-                    << endl;
+               cerr << "MidiBuffer::push_back failed (buffer is full)" << endl;
+               return false;
+       }
+
+       if (!Evoral::midi_event_is_valid(ev.buffer(), ev.size())) {
+               cerr << "WARNING: MidiBuffer ignoring illegal MIDI event" << endl;
                return false;
        }
 
@@ -166,6 +170,11 @@ MidiBuffer::push_back(const jack_midi_event_t& ev)
                cerr << "MidiBuffer::push_back failed (buffer is full)" << endl;
                return false;
        }
+       
+       if (!Evoral::midi_event_is_valid(ev.buffer, ev.size)) {
+               cerr << "WARNING: MidiBuffer ignoring illegal MIDI event" << endl;
+               return false;
+       }
 
        uint8_t* const write_loc = _data + _size;
        *((TimeType*)write_loc) = ev.time;
index 946ac3440bf0f86cfc90c6a1a4a5b37dd1b47664..aff7ed4d15745bc39bc12746aa544763edbe8747 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <pbd/enumwriter.h>
 #include <midi++/events.h>
+#include <evoral/midi_util.h>
 
 #include <ardour/midi_track.h>
 #include <ardour/midi_diskstream.h>
@@ -662,11 +663,10 @@ MidiTrack::midi_panic()
 bool
 MidiTrack::write_immediate_event(size_t size, const uint8_t* buf)
 {
-       /*printf("Write immediate event: ");
-       for (size_t i=0; i < size; ++i) {
-               printf("%X ", buf[i]);
+       if (!Evoral::midi_event_is_valid(buf, size)) {
+               cerr << "WARNING: Ignoring illegal immediate MIDI event" << endl;
+               return false;
        }
-       printf("\n");*/
        const uint32_t type = EventTypeMap::instance().midi_event_type(buf[0]);
        return (_immediate_events.write(0, type, size, buf) == size);
 }
index 17c94924f8c97a174cf26009a1adab01e3bdcac3..d7d052e3f07081ea73db054abce374ea48a66ad6 100644 (file)
@@ -228,7 +228,7 @@ SMF::append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf)
        } printf("\n");*/
 
        if (!midi_event_is_valid(buf, size)) {
-               cerr << "WARNING: Ignoring illegal MIDI event" << endl;
+               cerr << "WARNING: SMF ignoring illegal MIDI event" << endl;
                return;
        }
 
index ee5fabccb8b1a8e19ab57b373e2efeda3cfe0f90..ac0ca231f19b5479c2fed3de82b1827fae88b060 100644 (file)
@@ -581,7 +581,7 @@ Sequence<Time>::append(const Event<Time>& event)
        assert(_writing);
 
        if (!midi_event_is_valid(ev.buffer(), ev.size())) {
-               cerr << "WARNING: Ignoring illegal MIDI event" << endl;
+               cerr << "WARNING: Sequence ignoring illegal MIDI event" << endl;
                return;
        }