Add metadata file with DOAP and LV2 Host Info information.
[ardour.git] / libs / ardour / region.cc
index e1bc5c088348a3a2b838a197c446480d7c066185..20c87fb1defc3c1f43827e44279389bfedf2f2bd 100644 (file)
@@ -298,7 +298,7 @@ Region::Region (const SourceList& srcs, const XMLNode& node)
 {
        use_sources (srcs);
 
-       if (set_state (node)) {
+       if (set_state (node, Stateful::loading_state_version)) {
                throw failed_constructor();
        }
 
@@ -328,7 +328,7 @@ Region::Region (boost::shared_ptr<Source> src, const XMLNode& node)
 {
        _sources.push_back (src);
 
-       if (set_state (node)) {
+       if (set_state (node, Stateful::loading_state_version)) {
                throw failed_constructor();
        }
 
@@ -338,17 +338,6 @@ Region::Region (boost::shared_ptr<Source> src, const XMLNode& node)
 
 Region::~Region ()
 {
-       boost::shared_ptr<Playlist> pl (playlist());
-
-       if (pl) {
-               for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
-                       (*i)->remove_playlist (pl);
-               }
-               for (SourceList::const_iterator i = _master_sources.begin(); i != _master_sources.end(); ++i) {
-                       (*i)->remove_playlist (pl);
-               }
-       }
-
        notify_callbacks ();
        GoingAway (); /* EMIT SIGNAL */
 }
@@ -383,44 +372,7 @@ Region::copy_stuff (boost::shared_ptr<const Region> other, nframes_t /*offset*/,
 void
 Region::set_playlist (boost::weak_ptr<Playlist> wpl)
 {
-       boost::shared_ptr<Playlist> old_playlist = (_playlist.lock());
-
-       boost::shared_ptr<Playlist> pl (wpl.lock());
-
-       if (old_playlist == pl) {
-               return;
-       }
-
-       _playlist = pl;
-
-       if (pl) {
-               if (old_playlist) {
-                       for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
-                               (*i)->remove_playlist (_playlist);
-                               (*i)->add_playlist (pl);
-                       }
-                       for (SourceList::const_iterator i = _master_sources.begin(); i != _master_sources.end(); ++i) {
-                               (*i)->remove_playlist (_playlist);
-                               (*i)->add_playlist (pl);
-                       }
-               } else {
-                       for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
-                               (*i)->add_playlist (pl);
-                       }
-                       for (SourceList::const_iterator i = _master_sources.begin(); i != _master_sources.end(); ++i) {
-                               (*i)->add_playlist (pl);
-                       }
-               }
-       } else {
-               if (old_playlist) {
-                       for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
-                               (*i)->remove_playlist (old_playlist);
-                       }
-                       for (SourceList::const_iterator i = _master_sources.begin(); i != _master_sources.end(); ++i) {
-                               (*i)->remove_playlist (old_playlist);
-                       }
-               }
-       }
+       _playlist = wpl.lock();
 }
 
 bool
@@ -487,7 +439,7 @@ Region::first_edit ()
 
        if (_first_edit != EditChangesNothing && pl) {
 
-               _name = pl->session().new_region_name (_name);
+               _name = _session.new_region_name (_name);
                _first_edit = EditChangesNothing;
 
                send_change (ARDOUR::NameChanged);
@@ -554,7 +506,7 @@ Region::set_position_lock_style (PositionLockStyle ps)
        _positional_lock_style = ps;
 
        if (_positional_lock_style == MusicTime) {
-               pl->session().tempo_map().bbt_time (_position, _bbt_time);
+               _session.tempo_map().bbt_time (_position, _bbt_time);
        }
 
 }
@@ -568,13 +520,13 @@ Region::update_position_after_tempo_map_change ()
                return;
        }
 
-       TempoMap& map (pl->session().tempo_map());
+       TempoMap& map (_session.tempo_map());
        nframes_t pos = map.frame_time (_bbt_time);
        set_position_internal (pos, false);
 }
 
 void
