diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/gain_control.h | 2 | ||||
-rw-r--r-- | libs/ardour/gain_control.cc | 22 |
2 files changed, 22 insertions, 2 deletions
diff --git a/libs/ardour/ardour/gain_control.h b/libs/ardour/ardour/gain_control.h index 93d9c4fec0..8dea7a7750 100644 --- a/libs/ardour/ardour/gain_control.h +++ b/libs/ardour/ardour/gain_control.h @@ -60,6 +60,8 @@ class LIBARDOUR_API GainControl : public AutomationControl { bool slaved_to (boost::shared_ptr<VCA>) const; std::vector<uint32_t> masters () const; + PBD::Signal0<void> VCAStatusChange; + int set_state (XMLNode const&, int); XMLNode& get_state(); diff --git a/libs/ardour/gain_control.cc b/libs/ardour/gain_control.cc index c5f1f25bb7..214c2bd3d6 100644 --- a/libs/ardour/gain_control.cc +++ b/libs/ardour/gain_control.cc @@ -133,11 +133,12 @@ GainControl::add_master (boost::shared_ptr<VCA> vca) { gain_t old_master_val; gain_t new_master_val; + std::pair<set<boost::shared_ptr<GainControl> >::iterator,bool> res; { Glib::Threads::Mutex::Lock lm (master_lock); old_master_val = get_master_gain_locked (); - _masters.insert (vca->control()); + res = _masters.insert (vca->control()); _masters_numbers.insert (vca->number()); new_master_val = get_master_gain_locked (); @@ -153,6 +154,10 @@ GainControl::add_master (boost::shared_ptr<VCA> vca) if (old_master_val != new_master_val) { Changed(); /* EMIT SIGNAL */ } + + if (res.second) { + VCAStatusChange (); /* EMIT SIGNAL */ + } } void @@ -169,11 +174,12 @@ GainControl::remove_master (boost::shared_ptr<VCA> vca) { gain_t old_master_val; gain_t new_master_val; + set<boost::shared_ptr<GainControl> >::size_type erased = 0; { Glib::Threads::Mutex::Lock lm (master_lock); old_master_val = get_master_gain_locked (); - _masters.erase (vca->control()); + erased = _masters.erase (vca->control()); _masters_numbers.erase (vca->number()); new_master_val = get_master_gain_locked (); } @@ -181,6 +187,10 @@ GainControl::remove_master (boost::shared_ptr<VCA> vca) if (old_master_val != new_master_val) { Changed(); /* EMIT SIGNAL */ } + + if (erased) { + VCAStatusChange (); /* EMIT SIGNAL */ + } } void @@ -188,10 +198,14 @@ GainControl::clear_masters () { gain_t old_master_val; gain_t new_master_val; + bool had_masters = false; { Glib::Threads::Mutex::Lock lm (master_lock); old_master_val = get_master_gain_locked (); + if (!_masters.empty()) { + had_masters = true; + } _masters.clear (); _masters_numbers.clear (); new_master_val = get_master_gain_locked (); @@ -200,6 +214,10 @@ GainControl::clear_masters () if (old_master_val != new_master_val) { Changed(); /* EMIT SIGNAL */ } + + if (had_masters) { + VCAStatusChange (); /* EMIT SIGNAL */ + } } bool |