0dBFS peak meter GUI
[ardour.git] / gtk2_ardour / mixer_strip.cc
index dc9cdcc59b6be30e6dd22171ef07513091b91698..c55bd1921407305e3ee471556f8736b67e80daab 100644 (file)
@@ -34,6 +34,7 @@
 #include <gtkmm2ext/slider_controller.h>
 #include <gtkmm2ext/bindable_button.h>
 
+#include "ardour/amp.h"
 #include "ardour/audio_track.h"
 #include "ardour/audioengine.h"
 #include "ardour/internal_send.h"
@@ -96,6 +97,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, bool in_mixer)
        , meter_point_button (_("pre"))
        , midi_input_enable_button (0)
        , _comment_button (_("Comments"))
+       , trim_control (ArdourKnob::default_elements, true)
        , _visibility (X_("mixer-element-visibility"))
 {
        init ();
@@ -125,6 +127,7 @@ MixerStrip::MixerStrip (Mixer_UI& mx, Session* sess, boost::shared_ptr<Route> rt
        , meter_point_button (_("pre"))
        , midi_input_enable_button (0)
        , _comment_button (_("Comments"))
+       , trim_control (ArdourKnob::default_elements, true)
        , _visibility (X_("mixer-element-visibility"))
 {
        init ();
@@ -255,6 +258,15 @@ MixerStrip::init ()
        _comment_button.set_name (X_("mixer strip button"));
        _comment_button.signal_clicked.connect (sigc::mem_fun (*this, &RouteUI::toggle_comment_editor));
 
+       // TODO implement ArdourKnob::on_size_request properly
+#define PX_SCALE(px) std::max((float)px, rintf((float)px * ARDOUR_UI::ui_scale))
+       trim_control.set_size_request (PX_SCALE(19), PX_SCALE(19));
+#undef PX_SCALE
+       trim_control.set_tooltip_prefix (_("Trim: "));
+       trim_control.set_name ("trim knob");
+       trim_control.set_no_show_all (true);
+       input_button_box.pack_start (trim_control, false, false);
+
        global_vpacker.set_border_width (1);
        global_vpacker.set_spacing (0);
 
@@ -516,6 +528,15 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
                monitor_disk_button->hide ();
        }
 
+       if (route()->trim() && route()->trim()->active()) {
+               trim_control.show ();
+               trim_control.set_controllable (route()->trim()->gain_control());
+       } else {
+               trim_control.hide ();
+               boost::shared_ptr<Controllable> none;
+               trim_control.set_controllable (none);
+       }
+
        if (is_midi_track()) {
                if (midi_input_enable_button == 0) {
                        midi_input_enable_button = manage (new ArdourButton);
@@ -684,7 +705,7 @@ MixerStrip::set_width_enum (Width w, void* owner)
 
        set_button_names ();
 
-       const double scale = std::max(1.0, ARDOUR_UI::config()->get_font_scale() / 102400.);
+       const float scale = std::max(1.f, ARDOUR_UI::ui_scale);
 
        switch (w) {
        case Wide:
@@ -707,7 +728,7 @@ MixerStrip::set_width_enum (Width w, void* owner)
 
                {
                        // panners expect an even number of horiz. pixels
-                       int width = rint(max (110 * scale, gpm.get_gm_width() + 10 * scale)) + 1;
+                       int width = rintf (max (110.f * scale, gpm.get_gm_width() + 10.f * scale)) + 1;
                        width &= ~1;
                        set_size_request (width, -1);
                }
@@ -734,7 +755,7 @@ MixerStrip::set_width_enum (Width w, void* owner)
 
                {
                        // panners expect an even number of horiz. pixels
-                       int width = rint(max (60 * scale, gpm.get_gm_width() + 10 * scale)) + 1;
+                       int width = rintf (max (60.f * scale, gpm.get_gm_width() + 10.f * scale)) + 1;
                        width &= ~1;
                        set_size_request (width, -1);
                }
@@ -2283,6 +2304,7 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev)
        items.push_back (SeparatorElem());
 
        add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak);
+       add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak0dB), MeterPeak0dB);
        add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms),  MeterKrms);
        add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN);
        add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR);