From 9334c99b355c7e326f5659794c88f61805aa16d0 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 22 Jun 2017 21:06:12 +0200 Subject: 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. --- libs/ardour/slavable.cc | 100 ++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 58 deletions(-) (limited to 'libs/ardour/slavable.cc') 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 >::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 slave; - - slave = boost::dynamic_pointer_cast (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 v, bool loading) +Slavable::assign (boost::shared_ptr 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 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 v) AssignmentChange (v, false); } -int -Slavable::assign_controls (boost::shared_ptr vca, bool loading) +bool +Slavable::assign_controls (boost::shared_ptr vca) { - boost::shared_ptr slave; - boost::shared_ptr master; - - for (uint32_t n = 0; auto_slave_types[n] != NullAutomation; ++n) { - - slave = boost::dynamic_pointer_cast (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) { - boost::shared_ptr slave; - boost::shared_ptr 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 (automation_control (auto_slave_types[n])); +bool +Slavable::assign_control (boost::shared_ptr vca, boost::shared_ptr slave) +{ + boost::shared_ptr 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, boost::shared_ptr slave) +{ + if (!vca) { + /* unassign from all */ + slave->clear_masters (); + } else { + boost::shared_ptr master; + master = vca->automation_control (slave->parameter()); + if (master) { + slave->remove_master (master); } } - - return 0; } -- cgit v1.2.3