diff options
author | Robin Gareus <robin@gareus.org> | 2017-06-22 21:06:12 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-06-22 22:04:10 +0200 |
commit | 9334c99b355c7e326f5659794c88f61805aa16d0 (patch) | |
tree | c171795e0953acfe735170f1feed44d40773009c /libs/ardour/slavable.cc | |
parent | faa52a33498b7d655c6e54176bd257d88eec3ea5 (diff) |
Update Slavable API
Do not use AutomationType to identify parameters, use complete
Evoral::Parameter and Automatable.
For "batch connections", a Slavables needs to implement an API to return
the relevant controls.
This is only a first step towards a more generic Master/Slave framework.
Diffstat (limited to 'libs/ardour/slavable.cc')
-rw-r--r-- | libs/ardour/slavable.cc | 100 |
1 files changed, 42 insertions, 58 deletions
diff --git a/libs/ardour/slavable.cc b/libs/ardour/slavable.cc index cb34630522..7d8109eac6 100644 --- a/libs/ardour/slavable.cc +++ b/libs/ardour/slavable.cc @@ -82,18 +82,6 @@ Slavable::set_state (XMLNode const& node, int version) return 0; } - -/* Gain, solo & mute are currently the only controls that are - * automatically slaved to the master's own equivalent controls. - */ - -static AutomationType auto_slave_types[] = { - GainAutomation, - SoloAutomation, - MuteAutomation, - NullAutomation -}; - int Slavable::do_assign (VCAManager* manager) { @@ -117,18 +105,12 @@ Slavable::do_assign (VCAManager* manager) if (!vcas.empty()) { for (std::vector<boost::shared_ptr<VCA> >::iterator v = vcas.begin(); v != vcas.end(); ++v) { - assign (*v, true); + assign (*v); } - for (uint32_t n = 0; auto_slave_types[n] != NullAutomation; ++n) { - - boost::shared_ptr<SlavableAutomationControl> slave; - - slave = boost::dynamic_pointer_cast<SlavableAutomationControl> (automation_control (auto_slave_types[n])); - - if (slave) { - slave->use_saved_master_ratios (); - } + SlavableControlList scl = slavables (); + for (SlavableControlList::iterator i = scl.begin(); i != scl.end(); ++i) { + (*i)->use_saved_master_ratios (); } } @@ -138,12 +120,12 @@ Slavable::do_assign (VCAManager* manager) } void -Slavable::assign (boost::shared_ptr<VCA> v, bool loading) +Slavable::assign (boost::shared_ptr<VCA> v) { assert (v); { Glib::Threads::RWLock::WriterLock lm (master_lock); - if (assign_controls (v, loading) == 0) { + if (assign_controls (v)) { _masters.insert (v->number()); } @@ -175,7 +157,7 @@ Slavable::unassign (boost::shared_ptr<VCA> v) { Glib::Threads::RWLock::WriterLock lm (master_lock); - (void) unassign_controls (v); + unassign_controls (v); if (v) { _masters.erase (v->number()); } else { @@ -185,47 +167,49 @@ Slavable::unassign (boost::shared_ptr<VCA> v) AssignmentChange (v, false); } -int -Slavable::assign_controls (boost::shared_ptr<VCA> vca, bool loading) +bool +Slavable::assign_controls (boost::shared_ptr<VCA> vca) { - boost::shared_ptr<SlavableAutomationControl> slave; - boost::shared_ptr<AutomationControl> master; - - for (uint32_t n = 0; auto_slave_types[n] != NullAutomation; ++n) { - - slave = boost::dynamic_pointer_cast<SlavableAutomationControl> (automation_control (auto_slave_types[n])); - master = vca->automation_control (auto_slave_types[n]); - - if (slave && master) { - slave->add_master (master, loading); - } + bool rv = false; + SlavableControlList scl = slavables (); + for (SlavableControlList::iterator i = scl.begin(); i != scl.end(); ++i) { + rv |= assign_control (vca, *i); } - - return 0; + return rv; } -int +void Slavable::unassign_controls (boost::shared_ptr<VCA> vca) { - boost::shared_ptr<SlavableAutomationControl> slave; - boost::shared_ptr<AutomationControl> master; - - for (uint32_t n = 0; auto_slave_types[n] != NullAutomation; ++n) { + SlavableControlList scl = slavables (); + for (SlavableControlList::iterator i = scl.begin(); i != scl.end(); ++i) { + unassign_control (vca, *i); + } +} - slave = boost::dynamic_pointer_cast<SlavableAutomationControl> (automation_control (auto_slave_types[n])); +bool +Slavable::assign_control (boost::shared_ptr<VCA> vca, boost::shared_ptr<SlavableAutomationControl> slave) +{ + boost::shared_ptr<AutomationControl> master; + master = vca->automation_control (slave->parameter()); + if (!master) { + return false; + } + slave->add_master (master); + return true; +} - if (!vca) { - /* unassign from all */ - if (slave) { - slave->clear_masters (); - } - } else { - master = vca->automation_control (auto_slave_types[n]); - if (slave && master) { - slave->remove_master (master); - } +void +Slavable::unassign_control (boost::shared_ptr<VCA> vca, boost::shared_ptr<SlavableAutomationControl> slave) +{ + if (!vca) { + /* unassign from all */ + slave->clear_masters (); + } else { + boost::shared_ptr<AutomationControl> master; + master = vca->automation_control (slave->parameter()); + if (master) { + slave->remove_master (master); } } - - return 0; } |