-Region::set_position (nframes_t pos, void */*src*/)
+Region::set_position (nframes_t pos, void/*src*/)
 {
        if (!can_move()) {
                return;
@@ -616,7 +568,7 @@ Region::set_position_internal (nframes_t pos, bool allow_bbt_recompute)
 }
 
 void
-Region::set_position_on_top (nframes_t pos, void */*src*/)
+Region::set_position_on_top (nframes_t pos, void/*src*/)
 {
        if (_flags & Locked) {
                return;
@@ -644,15 +596,12 @@ void
 Region::recompute_position_from_lock_style ()
 {
        if (_positional_lock_style == MusicTime) {
-               boost::shared_ptr<Playlist> pl (playlist());
-               if (pl) {
-                       pl->session().tempo_map().bbt_time (_position, _bbt_time);
-               }
+               _session.tempo_map().bbt_time (_position, _bbt_time);
        }
 }
 
 void
-Region::nudge_position (nframes64_t n, void */*src*/)
+Region::nudge_position (nframes64_t n, void/*src*/)
 {
        if (_flags & Locked) {
                return;
@@ -691,7 +640,7 @@ Region::set_ancestral_data (nframes64_t s, nframes64_t l, float st, float sh)
 }
 
 void
-Region::set_start (nframes_t pos, void */*src*/)
+Region::set_start (nframes_t pos, void/*src*/)
 {
        if (_flags & (Locked|PositionLocked)) {
                return;
@@ -803,6 +752,10 @@ Region::trim_front (nframes_t new_position, void *src)
        }
 }
 
+/** @param new_endpoint New region end point, such that, for example,
+ *  a region at 0 of length 10 has an endpoint of 9.
+ */
+
 void
 Region::trim_end (nframes_t new_endpoint, void */*src*/)
 {
@@ -811,7 +764,7 @@ Region::trim_end (nframes_t new_endpoint, void */*src*/)
        }
 
        if (new_endpoint > _position) {
-               trim_to_internal (_position, new_endpoint - _position, this);
+               trim_to_internal (_position, new_endpoint - _position + 1, this);
                if (!_frozen) {
                        recompute_at_end ();
                }
@@ -977,9 +930,7 @@ Region::set_position_locked (bool yn)
 void
 Region::set_sync_position (nframes_t absolute_pos)
 {
-       nframes_t file_pos;
-
-       file_pos = _start + (absolute_pos - _position);
+       nframes_t const file_pos = _start + (absolute_pos - _position);
 
        if (file_pos != _sync_position) {
 
@@ -1172,7 +1123,7 @@ Region::get_state ()
 }
 
 int
-Region::set_live_state (const XMLNode& node, Change& what_changed, bool send)
+Region::set_live_state (const XMLNode& node, int /*version*/, Change& what_changed, bool send)
 {
        const XMLNodeList& nlist = node.children();
        const XMLProperty *prop;
@@ -1339,7 +1290,7 @@ Region::set_live_state (const XMLNode& node, Change& what_changed, bool send)
 }
 
 int
-Region::set_state (const XMLNode& node)
+Region::set_state (const XMLNode& node, int version)
 {
        const XMLProperty *prop;
        Change what_changed = Change (0);
@@ -1355,7 +1306,7 @@ Region::set_state (const XMLNode& node)
 
        _first_edit = EditChangesNothing;
 
-       set_live_state (node, what_changed, true);
+       set_live_state (node, version, what_changed, true);
 
        return 0;
 }
@@ -1513,6 +1464,17 @@ Region::source_equivalent (boost::shared_ptr<const Region> other) const
        return true;
 }
 
+bool
+Region::uses_source (boost::shared_ptr<const Source> source) const
+{
+       for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
+               if (*i == source) {
+                       return true;
+               }
+       }
+       return false;
+}
+
 sframes_t
 Region::source_length(uint32_t n) const
 {
@@ -1594,7 +1556,7 @@ Region::get_parent() const
                boost::shared_ptr<Region> r;
                boost::shared_ptr<Region const> grrr2 = boost::dynamic_pointer_cast<Region const> (shared_from_this());
 
-               if (grrr2 && (r = pl->session().find_whole_file_parent (grrr2))) {
+               if (grrr2 && (r = _session.find_whole_file_parent (grrr2))) {
                        return boost::static_pointer_cast<Region> (r);
                }
        }