diff options
-rw-r--r-- | gtk2_ardour/gain_meter.cc | 59 | ||||
-rw-r--r-- | gtk2_ardour/gain_meter.h | 3 |
2 files changed, 47 insertions, 15 deletions
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 00c41ff1ad..471239efdc 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -186,21 +186,14 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r, level_meter->set_meter (pm.get()); gain_slider->set_controllable (amp->gain_control()); - if (!_route || _route->output()->n_ports().n_midi() == 0) { - _is_midi = false; - gain_adjustment.set_lower (0.0); - gain_adjustment.set_upper (1.0); - gain_adjustment.set_step_increment (0.01); - gain_adjustment.set_page_increment (0.1); - } else { - _is_midi = true; - gain_adjustment.set_lower (0.0); - gain_adjustment.set_upper (2.0); - gain_adjustment.set_step_increment (0.05); - gain_adjustment.set_page_increment (0.1); - gain_slider->set_default_value (1); + if (amp) { + amp->ConfigurationChanged.connect ( + model_connections, invalidator (*this), ui_bind (&GainMeterBase::setup_gain_adjustment, this), gui_context () + ); } + setup_gain_adjustment (); + if (!_route || !_route->is_hidden()) { using namespace Menu_Helpers; @@ -239,6 +232,42 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r, } void +GainMeterBase::setup_gain_adjustment () +{ + if (!_amp) { + return; + } + + if (_previous_amp_output_streams == _amp->output_streams ()) { + return; + } + + ignore_toggle = true; + + if (_amp->output_streams().n_midi() == 0) { + _is_midi = false; + gain_adjustment.set_lower (0.0); + gain_adjustment.set_upper (1.0); + gain_adjustment.set_step_increment (0.01); + gain_adjustment.set_page_increment (0.1); + gain_slider->set_default_value (gain_to_slider_position (1)); + } else { + _is_midi = true; + gain_adjustment.set_lower (0.0); + gain_adjustment.set_upper (2.0); + gain_adjustment.set_step_increment (0.05); + gain_adjustment.set_page_increment (0.1); + gain_slider->set_default_value (1); + } + + ignore_toggle = false; + + effective_gain_display (); + + _previous_amp_output_streams = _amp->output_streams (); +} + +void GainMeterBase::hide_all_meters () { level_meter->hide_meters(); @@ -413,9 +442,9 @@ GainMeterBase::gain_adjusted () void GainMeterBase::effective_gain_display () { - gfloat value; + float value; - if (!_route || _route->output()->n_ports().n_midi() == 0) { + if (!_is_midi) { value = gain_to_slider_position_with_max (_amp->gain(), Config->get_max_gain()); } else { value = _amp->gain (); diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 0112c44d92..8e2ac28bfc 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -123,6 +123,8 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr void gain_automation_state_changed(); void gain_automation_style_changed(); + void setup_gain_adjustment (); + std::string astate_string (ARDOUR::AutoState); std::string short_astate_string (ARDOUR::AutoState); std::string _astate_string (ARDOUR::AutoState, bool); @@ -179,6 +181,7 @@ class GainMeterBase : virtual public sigc::trackable, ARDOUR::SessionHandlePtr bool color_changed; void color_handler(bool); bool _is_midi; + ARDOUR::ChanCount _previous_amp_output_streams; }; class GainMeter : public GainMeterBase, public Gtk::VBox |