diff options
author | David Robillard <d@drobilla.net> | 2008-12-27 19:52:02 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-12-27 19:52:02 +0000 |
commit | 8cbbfa41592b2627d24d5605a62db7e5559df457 (patch) | |
tree | 872ed9d13e7f52a40247c222b773db9c0a6d436f /libs/ardour/midi_buffer.cc | |
parent | 487de9741b431cd766b2a7c80796c013f49a49f5 (diff) |
Fix immediate event delivery (panic button, controller sliders, etc).
git-svn-id: svn://localhost/ardour2/branches/3.0@4353 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/midi_buffer.cc')
-rw-r--r-- | libs/ardour/midi_buffer.cc | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc index ae370cdef7..705b94f422 100644 --- a/libs/ardour/midi_buffer.cc +++ b/libs/ardour/midi_buffer.cc @@ -96,7 +96,7 @@ MidiBuffer::copy(const MidiBuffer& copy) /** Read events from @a src starting at time @a offset into the START of this buffer, for - * time direction @a nframes. Relative time, where 0 = start of buffer. + * time duration @a nframes. Relative time, where 0 = start of buffer. * * Note that offset and nframes refer to sample time, NOT buffer offsets or event counts. */ @@ -118,13 +118,16 @@ MidiBuffer::read_from(const Buffer& src, nframes_t nframes, nframes_t offset) // FIXME: slow for (size_t i=0; i < msrc.size(); ++i) { const Evoral::MIDIEvent& ev = msrc[i]; - if (ev.time() < offset) - continue; - if (ev.time() < (nframes + offset)) { - //cout << "MidiBuffer::read_from got event, " << int(ev.type()) << " time: " << ev.time() << " buffer size: " << _size << endl; + //cout << "MidiBuffer::read_from event type: " << int(ev.type()) + // << " time: " << ev.time() << " buffer size: " << _size << endl; + if (ev.time() < offset) { + //cout << "MidiBuffer::read_from skipped event before " << offset << endl; + } else if (ev.time() < (nframes + offset)) { + //cout << "MidiBuffer::read_from appending event" << endl; push_back(ev); } else { - cerr << "MidiBuffer event out of range, " << ev.time() << endl; + //cerr << "MidiBuffer::read_from skipped event after " + // << nframes << " + " << offset << endl; } } @@ -142,18 +145,25 @@ MidiBuffer::read_from(const Buffer& src, nframes_t nframes, nframes_t offset) bool MidiBuffer::push_back(const Evoral::MIDIEvent& ev) { - if (_size == _capacity) + if (_size == _capacity) { + cerr << "MidiBuffer::push_back failed (buffer is full)" << endl; return false; + } uint8_t* const write_loc = _data + (_size * MAX_EVENT_SIZE); memcpy(write_loc, ev.buffer(), ev.size()); _events[_size] = ev; _events[_size].set_buffer(ev.size(), write_loc, false); - ++_size; - //cerr << "MidiBuffer: pushed, size = " << _size << endl; + /*cerr << "MidiBuffer: pushed @ " << _events[_size].time() + << " size = " << _size << endl; + for (size_t i = 0; i < _events[_size].size(); ++i) { + printf("%X ", _events[_size].buffer()[i]); + } + printf("\n");*/ + ++_size; _silent = false; return true; @@ -170,18 +180,25 @@ MidiBuffer::push_back(const Evoral::MIDIEvent& ev) bool MidiBuffer::push_back(const jack_midi_event_t& ev) { - if (_size == _capacity) + if (_size == _capacity) { + cerr << "MidiBuffer::push_back failed (buffer is full)" << endl; return false; + } uint8_t* const write_loc = _data + (_size * MAX_EVENT_SIZE); memcpy(write_loc, ev.buffer, ev.size); _events[_size].time() = (double)ev.time; _events[_size].set_buffer(ev.size, write_loc, false); - ++_size; - - //cerr << "MidiBuffer: pushed, size = " << _size << endl; + /*cerr << "MidiBuffer: pushed @ " << _events[_size].time() + << " size = " << _size << endl; + for (size_t i = 0; i < _events[_size].size(); ++i) { + printf("%X ", _events[_size].buffer()[i]); + } + printf("\n");*/ + + ++_size; _silent = false; return true; |