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
This commit is contained in:
Carl Hetherington
2011-11-21 16:34:05 +00:00
parent aef0319864
commit 6e2bd18905
4 changed files with 103 additions and 0 deletions

View File

@@ -203,6 +203,8 @@ class Route : public SessionObject, public Automatable, public RouteGroupMember,
}
}
boost::shared_ptr<Processor> processor_by_id (PBD::ID) const;
boost::shared_ptr<Processor> nth_plugin (uint32_t n);
boost::shared_ptr<Processor> nth_send (uint32_t n);

View File

@@ -165,6 +165,10 @@ class Track : public Route, public PublicDiskstream
boost::shared_ptr<Diskstream> _diskstream;
MeterPoint _saved_meter_point;
/** used to keep track of processors that we are deactivating during record,
if `do-not-record-plugins' is enabled.
*/
std::list<boost::weak_ptr<Processor> > _deactivated_processors;
TrackMode _mode;
bool _needs_butler;
MonitorChoice _monitoring;
@@ -223,6 +227,10 @@ private:
void diskstream_record_enable_changed ();
void diskstream_speed_changed ();
void diskstream_alignment_style_changed ();
void parameter_changed (std::string);
void deactivate_visible_processors ();
void activate_deactivated_processors ();
};
}; /* namespace ARDOUR*/

View File

@@ -3908,3 +3908,16 @@ Route::maybe_note_meter_position ()
}
}
}
boost::shared_ptr<Processor>
Route::processor_by_id (PBD::ID id) const
{
Glib::RWLock::ReaderLock lm (_processor_lock);
for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
if ((*i)->id() == id) {
return *i;
}
}
return boost::shared_ptr<Processor> ();
}

View File

@@ -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 ();
}
}
}