do not crash when loading old history files with MIDI edits; add all notes in region...
[ardour.git] / libs / ardour / playlist.cc
index f74eb1001f01ff8daa412ff2a665101b50043ba6..cd53f35d95d7772ff26917c235f23b61fde229e2 100644 (file)
@@ -1418,7 +1418,38 @@ Playlist::top_region_at (nframes_t frame)
 
        delete rlist;
        return region;
-}      
+}
+
+boost::shared_ptr<Region>
+Playlist::top_unmuted_region_at (nframes_t frame)
+
+{
+       RegionLock rlock (this);
+       RegionList *rlist = find_regions_at (frame);
+
+       for (RegionList::iterator i = rlist->begin(); i != rlist->end(); ) {
+
+               RegionList::iterator tmp = i;
+               ++tmp;
+
+               if ((*i)->muted()) {
+                       rlist->erase (i);
+               }
+
+               i = tmp;
+       }
+       
+       boost::shared_ptr<Region> region;
+       
+       if (rlist->size()) {
+               RegionSortByLayer cmp;
+               rlist->sort (cmp);
+               region = rlist->back();
+       } 
+
+       delete rlist;
+       return region;
+}
 
 Playlist::RegionList*
 Playlist::regions_to_read (nframes_t start, nframes_t end)
@@ -1968,7 +1999,7 @@ Playlist::relayer ()
        /* don't send multiple Modified notifications
           when multiple regions are relayered.
        */
+
        freeze ();
 
        /* Build up a new list of regions on each layer, stored in a set of lists
@@ -1988,7 +2019,7 @@ Playlist::relayer ()
        }
 
        /* hence the size of each time division */
-       double const division_size = (end - start) / divisions;
+       double const division_size = (end - start) / double (divisions);
 
        vector<vector<RegionList> > layers;
        layers.push_back (vector<RegionList> (divisions));
@@ -2023,6 +2054,8 @@ Playlist::relayer ()
                        end_division--;
                }
 
+               assert (end_division < divisions);
+
                /* find the lowest layer that this region can go on */
                size_t j = layers.size();
                while (j > 0) {