nframes64_t end() const { return _end; }
nframes64_t length() const { return _end - _start; }
- int set_start (nframes64_t s);
- int set_end (nframes64_t e);
+ int set_start (nframes64_t s, bool force = false);
+ int set_end (nframes64_t e, bool force = false);
int set (nframes64_t start, nframes64_t end);
int move_to (nframes64_t pos);
return this;
}
+/** Set start position.
+ * @param s New start.
+ * @param force true to force setting, even if the given new start is after the current end.
+ */
int
-Location::set_start (nframes64_t s)
+Location::set_start (nframes64_t s, bool force)
{
if (_locked) {
return -1;
}
- if (((is_auto_punch() || is_auto_loop()) && s >= _end) || (!is_mark() && s > _end)) {
- return -1;
+ if (!force) {
+ if (((is_auto_punch() || is_auto_loop()) && s >= _end) || (!is_mark() && s > _end)) {
+ return -1;
+ }
}
if (is_mark()) {
return 0;
}
+/** Set end position.
+ * @param s New end.
+ * @param force true to force setting, even if the given new start is after the current end.
+ */
int
-Location::set_end (nframes64_t e)
+Location::set_end (nframes64_t e, bool force)
{
if (_locked) {
return -1;
}
- if (((is_auto_punch() || is_auto_loop()) && e <= _start) || e < _start) {
- return -1;
+ if (!force) {
+ if (((is_auto_punch() || is_auto_loop()) && e <= _start) || e < _start) {
+ return -1;
+ }
}
if (is_mark()) {
int
Location::set (nframes64_t start, nframes64_t end)
{
- int const s = set_start (start);
- int const e = set_end (end);
+ /* check validity */
+ if (((is_auto_punch() || is_auto_loop()) && start >= end) || (!is_mark() && start > end)) {
+ return -1;
+ }
+
+ /* now we know these values are ok, so force-set them */
+ int const s = set_start (start, true);
+ int const e = set_end (end, true);
return (s == 0 && e == 0) ? 0 : -1;
}