Some improvements to performance with crossfades: don't recompute a whole track's crossfade curves

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
This commit is contained in:
Carl Hetherington 2009-08-23 19:42:01 +00:00
parent dffd30baf9
commit c91da28eb2
6 changed files with 44 additions and 52 deletions

View 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 ();
}
}
}

View 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;

View 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) {

View 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 ();

View 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;

View 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 */
}