summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/gain_meter.cc59
-rw-r--r--gtk2_ardour/gain_meter.h3
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