Reinstate command line option to hide splash screen.
[ardour.git] / gtk2_ardour / gain_meter.cc
index 00c41ff1ad0dc12b3e13278edc3dc62fc5f0135e..0324f3d93cfe39eb232b5e922e950d6e9bb2e5ee 100644 (file)
@@ -84,7 +84,7 @@ GainMeterBase::GainMeterBase (Session* s,
        , gain_automation_state_button ("")
        , style_changed (false)
        , dpi_changed (false)
-       , _is_midi (false)
+       , _data_type (DataType::AUDIO)
 
 {
        using namespace Menu_Helpers;
@@ -110,6 +110,10 @@ GainMeterBase::GainMeterBase (Session* s,
 
        level_meter = new LevelMeter(_session);
 
+       level_meter->ButtonPress.connect_same_thread (_level_meter_connection, boost::bind (&GainMeterBase::level_meter_button_press, this, _1));
+       meter_metric_area.signal_button_press_event().connect (sigc::mem_fun (*this, &GainMeterBase::level_meter_button_press));
+       meter_metric_area.add_events (Gdk::BUTTON_PRESS_MASK);
+
        gain_slider->signal_button_press_event().connect (sigc::mem_fun(*this, &GainMeter::gain_slider_button_press));
        gain_slider->signal_button_release_event().connect (sigc::mem_fun(*this, &GainMeter::gain_slider_button_release));
        gain_slider->set_name ("GainFader");
@@ -186,28 +190,21 @@ 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;
 
                gain_astate_menu.items().clear ();
 
-               gain_astate_menu.items().push_back (MenuElem (_("Manual"),
+               gain_astate_menu.items().push_back (MenuElem (S_("Automation|Manual"),
                                                              sigc::bind (sigc::mem_fun (*(amp.get()), &Automatable::set_parameter_automation_state),
                                                                    Evoral::Parameter(GainAutomation), (AutoState) Off)));
                gain_astate_menu.items().push_back (MenuElem (_("Play"),
@@ -238,6 +235,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) {
+               _data_type = DataType::AUDIO;
+               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 {
+               _data_type = DataType::MIDI;
+               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 ()
 {
@@ -379,14 +412,17 @@ GainMeterBase::show_gain ()
 
        float v = gain_adjustment.get_value();
 
-       if (!_is_midi) {
+       switch (_data_type) {
+       case DataType::AUDIO:
                if (v == 0.0) {
                        strcpy (buf, _("-inf"));
                } else {
                        snprintf (buf, sizeof (buf), "%.1f", accurate_coefficient_to_dB (slider_position_to_gain_with_max (v, Config->get_max_gain())));
                }
-       } else {
+               break;
+       case DataType::MIDI:
                snprintf (buf, sizeof (buf), "%.1f", v);
+               break;
        }
 
        gain_display.set_text (buf);
@@ -395,15 +431,22 @@ GainMeterBase::show_gain ()
 void
 GainMeterBase::gain_adjusted ()
 {
+       gain_t value = 0;
+
+       switch (_data_type) {
+       case DataType::AUDIO:
+               value = slider_position_to_gain_with_max (gain_adjustment.get_value(), Config->get_max_gain());
+               break;
+       case DataType::MIDI:
+               value = gain_adjustment.get_value ();
+               break;
+       }
+       
        if (!ignore_toggle) {
                if (_route && _route->amp() == _amp) {
-                       if (_is_midi) {
-                               _route->set_gain (gain_adjustment.get_value(), this);
-                       } else {
-                               _route->set_gain (slider_position_to_gain_with_max (gain_adjustment.get_value(), Config->get_max_gain()), this);
-                       }
+                       _route->set_gain (value, this);
                } else {
-                       _amp->set_gain (slider_position_to_gain_with_max (gain_adjustment.get_value(), Config->get_max_gain()), this);
+                       _amp->set_gain (value, this);
                }
        }
 
@@ -413,12 +456,15 @@ GainMeterBase::gain_adjusted ()
 void
 GainMeterBase::effective_gain_display ()
 {
-       gfloat value;
+       float value = 0.0;
 
-       if (!_route || _route->output()->n_ports().n_midi() == 0) {
+       switch (_data_type) {
+       case DataType::AUDIO:
                value = gain_to_slider_position_with_max (_amp->gain(), Config->get_max_gain());
-       } else {
+               break;
+       case DataType::MIDI:
                value = _amp->gain ();
+               break;
        }
 
        if (gain_adjustment.get_value() != value) {
@@ -605,7 +651,7 @@ GainMeterBase::gain_slider_button_press (GdkEventButton* ev)
 }
 
 bool
-GainMeterBase::gain_slider_button_release (GdkEventButton* ev)
+GainMeterBase::gain_slider_button_release (GdkEventButton*)
 {
        _amp->gain_control()->stop_touch (false, _amp->session().transport_frame());
        return true;
@@ -1063,6 +1109,12 @@ GainMeterBase::get_controllable()
        }
 }
 
+bool
+GainMeterBase::level_meter_button_press (GdkEventButton* ev)
+{
+       return LevelMeterButtonPress (ev); /* EMIT SIGNAL */
+}
+
 void
 GainMeter::meter_configuration_changed (ChanCount c)
 {
@@ -1077,3 +1129,4 @@ GainMeter::meter_configuration_changed (ChanCount c)
        style_changed = true;
        meter_metric_area.queue_draw ();
 }
+