From 05801cc3d62298453385eae40ea7692386bf7f84 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 15 May 2008 05:00:28 +0000 Subject: Eliminate excessive allocation (for every event) during MidiModel iteration. git-svn-id: svn://localhost/ardour2/branches/3.0@3351 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/canvas-program-change.cc | 37 ++++++++++++------------------------ gtk2_ardour/canvas-program-change.h | 1 - gtk2_ardour/midi_region_view.cc | 25 ++++++++++-------------- 3 files changed, 22 insertions(+), 41 deletions(-) (limited to 'gtk2_ardour') diff --git a/gtk2_ardour/canvas-program-change.cc b/gtk2_ardour/canvas-program-change.cc index ccaf333ef5..6f7182e2cd 100644 --- a/gtk2_ardour/canvas-program-change.cc +++ b/gtk2_ardour/canvas-program-change.cc @@ -12,19 +12,16 @@ CanvasProgramChange::CanvasProgramChange( double height, double x, double y) - : Group(parent, x, y), - _region(region), - _event(event), - _text(0), - _line(0), - _rect(0), - _widget(0) + : Group(parent, x, y) + , _region(region) + , _event(event) + , _text(0) + , _line(0) + , _rect(0) { - _text = new Text(*this); - assert(_text); - ostringstream pgm(ios::ate); - pgm << int(event->pgm_number()); - _text->property_text() = pgm.str(); + char pgm_str[4]; + snprintf(pgm_str, 4, "%d", (int)event->pgm_number()); + _text = new Text(*this, 0.0, 0.0, pgm_str); _text->property_justification() = Gtk::JUSTIFY_CENTER; _text->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiProgramChangeOutline.get(); double flagwidth = _text->property_text_width() + 10.0; @@ -39,22 +36,12 @@ CanvasProgramChange::CanvasProgramChange( _rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MidiProgramChangeFill.get(); _text->lower_to_bottom(); _text->raise(2); - assert(_widget == 0); - assert(_text != 0); - assert(_line != 0); - assert(_rect != 0); } CanvasProgramChange::~CanvasProgramChange() { - if(_line) - delete _line; - if(_rect) - delete _rect; - if(_text) - delete _text; - if(_widget) - delete _widget; + delete _line; + delete _rect; + delete _text; } - diff --git a/gtk2_ardour/canvas-program-change.h b/gtk2_ardour/canvas-program-change.h index 37dc0cc8da..3ac9b10383 100644 --- a/gtk2_ardour/canvas-program-change.h +++ b/gtk2_ardour/canvas-program-change.h @@ -33,7 +33,6 @@ private: Text* _text; SimpleLine* _line; SimpleRect* _rect; - Widget* _widget; }; } // namespace Canvas diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc index b70e1c7b08..b9af0a81a2 100644 --- a/gtk2_ardour/midi_region_view.cc +++ b/gtk2_ardour/midi_region_view.cc @@ -466,29 +466,28 @@ MidiRegionView::redisplay_model() << " velocity: " << int((*i)->velocity()) << endl; }*/ - - for (size_t i = 0; i < _model->n_notes(); ++i) { + for (size_t i = 0; i < _model->n_notes(); ++i) add_note(_model->note_at(i)); - } - for (Automatable::Controls::iterator - control = _model->controls().begin(); + // Draw program change 'flags' + for (Automatable::Controls::iterator control = _model->controls().begin(); control != _model->controls().end(); ++control) { - - if ( control->first.type() == MidiPgmChangeAutomation ) { + if (control->first.type() == MidiPgmChangeAutomation) { Glib::Mutex::Lock list_lock (control->second->list()->lock()); for (AutomationList::const_iterator event = control->second->list()->begin(); - event != control->second->list()->end(); ++event) { + event != control->second->list()->end(); ++event) { MidiControlIterator iter(control->second->list(), (*event)->when, (*event)->value); - add_pgm_change(_model->control_to_midi_event(iter)); + boost::shared_ptr event(new MIDI::Event()); + _model->control_to_midi_event(event, iter); + add_pgm_change(event); } break; } } - // Is this necessary ?????????? + // Is this necessary? /*for (Automatable::Controls::const_iterator i = _model->controls().begin(); i != _model->controls().end(); ++i) { @@ -821,12 +820,8 @@ MidiRegionView::add_pgm_change(boost::shared_ptr event) assert(event->time() >= 0); // dont display notes beyond the region bounds - if ( - event->time() - _region->start() >= _region->length() || - event->time() < _region->start() - ) { + if (event->time() - _region->start() >= _region->length() || event->time() < _region->start()) return; - } ArdourCanvas::Group* const group = (ArdourCanvas::Group*)get_canvas_group(); const double x = trackview.editor.frame_to_pixel((nframes_t)event->time() - _region->start()); -- cgit v1.2.3