start shaping up VCA assign process
[ardour.git] / libs / ardour / gain_control.cc
index 867edaf5a39d5ef3e666d61565d1505304bba610..5ba7179231bc291fa4a64e2587ca0b63e1e55dd0 100644 (file)
@@ -97,3 +97,89 @@ GainControl::get_user_string () const
        return std::string(theBuf);
 }
 
+gain_t
+GainControl::get_master_gain () const
+{
+       Glib::Threads::Mutex::Lock sm (master_lock, Glib::Threads::TRY_LOCK);
+
+       if (sm.locked()) {
+               return get_master_gain_locked ();
+       }
+
+       return 1.0;
+}
+
+gain_t
+GainControl::get_master_gain_locked () const
+{
+       /* Master lock MUST be held */
+
+       gain_t g = 1.0;
+
+       for (Masters::const_iterator m = _masters.begin(); m != _masters.end(); ++m) {
+               g *= (*m)->get_value ();
+       }
+
+       return g;
+}
+
+void
+GainControl::add_master (boost::shared_ptr<GainControl> m)
+{
+       gain_t old_master_val;
+       gain_t new_master_val;
+
+       {
+               Glib::Threads::Mutex::Lock lm (master_lock);
+               old_master_val = get_master_gain_locked ();
+               _masters.push_back (m);
+               new_master_val = get_master_gain_locked ();
+       }
+
+       if (old_master_val != new_master_val) {
+               Changed(); /* EMIT SIGNAL */
+       }
+}
+
+void
+GainControl::remove_master (boost::shared_ptr<GainControl> m)
+{
+       gain_t old_master_val;
+       gain_t new_master_val;
+
+       {
+               Glib::Threads::Mutex::Lock lm (master_lock);
+               old_master_val = get_master_gain_locked ();
+               _masters.remove (m);
+               new_master_val = get_master_gain_locked ();
+       }
+
+       if (old_master_val != new_master_val) {
+               Changed(); /* EMIT SIGNAL */
+       }
+}
+
+void
+GainControl::clear_masters ()
+{
+       gain_t old_master_val;
+       gain_t new_master_val;
+
+       {
+               Glib::Threads::Mutex::Lock lm (master_lock);
+               old_master_val = get_master_gain_locked ();
+               _masters.clear ();
+               new_master_val = get_master_gain_locked ();
+       }
+
+       if (old_master_val != new_master_val) {
+               Changed(); /* EMIT SIGNAL */
+       }
+}
+
+bool
+GainControl::slaved_to (boost::shared_ptr<GainControl> gc) const
+{
+       Glib::Threads::Mutex::Lock lm (master_lock);
+       return find (_masters.begin(), _masters.end(), gc) != _masters.end();
+}