summaryrefslogtreecommitdiff
path: root/libs/ardour/gain_control.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-03-04 11:42:43 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2016-05-31 15:30:39 -0400
commit17853bc472f3a097df53443b43cd859be356eea0 (patch)
tree894bdaed9e20dceeca2629d208e2e031c3b24413 /libs/ardour/gain_control.cc
parent0c5e5f54a0a6eff1e516683eda55ef02ae32c1ac (diff)
ensure that GainControl::get_value() never returns > Config->get_max_gain()
Diffstat (limited to 'libs/ardour/gain_control.cc')
-rw-r--r--libs/ardour/gain_control.cc30
1 files changed, 19 insertions, 11 deletions
diff --git a/libs/ardour/gain_control.cc b/libs/ardour/gain_control.cc
index 52752dcdda..b9c381c406 100644
--- a/libs/ardour/gain_control.cc
+++ b/libs/ardour/gain_control.cc
@@ -43,10 +43,10 @@ GainControl::GainControl (Session& session, const Evoral::Parameter &param, boos
range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db;
}
-double
-GainControl::get_value () const
-{
- Glib::Threads::RWLock::ReaderLock lm (master_lock);
+gain_t
+GainControl::get_value_locked () const {
+
+ /* read or write masters lock must be held */
if (_masters.empty()) {
return AutomationControl::get_value();
@@ -59,7 +59,14 @@ GainControl::get_value () const
g *= mr->second.master()->get_value () * mr->second.ratio();
}
- return g;
+ return min (Config->get_max_gain(), g);
+}
+
+double
+GainControl::get_value () const
+{
+ Glib::Threads::RWLock::ReaderLock lm (master_lock);
+ return get_value_locked ();
}
void
@@ -164,19 +171,20 @@ GainControl::get_master_gain_locked () const
void
GainControl::add_master (boost::shared_ptr<VCA> vca)
{
- gain_t old_master_val;
+ gain_t current_value;
std::pair<Masters::iterator,bool> res;
{
Glib::Threads::RWLock::WriterLock lm (master_lock);
- old_master_val = get_master_gain_locked ();
+ current_value = get_value_locked ();
/* ratio will be recomputed below */
res = _masters.insert (make_pair<uint32_t,MasterRecord> (vca->number(), MasterRecord (vca->control(), 0.0)));
if (res.second) {
- recompute_masters_ratios (old_master_val);
+
+ recompute_masters_ratios (current_value);
/* note that we bind @param m as a weak_ptr<GainControl>, thus
avoiding holding a reference to the control in the binding
@@ -210,15 +218,15 @@ GainControl::master_going_away (boost::weak_ptr<VCA> wv)
void
GainControl::remove_master (boost::shared_ptr<VCA> vca)
{
- gain_t old_master_val;
+ gain_t current_value;
Masters::size_type erased = 0;
{
Glib::Threads::RWLock::WriterLock lm (master_lock);
- old_master_val = get_master_gain_locked ();
+ current_value = get_value_locked ();
erased = _masters.erase (vca->number());
if (erased) {
- recompute_masters_ratios (old_master_val);
+ recompute_masters_ratios (current_value);
}
}