summaryrefslogtreecommitdiff
path: root/libs/ardour/slavable.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-06-22 21:06:12 +0200
committerRobin Gareus <robin@gareus.org>2017-06-22 22:04:10 +0200
commit9334c99b355c7e326f5659794c88f61805aa16d0 (patch)
treec171795e0953acfe735170f1feed44d40773009c /libs/ardour/slavable.cc
parentfaa52a33498b7d655c6e54176bd257d88eec3ea5 (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.cc100
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;
}