reimplement Location::set() to avoid "non-atomic" signalling half-way through the changes to start/end

This commit is contained in:
Paul Davis 2014-09-23 10:29:08 -04:00
parent 5bf9f621c4
commit eb7d7bd44f

View file

@ -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