diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-04-11 16:20:35 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-04-11 16:20:35 +0000 |
commit | 82a664687c0267a28534d73a3c81183646de4102 (patch) | |
tree | 9a58ffa75ec116d0027733056948809ea587f2ea | |
parent | ccf19ae3cfd716fabc67f0cbf9f4327e3e46b30e (diff) |
improve/fix region boundary cache computation
git-svn-id: svn://localhost/ardour2/trunk@1700 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 110 |
1 files changed, 65 insertions, 45 deletions
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index c478f47bde..9c972d1fa7 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -461,9 +461,10 @@ void Editor::build_region_boundary_cache () { nframes_t pos = 0; - RegionPoint point; + vector<RegionPoint> interesting_points; boost::shared_ptr<Region> r; TrackViewList tracks; + bool at_end = false; region_boundary_cache.clear (); @@ -473,16 +474,17 @@ Editor::build_region_boundary_cache () switch (snap_type) { case SnapToRegionStart: - point = Start; + interesting_points.push_back (Start); break; case SnapToRegionEnd: - point = End; + interesting_points.push_back (End); break; case SnapToRegionSync: - point = SyncPoint; + interesting_points.push_back (SyncPoint); break; case SnapToRegionBoundary: - point = Start; + interesting_points.push_back (Start); + interesting_points.push_back (End); break; default: fatal << string_compose (_("build_region_boundary_cache called with snap_type = %1"), snap_type) << endmsg; @@ -491,62 +493,80 @@ Editor::build_region_boundary_cache () } TimeAxisView *ontrack = 0; + TrackViewList tlist; - while (pos < session->current_end_frame()) { + if (!selection->tracks.empty()) { + tlist = selection->tracks; + } else { + tlist = track_views; + } - if (!selection->tracks.empty()) { + while (pos < session->current_end_frame() && !at_end) { - if ((r = find_next_region (pos, point, 1, selection->tracks, &ontrack)) == 0) { - break; - } + nframes_t rpos; + nframes_t lpos = max_frames; - } else { + for (vector<RegionPoint>::iterator p = interesting_points.begin(); p != interesting_points.end(); ++p) { + + if ((r = find_next_region (pos, *p, 1, tlist, &ontrack)) == 0) { + at_end = true; + /* move to next point type */ + continue; + } - if ((r = find_next_region (pos, point, 1, track_views, &ontrack)) == 0) { + + switch (*p) { + case Start: + rpos = r->first_frame(); + break; + case End: + rpos = r->last_frame(); + break; + case SyncPoint: + rpos = r->adjust_to_sync (r->first_frame()); + break; + default: break; } - } + + float speed = 1.0f; + AudioTimeAxisView *atav; + + if (ontrack != 0 && (atav = dynamic_cast<AudioTimeAxisView*>(ontrack)) != 0 ) { + if (atav->get_diskstream() != 0) { + speed = atav->get_diskstream()->speed(); + } + } + + rpos = track_frame_to_session_frame (rpos, speed); - nframes_t rpos; - - switch (snap_type) { - case SnapToRegionStart: - rpos = r->first_frame(); - break; - case SnapToRegionEnd: - rpos = r->last_frame(); - break; - case SnapToRegionSync: - rpos = r->adjust_to_sync (r->first_frame()); - break; + if (rpos < lpos) { + lpos = rpos; + } - case SnapToRegionBoundary: - rpos = r->last_frame(); - break; - default: - break; - } - - float speed = 1.0f; - AudioTimeAxisView *atav; + /* prevent duplicates, but we don't use set<> because we want to be able + to sort later. + */ - if ( ontrack != 0 && (atav = dynamic_cast<AudioTimeAxisView*>(ontrack)) != 0 ) { - if (atav->get_diskstream() != 0) { - speed = atav->get_diskstream()->speed(); + vector<nframes_t>::iterator ri; + + for (ri = region_boundary_cache.begin(); ri != region_boundary_cache.end(); ++ri) { + if (*ri == rpos) { + break; + } } - } - - rpos = track_frame_to_session_frame(rpos, speed); - if (region_boundary_cache.empty() || rpos != region_boundary_cache.back()) { - if (snap_type == SnapToRegionBoundary) { - region_boundary_cache.push_back (r->first_frame()); + if (ri == region_boundary_cache.end()) { + region_boundary_cache.push_back (rpos); } - region_boundary_cache.push_back (rpos); } - pos = rpos + 1; + pos = lpos + 1; } + + /* finally sort to be sure that the order is correct */ + + sort (region_boundary_cache.begin(), region_boundary_cache.end()); } boost::shared_ptr<Region> |