Some improvements to performance with crossfades: don't recompute a whole track's...
authorCarl Hetherington <carl@carlh.net>
Sun, 23 Aug 2009 19:42:01 +0000 (19:42 +0000)
committerCarl Hetherington <carl@carlh.net>
Sun, 23 Aug 2009 19:42:01 +0000 (19:42 +0000)
when one region is moved and the display is overlaid; use a std::map for an AudioStreamView's crossfades
list so that add_crossfade can find whether a CrossfadeView already exists without looking through
the whole list.

git-svn-id: svn://localhost/ardour2/branches/3.0@5571 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/audio_streamview.cc
gtk2_ardour/audio_streamview.h
gtk2_ardour/crossfade_view.cc
gtk2_ardour/streamview.cc
libs/ardour/ardour/crossfade.h
libs/ardour/crossfade.cc

index e61bd6e7443544c4108ba7732d8702a2c794930d..99755d6a975ee215386aad7f63a84360b80e8af9 100644 (file)
@@ -77,7 +77,7 @@ AudioStreamView::set_samples_per_unit (gdouble spp)
        StreamView::set_samples_per_unit(spp);
 
        for (CrossfadeViewList::iterator xi = crossfade_views.begin(); xi != crossfade_views.end(); ++xi) {
-               (*xi)->set_samples_per_unit (spp);
+               xi->second->set_samples_per_unit (spp);
        }
 
        return 0;
@@ -207,15 +207,15 @@ AudioStreamView::remove_region_view (boost::weak_ptr<Region> weak_r)
 
        if (!_trackview.session().deletion_in_progress()) {
 
-               for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end();) {
-                       list<CrossfadeView*>::iterator tmp;
+               for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end();) {
+                       CrossfadeViewList::iterator tmp;
                        
                        tmp = i;
                        ++tmp;
                        
                        boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion>(r);
-                       if (ar && (*i)->crossfade->involves (ar)) {
-                               delete *i;
+                       if (ar && i->second->crossfade->involves (ar)) {
+                               delete i->second;
                                crossfade_views.erase (i);
                        }
                        
@@ -232,7 +232,7 @@ AudioStreamView::undisplay_diskstream ()
        StreamView::undisplay_diskstream();
 
        for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
-               delete *i;
+               delete i->second;
        }
 
        crossfade_views.clear ();
@@ -257,8 +257,8 @@ AudioStreamView::playlist_modified (boost::shared_ptr<Diskstream> ds)
        
        /* make sure xfades are on top and all the regionviews are stacked correctly. */
 
-       for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
-               (*i)->get_canvas_group()->raise_to_top();
+       for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
+               i->second->get_canvas_group()->raise_to_top();
        }
 }
 
@@ -311,17 +311,15 @@ AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade)
 
        /* first see if we already have a CrossfadeView for this Crossfade */
 
-       for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
-               if ((*i)->crossfade == crossfade) {
-
-                       if (!crossfades_visible || _layer_display == Stacked) {
-                               (*i)->hide();
-                       } else {
-                               (*i)->show ();
-                       }
-                       (*i)->set_valid (true);
-                       return;
+       CrossfadeViewList::iterator i = crossfade_views.find (crossfade);
+       if (i != crossfade_views.end()) {
+               if (!crossfades_visible || _layer_display == Stacked) {
+                       i->second->hide();
+               } else {
+                       i->second->show ();
                }
+               i->second->set_valid (true);
+               return;
        }
 
        /* create a new one */
@@ -345,7 +343,7 @@ AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade)
                                               *lview, *rview);
        cv->set_valid (true);
        crossfade->Invalidated.connect (mem_fun (*this, &AudioStreamView::remove_crossfade));
-       crossfade_views.push_back (cv);
+       crossfade_views[cv->crossfade] = cv;
        if (!_trackview.session().config.get_xfades_visible() || !crossfades_visible || _layer_display == Stacked) {
                cv->hide ();
        }
@@ -358,9 +356,9 @@ AudioStreamView::remove_crossfade (boost::shared_ptr<Region> r)
 
        boost::shared_ptr<Crossfade> xfade = boost::dynamic_pointer_cast<Crossfade> (r);
 
