diff options
author | Carl Hetherington <carl@carlh.net> | 2011-11-21 16:34:05 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2011-11-21 16:34:05 +0000 |
commit | 6e2bd18905a472230278e89de1a3e93b2d49821a (patch) | |
tree | 91da326c6d8e5747acd904f59992fc4c30b2c049 /libs/ardour/track.cc | |
parent | aef0319864964493def21510fa4a943bf26b8792 (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.cc | 80 |
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 (); + } + } +} + + |