diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc index 6ce1b5f282..55cf2256d9 100644 --- a/libs/ardour/location.cc +++ b/libs/ardour/location.cc @@ -282,6 +282,7 @@ Location::set_end (framepos_t e, bool force, bool allow_bbt_recompute) if (allow_bbt_recompute) { recompute_bbt_from_frames (); } + end_changed(this); /* EMIT SIGNAL */ EndChanged(); /* EMIT SIGNAL */ @@ -296,22 +297,92 @@ Location::set_end (framepos_t e, bool force, bool allow_bbt_recompute) } int -Location::set (framepos_t start, framepos_t end, bool allow_bbt_recompute) +Location::set (framepos_t s, framepos_t e, bool allow_bbt_recompute) { - if (start < 0 || end < 0) { + if (s < 0 || e < 0) { return -1; } /* check validity */ - if (((is_auto_punch() || is_auto_loop()) && start >= end) || (!is_mark() && start > end)) { + if (((is_auto_punch() || is_auto_loop()) && s >= e) || (!is_mark() && s > e)) { return -1; } - /* now we know these values are ok, so force-set them */ - int const s = set_start (start, true, allow_bbt_recompute); - int const e = set_end (end, true, allow_bbt_recompute); + bool start_change = false; + bool end_change = false; - return (s == 0 && e == 0) ? 0 : -1; + if (is_mark()) { + + if (_start != s) { + _start = s; + _end = s; + + if (allow_bbt_recompute) { + recompute_bbt_from_frames (); + } + + start_change = true; + end_change = true; + } + + assert (_start >= 0); + assert (_end >= 0); + + } else { + + if (s != _start) { + + framepos_t const old = _start; + _start = s; + + if (allow_bbt_recompute) { + recompute_bbt_from_frames (); + } + + start_change = true; + + if (is_session_range ()) { + Session::StartTimeChanged (old); /* EMIT SIGNAL */ + AudioFileSource::set_header_position_offset (s); + } + } + + + if (e != _end) { + + framepos_t const old = _end; + _end = e; + + if (allow_bbt_recompute) { + recompute_bbt_from_frames (); + } + + end_change = true; + + if (is_session_range()) { + Session::EndTimeChanged (old); /* EMIT SIGNAL */ + } + } + + assert (_end >= 0); + } + + if (start_change) { + start_changed(this); /* EMIT SIGNAL */ + StartChanged(); /* EMIT SIGNAL */ + } + + if (end_change) { + end_changed(this); /* EMIT SIGNAL */ + EndChanged(); /* EMIT SIGNAL */ + } + + if (start_change && end_change) { + changed (this); + Changed (); + } + + return 0; } int