-       for (list<CrossfadeView*>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
-               if ((*i)->crossfade == xfade) {
-                       delete *i;
+       for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
+               if (i->second->crossfade == xfade) {
+                       delete i->second;
                        crossfade_views.erase (i);
                        break;
                }
@@ -371,7 +369,7 @@ void
 AudioStreamView::redisplay_diskstream ()
 {
        list<RegionView *>::iterator i;
-       list<CrossfadeView*>::iterator xi, tmpx;
+       CrossfadeViewList::iterator xi, tmpx;
 
        // Flag region views as invalid and disable drawing
        for (i = region_views.begin(); i != region_views.end(); ++i) {
@@ -381,9 +379,9 @@ AudioStreamView::redisplay_diskstream ()
 
        // Flag crossfade views as invalid
        for (xi = crossfade_views.begin(); xi != crossfade_views.end(); ++xi) {
-               (*xi)->set_valid (false);
-               if ((*xi)->visible() && _layer_display != Stacked) {
-                       (*xi)->show ();
+               xi->second->set_valid (false);
+               if (xi->second->visible() && _layer_display != Stacked) {
+                       xi->second->show ();
                }
        }
 
@@ -408,8 +406,8 @@ AudioStreamView::redisplay_diskstream ()
                tmpx = xi;
                tmpx++;
 
-               if (!(*xi)->valid()) {
-                       delete *xi;
+               if (!xi->second->valid()) {
+                       delete xi->second;
                        crossfade_views.erase (xi);
                }
 
@@ -611,8 +609,8 @@ AudioStreamView::setup_rec_box ()
 void
 AudioStreamView::foreach_crossfadeview (void (CrossfadeView::*pmf)(void))
 {
-       for (list<CrossfadeView*>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
-               ((*i)->*pmf) ();
+       for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
+               (i->second->*pmf) ();
        }
 }
 
@@ -762,9 +760,9 @@ AudioStreamView::hide_all_xfades ()
 void
 AudioStreamView::hide_xfades_involving (AudioRegionView& rv)
 {
-       for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
-               if ((*i)->crossfade->involves (rv.audio_region())) {
-                       (*i)->fake_hide ();
+       for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
+               if (i->second->crossfade->involves (rv.audio_region())) {
+                       i->second->fake_hide ();
                }
        }
 }
@@ -772,9 +770,9 @@ AudioStreamView::hide_xfades_involving (AudioRegionView& rv)
 void
 AudioStreamView::reveal_xfades_involving (AudioRegionView& rv)
 {
-       for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
-               if ((*i)->crossfade->involves (rv.audio_region()) && (*i)->visible() && _layer_display != Stacked) {
-                       (*i)->show ();
+       for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
+               if (i->second->crossfade->involves (rv.audio_region()) && i->second->visible() && _layer_display != Stacked) {
+                       i->second->show ();
                }
        }
 }
@@ -804,10 +802,10 @@ AudioStreamView::update_contents_height ()
        
        for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
                if (_layer_display == Overlaid) {
-                       (*i)->show ();
-                       (*i)->set_height (height);
+                       i->second->show ();
+                       i->second->set_height (height);
                } else {
-                       (*i)->hide ();
+                       i->second->hide ();
                }
        }
 }
index 1c5265f193d110f2946984854be5bb671aa76bdd..19254c03125a0e009d0fda9a1b7470b1a7f73830 100644 (file)
@@ -107,7 +107,7 @@ class AudioStreamView : public StreamView
        
        double _amplitude_above_axis;
        
-       typedef std::list<CrossfadeView*> CrossfadeViewList;
+       typedef std::map<boost::shared_ptr<ARDOUR::Crossfade>, CrossfadeView*> CrossfadeViewList;
        CrossfadeViewList crossfade_views;
        bool              crossfades_visible;
 
index 63c2115b87427842865f217bf9985fdec173d538..521c33240a817b6260337cfc9dc1a72b3e74a5cb 100644 (file)
@@ -126,7 +126,10 @@ CrossfadeView::crossfade_changed (Change what_changed)
        if (what_changed & BoundsChanged) {
                set_position (crossfade->position(), this);
                set_duration (crossfade->length(), this);
-               need_redraw_curves = true;
+
+               /* set_duration will call reset_width_dependent_items which in turn will call redraw_curves via active_changed,
+                  so no need for us to call it */
+               need_redraw_curves = false;
        }
 
        if (what_changed & Crossfade::FollowOverlapChanged) {
index 35b8576a48eee9deb94302da5f89373a0f49de32..4a10708e8c818145bd795bb6884645656c8f21ae 100644 (file)
@@ -312,7 +312,7 @@ StreamView::playlist_modified (boost::shared_ptr<Diskstream> ds)
        ENSURE_GUI_THREAD (bind (mem_fun (*this, &StreamView::playlist_modified_weak), ds));
 
        /* update layers count and the y positions and heights of our regions */
-       if (ds->playlist()) {
+       if (ds->playlist() && _layer_display == Stacked) {
                _layers = ds->playlist()->top_layer() + 1;
                update_contents_height ();
                update_coverage_frames ();
index 4afa38126c9c6a0e7ed87c10cc366fc0a2e6e19c..9e1e39bb1452e9cbee962706cd59f45acd0fbd8f 100644 (file)
@@ -106,8 +106,6 @@ class Crossfade : public ARDOUR::AudioRegion
 
        nframes_t overlap_length() const;
 
-       void invalidate();
-
        sigc::signal<void,boost::shared_ptr<Region> > Invalidated;
        sigc::signal<void,Change>     StateChanged;
 
index 2f0d66f8fba93439aebe08a692e78e695d97ff77..86d509ec664c9799192ff859563852ace9c16f8e 100644 (file)
@@ -408,7 +408,7 @@ Crossfade::refresh ()
 
        int32_t new_layer_relation = (int32_t) (_in->layer() - _out->layer());
 
-       if (new_layer_relation * layer_relation < 0) { // different sign, layers rotated 
+       if (new_layer_relation * layer_relation < 0) { // different sign, layers rotated
                Invalidated (shared_from_this ());
                return false;
        }
@@ -438,7 +438,6 @@ Crossfade::refresh ()
                        send_signal = true;
 
                } else {
-
                        Invalidated (shared_from_this ());
                        return false;
                }
@@ -926,9 +925,3 @@ Crossfade::set_short_xfade_length (nframes_t n)
 {
        _short_xfade_length = n;
 }
-
-void
-Crossfade::invalidate ()
-{
-       Invalidated (shared_from_this ()); /* EMIT SIGNAL */
-}