summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-06-14 15:14:56 +0200
committerRobin Gareus <robin@gareus.org>2017-06-14 15:21:16 +0200
commit22bddf543421f2a75a5a807009ea3e96dcb26cac (patch)
treeeb1b3608a95557c6999138afc4aba68a722d2d1e
parente0a1c7690acc0c79c070bb23c992ab6b62cbf2c6 (diff)
Special-case VCA at 0 (-inf dB), force gain slaves to -inf dB
-rw-r--r--libs/ardour/ardour/gain_control.h1
-rw-r--r--libs/ardour/ardour/slavable_automation_control.h4
-rw-r--r--libs/ardour/gain_control.cc9
-rw-r--r--libs/ardour/slavable_automation_control.cc6
4 files changed, 14 insertions, 6 deletions
diff --git a/libs/ardour/ardour/gain_control.h b/libs/ardour/ardour/gain_control.h
index 0a7bddcf4f..42465cc225 100644
--- a/libs/ardour/ardour/gain_control.h
+++ b/libs/ardour/ardour/gain_control.h
@@ -51,6 +51,7 @@ class LIBARDOUR_API GainControl : public SlavableAutomationControl {
void inc_gain (gain_t);
protected:
+ void post_add_master (boost::shared_ptr<AutomationControl>);
bool get_masters_curve_locked (framepos_t, framepos_t, float*, framecnt_t) const;
};
diff --git a/libs/ardour/ardour/slavable_automation_control.h b/libs/ardour/ardour/slavable_automation_control.h
index 4a3c990147..5057ef4070 100644
--- a/libs/ardour/ardour/slavable_automation_control.h
+++ b/libs/ardour/ardour/slavable_automation_control.h
@@ -99,9 +99,9 @@ protected:
double val_ctrl () const { return _val_ctrl; }
double val_master () const { return _val_master; }
- double val_master_inv () const { return _val_master == 0 ? 1.0 : 1.0 / _val_master; }
- double master_ratio () const { return _val_master == 0 ? master()->get_value() : master()->get_value() / _val_master; }
+ double val_master_inv () const { return _val_master == 0 ? 0 : 1.0 / _val_master; }
+ double master_ratio () const { return _val_master == 0 ? 0 : master()->get_value() / _val_master; }
int set_state (XMLNode const&, int);
diff --git a/libs/ardour/gain_control.cc b/libs/ardour/gain_control.cc
index ee356b017c..7b0f4e404c 100644
--- a/libs/ardour/gain_control.cc
+++ b/libs/ardour/gain_control.cc
@@ -102,6 +102,15 @@ GainControl::inc_gain (gain_t factor)
}
}
+void
+GainControl::post_add_master (boost::shared_ptr<AutomationControl> m)
+{
+ if (m->get_value() == 0) {
+ /* master is at -inf, which forces this ctrl to -inf on assignment */
+ Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
+ }
+}
+
bool
GainControl::get_masters_curve_locked (framepos_t start, framepos_t end, float* vec, framecnt_t veclen) const
{
diff --git a/libs/ardour/slavable_automation_control.cc b/libs/ardour/slavable_automation_control.cc
index 46b86c7cf5..cb88d36fe9 100644
--- a/libs/ardour/slavable_automation_control.cc
+++ b/libs/ardour/slavable_automation_control.cc
@@ -150,9 +150,7 @@ SlavableAutomationControl::masters_curve_multiply (framepos_t start, framepos_t
= boost::dynamic_pointer_cast<SlavableAutomationControl>(mr->second.master());
assert (sc);
rv |= sc->masters_curve_multiply (start, end, vec, veclen);
- if (mr->second.val_master () != 0) {
- apply_gain_to_buffer (vec, veclen, 1.f / mr->second.val_master ());
- }
+ apply_gain_to_buffer (vec, veclen, mr->second.val_master_inv ());
}
return rv;
}
@@ -166,7 +164,7 @@ SlavableAutomationControl::reduce_by_masters_locked (double value, bool ignore_a
/* need to scale given value by current master's scaling */
const double masters_value = get_masters_value_locked();
if (masters_value == 0.0) {
- value = 0.0; // XXX 1.0, see master_ratio(), val_master_inv()
+ value = 0.0;
} else {
value /= masters_value;
value = std::max (lower(), std::min(upper(), value));