summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-07-12 11:19:15 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-07-12 11:19:49 -0400
commit472ef8c55cc976a581721392ffc1e3a2209ad1fe (patch)
treeadc8e73e1fafd16c64f4409f773a2ab2b6617ec6 /libs/ardour
parent49fbb6fa153e5ff39bedccaa5d4ad2d0b6ed573e (diff)
once the user has explicitly set the session range end, playlist/range changes do not move it.
The user may drag the marker, edit in the Location UI, or use nudge, to set the end
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/session.h2
-rw-r--r--libs/ardour/session.cc9
-rw-r--r--libs/ardour/session_state.cc6
3 files changed, 16 insertions, 1 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 2f2b774c30..696e97ca9d 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -459,6 +459,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
void set_auto_punch_location (Location *);
void set_auto_loop_location (Location *);
void set_session_extents (framepos_t start, framepos_t end);
+ void set_end_is_free (bool);
int location_name(std::string& result, std::string base = std::string(""));
pframes_t get_block_size() const { return current_block_size; }
@@ -1175,6 +1176,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
mutable gint _record_status;
framepos_t _transport_frame;
Location* _session_range_location; ///< session range, or 0 if there is nothing in the session yet
+ bool _session_range_end_is_free;
Slave* _slave;
bool _silent;
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 043d72d128..9e9b530ce3 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -178,6 +178,7 @@ Session::Session (AudioEngine &eng,
, _record_status (Disabled)
, _transport_frame (0)
, _session_range_location (0)
+ , _session_range_end_is_free (true)
, _slave (0)
, _silent (false)
, _transport_speed (0)
@@ -4389,13 +4390,19 @@ Session::maybe_update_session_range (framepos_t a, framepos_t b)
_session_range_location->set_start (a);
}
- if (b > _session_range_location->end()) {
+ if (_session_range_end_is_free && (b > _session_range_location->end())) {
_session_range_location->set_end (b);
}
}
}
void
+Session::set_end_is_free (bool yn)
+{
+ _session_range_end_is_free = yn;
+}
+
+void
Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
{
for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 752c8d03c9..1aafd7118b 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -1095,6 +1095,8 @@ Session::state (bool full_state)
}
}
+ node->add_property ("end-is-free", _session_range_end_is_free ? X_("yes") : X_("no"));
+
/* save the ID counter */
snprintf (buf, sizeof (buf), "%" PRIu64, ID::counter());
@@ -1358,6 +1360,10 @@ Session::set_state (const XMLNode& node, int version)
setup_raid_path(_session_dir->root_path());
+ if ((prop = node.property (X_("end-is-free"))) != 0) {
+ _session_range_end_is_free = string_is_affirmative (prop->value());
+ }
+
if ((prop = node.property (X_("id-counter"))) != 0) {
uint64_t x;
sscanf (prop->value().c_str(), "%" PRIu64, &x);