mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-01 03:17:39 +01:00
reimplement Location::set() to avoid "non-atomic" signalling half-way through the changes to start/end
This commit is contained in:
parent
5bf9f621c4
commit
eb7d7bd44f
1 changed files with 78 additions and 7 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue