diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2019-10-14 19:00:32 -0600 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2019-11-02 16:32:18 -0600 |
commit | 22da779322e742775eb8d1e22bdf8c16f20c16b2 (patch) | |
tree | 61327a4f3df2ff393600f78b4573a35d833dbea1 /libs/ardour/midi_buffer.cc | |
parent | cc949232fe39c4c0a8a0775ab9fc9284df3fb39a (diff) |
introduce new all-in-RAM MIDI datastructure and use it for MIDI playback
Diffstat (limited to 'libs/ardour/midi_buffer.cc')
-rw-r--r-- | libs/ardour/midi_buffer.cc | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc index f0f82a1e29..9196d84de5 100644 --- a/libs/ardour/midi_buffer.cc +++ b/libs/ardour/midi_buffer.cc @@ -53,7 +53,7 @@ MidiBuffer::~MidiBuffer() } void -MidiBuffer::resize(size_t size) +MidiBuffer::resize (size_t size) { if (_data && size < _capacity) { @@ -65,11 +65,15 @@ MidiBuffer::resize(size_t size) return; } - cache_aligned_free (_data); + uint8_t* old_data = _data; cache_aligned_malloc ((void**) &_data, size); - _size = 0; + if (_size) { + memcpy (_data, old_data, _size); + } + + cache_aligned_free (old_data); _capacity = size; assert(_data); @@ -222,6 +226,8 @@ MidiBuffer::push_back(TimeType time, size_t size, const uint8_t* data) return true; } +extern PBD::Timing minsert; + bool MidiBuffer::insert_event(const Evoral::Event<TimeType>& ev) { @@ -233,7 +239,7 @@ MidiBuffer::insert_event(const Evoral::Event<TimeType>& ev) const size_t bytes_to_merge = stamp_size + ev.size(); if (_size + bytes_to_merge >= _capacity) { - cerr << "MidiBuffer::push_back failed (buffer is full)" << endl; + cerr << string_compose ("MidiBuffer::push_back failed (buffer is full: size: %1 capacity %2 new bytes %3)", _size, _capacity, bytes_to_merge) << endl; PBD::stacktrace (cerr, 20); return false; } @@ -254,8 +260,10 @@ MidiBuffer::insert_event(const Evoral::Event<TimeType>& ev) insert_offset = m.offset; break; } + if (insert_offset == -1) { - return push_back(ev); + bool r = push_back(ev); + return r; } // don't use memmove - it may use malloc(!) @@ -280,6 +288,20 @@ MidiBuffer::write(TimeType time, Evoral::EventType type, uint32_t size, const ui return size; } +uint32_t +MidiBuffer::append(TimeType time, Evoral::EventType type, uint32_t size, const uint8_t* buf) +{ + const size_t bytes_to_merge = sizeof(TimeType) + size; + + if (_size + bytes_to_merge >= _capacity) { + resize (_capacity + 8192); + } + + return push_back (time, size, buf); +} + + + /** Reserve space for a new event in the buffer. * * This call is for copying MIDI directly into the buffer, the data location |