X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fregion.cc;h=5ff06e5076738dd39defca18a1004be272d12e33;hb=3a43e31d07434276a8c79561b1625b329ce6f2d5;hp=847a72b23fb04cbb9302d00bdac5f947a0002a2b;hpb=31d234b48c36bddb4d5228a3abee9c4419403879;p=ardour.git diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 847a72b23f..5ff06e5076 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -301,17 +301,6 @@ Region::Region (boost::shared_ptr other) _sync_position = _start; } - if (Profile->get_sae()) { - /* reset sync point to start if its ended up - outside region bounds. - */ - - if (_sync_position < _start || _sync_position >= _start + _length) { - _sync_marked = false; - _sync_position = _start; - } - } - assert (_type == other->data_type()); } @@ -360,17 +349,6 @@ Region::Region (boost::shared_ptr other, frameoffset_t offset) _sync_position = _start; } - if (Profile->get_sae()) { - /* reset sync point to start if its ended up - outside region bounds. - */ - - if (_sync_position < _start || _sync_position >= _start + _length) { - _sync_marked = false; - _sync_position = _start; - } - } - assert (_type == other->data_type()); } @@ -591,6 +569,44 @@ Region::set_position (framepos_t pos) } +/** A gui may need to create a region, then place it in an initial + * position determined by the user. + * When this takes place within one gui operation, we have to reset + * _last_position to prevent an implied move. + */ +void +Region::set_initial_position (framepos_t pos) +{ + if (!can_move()) { + return; + } + + if (_position != pos) { + _position = pos; + + /* check that the new _position wouldn't make the current + length impossible - if so, change the length. + + XXX is this the right thing to do? + */ + + if (max_framepos - _length < _position) { + _last_length = _length; + _length = max_framepos - _position; + } + + recompute_position_from_lock_style (); + /* ensure that this move doesn't cause a range move */ + _last_position = _position; + } + + + /* do this even if the position is the same. this helps out + a GUI that has moved its representation already. + */ + send_change (Properties::position); +} + void Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute) { @@ -599,7 +615,7 @@ Region::set_position_internal (framepos_t pos, bool allow_bbt_recompute) e.g. Playlist::notify_region_moved doesn't use an out-of-date last_position. */ _last_position = _position; - + if (_position != pos) { _position = pos; @@ -1138,7 +1154,7 @@ Region::state () XMLNode *node = new XMLNode ("Region"); char buf[64]; char buf2[64]; - LocaleGuard lg (X_("POSIX")); + LocaleGuard lg (X_("C")); const char* fe = NULL; /* custom version of 'add_properties (*node);' @@ -1284,6 +1300,10 @@ Region::_set_state (const XMLNode& node, int /*version*/, PropertyChange& what_c } } + // saved property is invalid, region-transients are not saved + if (_transients.size() == 0){ + _valid_transients = false; + } return 0; } @@ -1490,6 +1510,20 @@ Region::uses_source (boost::shared_ptr source) const } } + for (SourceList::const_iterator i = _master_sources.begin(); i != _master_sources.end(); ++i) { + if (*i == source) { + return true; + } + + boost::shared_ptr ps = boost::dynamic_pointer_cast (*i); + + if (ps) { + if (ps->playlist()->uses_source (source)) { + return true; + } + } + } + return false; } @@ -1501,7 +1535,7 @@ Region::source_length(uint32_t n) const } bool -Region::verify_length (framecnt_t len) +Region::verify_length (framecnt_t& len) { if (source() && (source()->destructive() || source()->length_mutable())) { return true; @@ -1724,4 +1758,4 @@ Region::latest_possible_frame () const return _position + (minlen - _start) - 1; } - +