summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/rt_midibuffer.h
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2019-10-15 21:34:03 -0600
committerPaul Davis <paul@linuxaudiosystems.com>2019-11-02 16:32:18 -0600
commit088e4bca5a52157e5b8437c91360ccb24133aa1c (patch)
tree8275460e4b80584b3d5d1670421dd1e4bc76be64 /libs/ardour/ardour/rt_midibuffer.h
parente87e0ec0283674c3e649c1218822fa03c3fc9016 (diff)
reimplement RTMidiBuffer using a highly optimized data structure
Reduces load time of Glass MIDI piece with 48k note events by about 35%. Improves data locality. Omits size for all 3 byte or less MIDI events, uses implicit size. No limit on size of sysex. Relies on the fact that the data structure is always filled linearly in time, and never modified.
Diffstat (limited to 'libs/ardour/ardour/rt_midibuffer.h')
-rw-r--r--libs/ardour/ardour/rt_midibuffer.h32
1 files changed, 28 insertions, 4 deletions
diff --git a/libs/ardour/ardour/rt_midibuffer.h b/libs/ardour/ardour/rt_midibuffer.h
index 28d6e69233..da2c5c0e05 100644
--- a/libs/ardour/ardour/rt_midibuffer.h
+++ b/libs/ardour/ardour/rt_midibuffer.h
@@ -43,7 +43,7 @@ class LIBARDOUR_API RTMidiBuffer : public Evoral::EventSink<samplepos_t>
RTMidiBuffer (size_t capacity);
~RTMidiBuffer();
- void clear() { _size = 0; }
+ void clear();
void resize(size_t);
size_t size() const { return _size; }
@@ -52,12 +52,36 @@ class LIBARDOUR_API RTMidiBuffer : public Evoral::EventSink<samplepos_t>
void dump (uint32_t);
+ struct Item {
+ samplepos_t timestamp;
+ union {
+ uint8_t bytes[4];
+ uint32_t offset;
+ };
+ };
+
private:
+
+ struct Blob {
+ uint32_t size;
+ uint8_t data[0];
+ };
+
+ /* The main store. Holds Items (timestamp+up to 3 bytes of data OR
+ * offset into secondary storage below)
+ */
+
size_t _size;
size_t _capacity;
- uint8_t* _data; ///< event data
- typedef std::multimap<TimeType,size_t> Map;
- Map _map;
+ Item* _data;
+
+ /* secondary blob storage. Holds Blobs (arbitrary size + data) */
+
+ uint32_t alloc_blob (uint32_t size);
+ uint32_t store_blob (uint32_t size, uint8_t const * data);
+ uint32_t _pool_size;
+ uint32_t _pool_capacity;
+ uint8_t* _pool;
};
} // namespace ARDOUR