summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorHans Baier <hansfbaier@googlemail.com>2008-05-11 20:23:17 +0000
committerHans Baier <hansfbaier@googlemail.com>2008-05-11 20:23:17 +0000
commitddaaff448302bb5c3cda36d16b785b2eb3f269e2 (patch)
tree3bb0744734bd95067294d4c3b20d21b6a09abfd6 /libs
parent7fd65ed78de5f0e3e9dcb99a3aeb55bedd640daf (diff)
* Added a couple of guards to prevent MIDI::Events with NULL buffers to enter into ring buffers
git-svn-id: svn://localhost/ardour2/branches/3.0@3332 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/midi_ring_buffer.h8
-rw-r--r--libs/ardour/midi_diskstream.cc1
-rw-r--r--libs/ardour/midi_model.cc1
-rw-r--r--libs/ardour/midi_track.cc7
4 files changed, 15 insertions, 2 deletions
diff --git a/libs/ardour/ardour/midi_ring_buffer.h b/libs/ardour/ardour/midi_ring_buffer.h
index c817866600..aaad5769a3 100644
--- a/libs/ardour/ardour/midi_ring_buffer.h
+++ b/libs/ardour/ardour/midi_ring_buffer.h
@@ -399,7 +399,15 @@ MidiRingBuffer::read(MidiBuffer& dst, nframes_t start, nframes_t end, nframes_t
if (ev.time() >= start) {
ev.time() -= start;
+ // TODO: Right now there come MIDI Events with empty buffer
+ if(!ev.buffer()) {
+ std::cerr << "MidiRingBuffer::read WARNING: Skipping MIDI Event with NULL buffer pointer "
+ << " and length " << int(ev.size()) << std::endl;
+ return 0;
+ }
+
Byte* write_loc = dst.reserve(ev.time(), ev.size());
+
success = MidiRingBufferBase<Byte>::full_read(ev.size(), write_loc);
if (success) {
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 2e1647f507..6efa1abbae 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -549,6 +549,7 @@ MidiDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_t
for (size_t i=0; i < to_write; ++i) {
const MIDI::Event& ev = *port_iter;
+ assert(ev.buffer());
_capture_buf->write(ev.time() + transport_frame, ev.size(), ev.buffer());
++port_iter;
}
diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc
index 3cef80deb6..8a62eba8a6 100644
--- a/libs/ardour/midi_model.cc
+++ b/libs/ardour/midi_model.cc
@@ -312,6 +312,7 @@ size_t MidiModel::read(MidiRingBuffer& dst, nframes_t start, nframes_t nframes,
while (_read_iter != end() && _read_iter->time() < start + nframes) {
assert(_read_iter->size()> 0);
+ assert(_read_iter->buffer());
dst.write(_read_iter->time() + stamp_offset - negative_stamp_offset,
_read_iter->size(), _read_iter->buffer());
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index 6132d14dc8..ab13ad410c 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -572,7 +572,10 @@ MidiTrack::process_output_buffers (BufferSet& bufs,
} else {
MidiBuffer& output_buf = bufs.get_midi(0);
- write_controller_messages(output_buf, start_frame, end_frame, nframes, offset);
+ // TODO this crashes: (sends events with NULL buffer pointer)
+ // Is this necessary anyway here? Dont know.
+ //write_controller_messages(output_buf, start_frame, end_frame, nframes, offset);
+
deliver_output(bufs, start_frame, end_frame, nframes, offset);
}
}
@@ -581,6 +584,7 @@ void
MidiTrack::write_controller_messages(MidiBuffer& output_buf, nframes_t start_frame, nframes_t end_frame,
nframes_t nframes, nframes_t offset)
{
+#if 0
BufferSet& mix_buffers = _session.get_mix_buffers(ChanCount(DataType::MIDI, 2));
/* FIXME: this could be more realtimey */
@@ -594,7 +598,6 @@ MidiTrack::write_controller_messages(MidiBuffer& output_buf, nframes_t start_fra
MIDI::Event ev(0, 3, buf, false);
// Write track controller automation
-#if 0
// This now lives in MidiModel. Any need for track automation like this?
// Relative Velocity?
if (_session.transport_rolling()) {