comment out debug trace output
[ardour.git] / libs / ardour / playlist.cc
index 2ff6c431d13449c530643c728c487c48812c24b1..39a6dc77ed01dbb2ad98e5a3267b1f468d2b0315 100644 (file)
 #include <algorithm>
 #include <string>
 
-#include <boost/lexical_cast.hpp>
-
 #include "pbd/types_convert.h"
 #include "pbd/stateful_diff_command.h"
 #include "pbd/strsplit.h"
 #include "pbd/xml++.h"
 
 #include "ardour/debug.h"
+#include "ardour/midi_region.h"
 #include "ardour/playlist.h"
-#include "ardour/session.h"
+#include "ardour/playlist_factory.h"
+#include "ardour/playlist_source.h"
 #include "ardour/region.h"
 #include "ardour/region_factory.h"
 #include "ardour/region_sorters.h"
-#include "ardour/playlist_factory.h"
-#include "ardour/playlist_source.h"
-#include "ardour/transient_detector.h"
-#include "ardour/types_convert.h"
+#include "ardour/session.h"
 #include "ardour/session_playlists.h"
 #include "ardour/source_factory.h"
+#include "ardour/tempo.h"
+#include "ardour/transient_detector.h"
+#include "ardour/types_convert.h"
 
 #include "pbd/i18n.h"
 
@@ -293,7 +293,7 @@ Playlist::copy_regions (RegionList& newlist) const
        RegionReadLock rlock (const_cast<Playlist *> (this));
 
        for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) {
-               newlist.push_back (RegionFactory::create (*i, true));
+               newlist.push_back (RegionFactory::create (*i, true, true));
        }
 }
 
@@ -362,11 +362,7 @@ Playlist::_set_sort_id ()
        } else {
                string t = _name.val().substr(dot_position + 1);
 
-               try {
-                       _sort_id = boost::lexical_cast<int>(t);
-               }
-
-               catch (boost::bad_lexical_cast e) {
+               if (!string_to_uint32 (t, _sort_id)) {
                        _sort_id = 0;
                }
        }
@@ -894,6 +890,20 @@ Playlist::partition (framepos_t start, framepos_t end, bool cut)
        }
 }
 
+/* If a MIDI region is locked to musical-time, Properties::start is ignored
+ * and _start is overwritten using Properties::start_beats in
+ * add_region_internal() -> Region::set_position() -> MidiRegion::set_position_internal()
+ */
+static void maybe_add_start_beats (TempoMap const& tm, PropertyList& plist, boost::shared_ptr<Region> r, framepos_t start, framepos_t end)
+{
+       boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(r);
+       if (!mr) {
+               return;
+       }
+       double delta_beats = tm.quarter_notes_between_frames (start, end);
+       plist.add (Properties::start_beats, mr->start_beats () + delta_beats);
+}
+
 /** Go through each region on the playlist and cut them at start and end, removing the section between
  *  start and end if cutting == true.  Regions that lie entirely within start and end are always
  *  removed.
@@ -986,8 +996,12 @@ Playlist::partition_internal (framepos_t start, framepos_t end, bool cutting, Re
                                        plist.add (Properties::automatic, true);
                                        plist.add (Properties::left_of_split, true);
                                        plist.add (Properties::right_of_split, true);
+                                       maybe_add_start_beats (_session.tempo_map(), plist, current, current->start(), current->start() + (pos2 - pos1));
 
-                                       region = RegionFactory::create (current, plist);
+                                       /* see note in :_split_region()
+                                        * for MusicFrame is needed to offset region-gain
+                                        */
+                                       region = RegionFactory::create (current, MusicFrame (pos2 - pos1, 0), plist);
                                        add_region_internal (region, start);
                                        new_regions.push_back (region);
                                }
@@ -1005,8 +1019,9 @@ Playlist::partition_internal (framepos_t start, framepos_t end, bool cutting, Re
                                plist.add (Properties::layering_index, current->layering_index ());
                                plist.add (Properties::automatic, true);
                                plist.add (Properties::right_of_split, true);
+                               maybe_add_start_beats (_session.tempo_map(), plist, current, current->start(), current->start() + (pos3 - pos1));
 
-                               region = RegionFactory::create (current, plist);
+                               region = RegionFactory::create (current, MusicFrame (pos3 - pos1, 0), plist);
 
                                add_region_internal (region, end);
                                new_regions.push_back (region);
@@ -1045,8 +1060,9 @@ Playlist::partition_internal (framepos_t start, framepos_t end, bool cutting, Re
                                        plist.add (Properties::layering_index, current->layering_index ());
                                        plist.add (Properties::automatic, true);
                                        plist.add (Properties::left_of_split, true);
+                                       maybe_add_start_beats (_session.tempo_map(), plist, current, current->start(), current->start() + (pos2 - pos1));
 
-                                       region = RegionFactory::create (current, plist);
+                                       region = RegionFactory::create (current, MusicFrame(pos2 - pos1, 0), plist);
 
                                        add_region_internal (region, start);
                                        new_regions.push_back (region);
@@ -1090,6 +1106,7 @@ Playlist::partition_internal (framepos_t start, framepos_t end, bool cutting, Re
                                        plist.add (Properties::layering_index, current->layering_index ());
                                        plist.add (Properties::automatic, true);
                                        plist.add (Properties::right_of_split, true);
+                                       maybe_add_start_beats (_session.tempo_map(), plist, current, current->start(), current->start());
 
                                        region = RegionFactory::create (current, plist);