Set up fader for audio / MIDI when the fader position
authorCarl Hetherington <carl@carlh.net>
Fri, 19 Aug 2011 17:52:32 +0000 (17:52 +0000)
committerCarl Hetherington <carl@carlh.net>
Fri, 19 Aug 2011 17:52:32 +0000 (17:52 +0000)
changes (part of #4233).

git-svn-id: svn://localhost/ardour2/branches/3.0@10011 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/gain_meter.cc
gtk2_ardour/gain_meter.h

index 00c41ff1ad0dc12b3e13278edc3dc62fc5f0135e..471239efdc41f2d42aa5aeaced2f340bd56ed0b3 100644 (file)
@@ -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;
@@ -238,6 +231,42 @@ GainMeterBase::set_controls (boost::shared_ptr<Route> r,
        update_gain_sensitive ();
 }
 
+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 ()
 {
@@ -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 ();
index 0112c44d9273e686b699c5bada95ab5cffc817f0..8e2ac28bfcf26f6331245e539b1ade618b9f1f8e 100644 (file)
@@ -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