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();
+}