summaryrefslogtreecommitdiff
path: root/libs/ardour/track.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-11-21 16:34:05 +0000
committerCarl Hetherington <carl@carlh.net>2011-11-21 16:34:05 +0000
commit6e2bd18905a472230278e89de1a3e93b2d49821a (patch)
tree91da326c6d8e5747acd904f59992fc4c30b2c049 /libs/ardour/track.cc
parentaef0319864964493def21510fa4a943bf26b8792 (diff)
Re-add code to support do-not-record-plugins (#4487).
git-svn-id: svn://localhost/ardour2/branches/3.0@10731 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/track.cc')
-rw-r--r--libs/ardour/track.cc80
1 files changed, 80 insertions, 0 deletions
diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc
index d2274e5039..9d6b82e4c0 100644
--- a/libs/ardour/track.cc
+++ b/libs/ardour/track.cc
@@ -48,6 +48,8 @@ Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, Data
{
_freeze_record.state = NoFreeze;
_declickable = true;
+
+ Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Track::parameter_changed, this, _1));
}
Track::~Track ()
@@ -79,6 +81,20 @@ Track::state (bool full)
root.add_property (X_("saved-meter-point"), enum_2_string (_saved_meter_point));
root.add_child_nocopy (_rec_enable_control->get_state());
root.add_child_nocopy (_diskstream->get_state ());
+
+ if (!_deactivated_processors.empty ()) {
+ XMLNode* node = new XMLNode (X_("DeactivatedProcessors"));
+ for (list<boost::weak_ptr<Processor> >::iterator i = _deactivated_processors.begin(); i != _deactivated_processors.end(); ++i) {
+ boost::shared_ptr<Processor> p = i->lock ();
+ if (p) {
+ XMLNode* c = new XMLNode (X_("Processor"));
+ c->add_property (X_("id"), p->id().to_s());
+ node->add_child_nocopy (*c);
+ }
+ }
+ root.add_child_nocopy (*node);
+ }
+
return root;
}
@@ -113,6 +129,18 @@ Track::set_state (const XMLNode& node, int version)
_rec_enable_control->set_state (*child, version);
}
}
+
+ if (child->name() == X_("DeactivatedProcessors")) {
+ XMLNodeList dp = child->children ();
+ for (XMLNodeConstIterator i = dp.begin(); i != dp.end(); ++i) {
+ assert ((*i)->name() == X_("Processor"));
+ XMLProperty* prop = (*i)->property (X_("id"));
+ boost::shared_ptr<Processor> p = processor_by_id (PBD::ID (prop->value ()));
+ if (p) {
+ _deactivated_processors.push_back (p);
+ }
+ }
+ }
}
const XMLProperty* prop;
@@ -196,6 +224,33 @@ Track::can_record()
return will_record;
}
+/* Turn off visible processors (except Fader), keeping track of the old states */
+void
+Track::deactivate_visible_processors ()
+{
+ _deactivated_processors.clear ();
+ Glib::RWLock::ReaderLock lm (_processor_lock);
+
+ for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+ if ((*i)->active() && (*i)->display_to_user() && boost::dynamic_pointer_cast<Amp> (*i) == 0) {
+ (*i)->deactivate ();
+ _deactivated_processors.push_back (*i);
+ }
+ }
+}
+
+/* Turn deactivated processors back on again */
+void
+Track::activate_deactivated_processors ()
+{
+ for (list<boost::weak_ptr<Processor> >::iterator i = _deactivated_processors.begin(); i != _deactivated_processors.end(); ++i) {
+ boost::shared_ptr<Processor> p = i->lock ();
+ if (p) {
+ p->activate ();
+ }
+ }
+}
+
void
Track::set_record_enabled (bool yn, void *src)
{
@@ -217,6 +272,14 @@ Track::set_record_enabled (bool yn, void *src)
_saved_meter_point = _meter_point;
}
+ if (Config->get_do_not_record_plugins ()) {
+ if (yn) {
+ deactivate_visible_processors ();
+ } else {
+ activate_deactivated_processors ();
+ }
+ }
+
_diskstream->set_record_enabled (yn);
if (_diskstream->record_enabled()) {
@@ -845,3 +908,20 @@ Track::set_monitoring (MonitorChoice mc)
}
}
+void
+Track::parameter_changed (string p)
+{
+ if (p != "do-not-record-plugins") {
+ return;
+ }
+
+ if (record_enabled ()) {
+ if (Config->get_do_not_record_plugins ()) {
+ deactivate_visible_processors ();
+ } else {
+ activate_deactivated_processors ();
+ }
+ }
+}
+
+