summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-02-16 00:53:26 +0000
committerDavid Robillard <d@drobilla.net>2009-02-16 00:53:26 +0000
commitfd1a3cfa4cd302a0ce0dbe97810dadb69f323ce6 (patch)
treeadee113bb75bd025dfa9a4d0acc2bf1927084578 /libs
parent85ab34179583db06899105586e7ac2d264b437fb (diff)
Gracefully ignore illegal MIDI events at the buffer level (i.e. from Jack).
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
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/midi_source.h3
-rw-r--r--libs/ardour/ardour/midi_track.h1
-rw-r--r--libs/ardour/midi_buffer.cc13
-rw-r--r--libs/ardour/midi_track.cc8
-rw-r--r--libs/evoral/src/SMF.cpp2
-rw-r--r--libs/evoral/src/Sequence.cpp2
6 files changed, 19 insertions, 10 deletions
diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h
index 9e01881186..3f8ed82310 100644
--- a/libs/ardour/ardour/midi_source.h
+++ b/libs/ardour/ardour/midi_source.h
@@ -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;
diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h
index d4054066f1..04f3d055c3 100644
--- a/libs/ardour/ardour/midi_track.h
+++ b/libs/ardour/ardour/midi_track.h
@@ -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);
diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc
index b0e46f8ad1..8a7d67e2e6 100644
--- a/libs/ardour/midi_buffer.cc
+++ b/libs/ardour/midi_buffer.cc
@@ -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;
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index 946ac3440b..aff7ed4d15 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -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);
}
diff --git a/libs/evoral/src/SMF.cpp b/libs/evoral/src/SMF.cpp
index 17c94924f8..d7d052e3f0 100644
--- a/libs/evoral/src/SMF.cpp
+++ b/libs/evoral/src/SMF.cpp
@@ -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;
}
diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp
index ee5fabccb8..ac0ca231f1 100644
--- a/libs/evoral/src/Sequence.cpp
+++ b/libs/evoral/src/Sequence.cpp
@@ -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;
}