From 3e4eaf39914df18dc4ef9fa188defd24c3000c90 Mon Sep 17 00:00:00 2001 From: nick_m Date: Thu, 2 Feb 2017 03:34:21 +1100 Subject: improve sysex data display. - don't add a new SysEx canvas item every time we zoom or drag. - speed up redisplay generally using PatchChange-like method for finding items (find_canvas_sys_ex() in boost::unordered_map). --- gtk2_ardour/midi_region_view.cc | 27 ++++++++++++++++++++------- gtk2_ardour/midi_region_view.h | 5 +++-- gtk2_ardour/sys_ex.cc | 14 ++++++++------ gtk2_ardour/sys_ex.h | 16 +++++++++------- 4 files changed, 40 insertions(+), 22 deletions(-) diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index 195cc6f828..a427424614 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -1144,6 +1144,18 @@ MidiRegionView::find_canvas_patch_change (MidiModel::PatchChangePtr p) return boost::shared_ptr(); } +boost::shared_ptr +MidiRegionView::find_canvas_sys_ex (MidiModel::SysExPtr s) +{ + SysExes::const_iterator f = _sys_exes.find (s); + + if (f != _sys_exes.end()) { + return f->second; + } + + return 0; +} + void MidiRegionView::get_events (Events& e, Evoral::Sequence::NoteOperator op, uint8_t val, int chan_mask) { @@ -1284,8 +1296,6 @@ MidiRegionView::redisplay_model() } } - _sys_exes.clear(); - display_sysexes(); display_patch_changes (); @@ -1377,7 +1387,8 @@ MidiRegionView::display_sysexes() } for (MidiModel::SysExes::const_iterator i = _model->sysexes().begin(); i != _model->sysexes().end(); ++i) { - Evoral::Beats time = (*i)->time(); + MidiModel::SysExPtr sysex_ptr = *i; + Evoral::Beats time = sysex_ptr->time(); if ((*i)->is_spp() || (*i)->is_mtc_quarter() || (*i)->is_mtc_full()) { if (!display_periodic_messages) { @@ -1401,9 +1412,13 @@ MidiRegionView::display_sysexes() // CAIROCANVAS: no longer passing *i (the sysex event) to the // SysEx canvas object!!! + boost::shared_ptr sysex = find_canvas_sys_ex (sysex_ptr); - boost::shared_ptr sysex = boost::shared_ptr( - new SysEx (*this, _note_group, text, height, x, 1.0)); + if (!sysex) { + sysex = boost::shared_ptr( + new SysEx (*this, _note_group, text, height, x, 1.0, sysex_ptr)); + _sys_exes.insert (make_pair (sysex_ptr, sysex)); + } // Show unless message is beyond the region bounds if (time - _region->start() >= _region->length() || time < _region->start()) { @@ -1411,8 +1426,6 @@ MidiRegionView::display_sysexes() } else { sysex->show(); } - - _sys_exes.push_back(sysex); } } diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h index 635307d4dd..929b3bd7f9 100644 --- a/gtk2_ardour/midi_region_view.h +++ b/gtk2_ardour/midi_region_view.h @@ -412,9 +412,9 @@ private: uint8_t _current_range_min; uint8_t _current_range_max; - typedef boost::unordered_map, NoteBase*> Events; + typedef boost::unordered_map, NoteBase*> Events; typedef boost::unordered_map > PatchChanges; - typedef std::vector< boost::shared_ptr > SysExes; + typedef boost::unordered_map > SysExes; typedef std::vector CopyDragEvents; ARDOUR::BeatsFramesConverter _region_relative_time_converter; @@ -466,6 +466,7 @@ private: Events::iterator _optimization_iterator; boost::shared_ptr find_canvas_patch_change (ARDOUR::MidiModel::PatchChangePtr p); + boost::shared_ptr find_canvas_sys_ex (ARDOUR::MidiModel::SysExPtr s); void update_note (NoteBase*, bool update_ghost_regions = true); void update_sustained (Note *, bool update_ghost_regions = true); diff --git a/gtk2_ardour/sys_ex.cc b/gtk2_ardour/sys_ex.cc index 6dab33e5cc..9b2f8c1d08 100644 --- a/gtk2_ardour/sys_ex.cc +++ b/gtk2_ardour/sys_ex.cc @@ -25,12 +25,14 @@ using namespace std; SysEx::SysEx ( - MidiRegionView& region, - ArdourCanvas::Container* parent, - string& text, - double height, - double x, - double y) + MidiRegionView& region, + ArdourCanvas::Container* parent, + string& text, + double height, + double x, + double y, + ARDOUR::MidiModel::SysExPtr sysex) + : _sysex (sysex) { _flag = new ArdourCanvas::Flag ( parent, diff --git a/gtk2_ardour/sys_ex.h b/gtk2_ardour/sys_ex.h index 12904827d5..de2a441014 100644 --- a/gtk2_ardour/sys_ex.h +++ b/gtk2_ardour/sys_ex.h @@ -20,7 +20,7 @@ #ifndef __SYSEX_H__ #define __SYSEX_H__ -class MidiRegionView; +#include "midi_region_view.h" namespace ArdourCanvas { class Flag; @@ -30,12 +30,13 @@ class SysEx { public: SysEx ( - MidiRegionView& region, - ArdourCanvas::Container* parent, - std::string& text, - double height, - double x, - double y); + MidiRegionView& region, + ArdourCanvas::Container* parent, + std::string& text, + double height, + double x, + double y, + ARDOUR::MidiModel::SysExPtr sysex); ~SysEx (); @@ -48,6 +49,7 @@ private: bool event_handler (GdkEvent* ev); SysEx(const SysEx& rhs){} ArdourCanvas::Flag* _flag; + ARDOUR::MidiModel::SysExPtr _sysex; }; #endif /* __SYSEX_H__ */ -- cgit v1.2.3