* 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
This commit is contained in:
Hans Baier 2008-05-11 20:23:17 +00:00
parent 7fd65ed78d
commit ddaaff4483
4 changed files with 15 additions and 2 deletions

View file

@ -399,7 +399,15 @@ MidiRingBuffer::read(MidiBuffer& dst, nframes_t start, nframes_t end, nframes_t
if (ev.time() >= start) { if (ev.time() >= start) {
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()); Byte* write_loc = dst.reserve(ev.time(), ev.size());
success = MidiRingBufferBase<Byte>::full_read(ev.size(), write_loc); success = MidiRingBufferBase<Byte>::full_read(ev.size(), write_loc);
if (success) { if (success) {

View file

@ -549,6 +549,7 @@ MidiDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_t
for (size_t i=0; i < to_write; ++i) { for (size_t i=0; i < to_write; ++i) {
const MIDI::Event& ev = *port_iter; const MIDI::Event& ev = *port_iter;
assert(ev.buffer());
_capture_buf->write(ev.time() + transport_frame, ev.size(), ev.buffer()); _capture_buf->write(ev.time() + transport_frame, ev.size(), ev.buffer());
++port_iter; ++port_iter;
} }

View file

@ -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) { while (_read_iter != end() && _read_iter->time() < start + nframes) {
assert(_read_iter->size()> 0); assert(_read_iter->size()> 0);
assert(_read_iter->buffer());
dst.write(_read_iter->time() + stamp_offset - negative_stamp_offset, dst.write(_read_iter->time() + stamp_offset - negative_stamp_offset,
_read_iter->size(), _read_iter->buffer()); _read_iter->size(), _read_iter->buffer());

View file

@ -572,7 +572,10 @@ MidiTrack::process_output_buffers (BufferSet& bufs,
} else { } else {
MidiBuffer& output_buf = bufs.get_midi(0); 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); 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, MidiTrack::write_controller_messages(MidiBuffer& output_buf, nframes_t start_frame, nframes_t end_frame,
nframes_t nframes, nframes_t offset) nframes_t nframes, nframes_t offset)
{ {
#if 0
BufferSet& mix_buffers = _session.get_mix_buffers(ChanCount(DataType::MIDI, 2)); BufferSet& mix_buffers = _session.get_mix_buffers(ChanCount(DataType::MIDI, 2));
/* FIXME: this could be more realtimey */ /* 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); MIDI::Event ev(0, 3, buf, false);
// Write track controller automation // Write track controller automation
#if 0
// This now lives in MidiModel. Any need for track automation like this? // This now lives in MidiModel. Any need for track automation like this?
// Relative Velocity? // Relative Velocity?
if (_session.transport_rolling()) { if (_session.transport_rolling()) {