summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-04-11 16:20:35 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-04-11 16:20:35 +0000
commit82a664687c0267a28534d73a3c81183646de4102 (patch)
tree9a58ffa75ec116d0027733056948809ea587f2ea
parentccf19ae3cfd716fabc67f0cbf9f4327e3e46b30e (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.cc110
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>