Integrate level meters into the mixerstrip gain meters for real this time. The LevelM...
authorDoug McLain <doug@nostar.net>
Fri, 4 Apr 2008 13:12:55 +0000 (13:12 +0000)
committerDoug McLain <doug@nostar.net>
Fri, 4 Apr 2008 13:12:55 +0000 (13:12 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3213 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/gain_meter.cc
gtk2_ardour/gain_meter.h
gtk2_ardour/level_meter.cc
gtk2_ardour/level_meter.h

index ac4da8507bcb14428b738cba333eeb02335d2b5b..845b07c90c5a4925bf115887e3550ad2b6de93a4 100644 (file)
@@ -73,8 +73,7 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
          // 0.781787 is the value needed for gain to be set to 0.
          gain_adjustment (0.781787, 0.0, 1.0, 0.01, 0.1),
          gain_automation_style_button (""),
-         gain_automation_state_button (""),
-         regular_meter_width(5)
+         gain_automation_state_button ("")
        
 {
        if (slider == 0) {
@@ -91,6 +90,8 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
                                                     _io->gain_control(),
                                                     false));
 
+       level_meter = new LevelMeter(_io, _session);
+
        gain_slider->signal_button_press_event().connect (mem_fun(*this, &GainMeter::start_gain_touch));
        gain_slider->signal_button_release_event().connect (mem_fun(*this, &GainMeter::end_gain_touch));
        gain_slider->set_name ("GainFader");
@@ -117,8 +118,6 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
        meter_metric_area.set_name ("AudioTrackMetrics");
        set_size_request_to_display_given_text (meter_metric_area, "-50", 0, 0);
 
-       meter_packer.set_spacing (2);
-
        gain_automation_style_button.set_name ("MixerAutomationModeButton");
        gain_automation_state_button.set_name ("MixerAutomationPlaybackButton");
 
@@ -151,7 +150,7 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
                */
 
                gain_display_box.pack_end (peak_display, true, true);
-               hbox.pack_end (meter_packer, true, true);
+               hbox.pack_end (*level_meter, true, true);
 
                if (!r->hidden()) {
 
@@ -195,8 +194,6 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s)
        peak_display.signal_button_release_event().connect (mem_fun(*this, &GainMeter::peak_button_release), false);
        gain_display.signal_key_press_event().connect (mem_fun(*this, &GainMeter::gain_key_press), false);
 
-       Config->ParameterChanged.connect (mem_fun (*this, &GainMeter::parameter_changed));
-
        gain_changed (0);
        show_gain ();
 
@@ -215,7 +212,7 @@ void
 GainMeter::set_width (Width w, int len)
 {
        _width = w;
-       setup_meters (len);
+       level_meter->setup_meters (len);
 }
 
 Glib::RefPtr<Gdk::Pixmap>
@@ -316,84 +313,21 @@ GainMeter::~GainMeter ()
                delete meter_menu;
        }
 
-       for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); i++) {
-               if ((*i).meter) {
-                       delete (*i).meter;
-               }
+       if (level_meter) {
+               delete level_meter;
        }
 }
 
-void
-GainMeter::update_meters ()
-{
-       vector<MeterInfo>::iterator i;
-       uint32_t n;
-       float peak, mpeak;
-       char buf[32];
-       
-       for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
-               if ((*i).packed) {
-                       peak = _io->peak_input_power (n);
-                       
-                       (*i).meter->set (log_meter (peak));
-
-                       mpeak = _io->max_peak_power(n);
-                       
-                       if (mpeak > max_peak) {
-                               max_peak = mpeak;
-                               /* set peak display */
-                               if (max_peak <= -200.0f) {
-                                       peak_display.set_label (_("-inf"));
-                               } else {
-                                       snprintf (buf, sizeof(buf), "%.1f", max_peak);
-                                       peak_display.set_label (buf);
-                               }
-
-                               if (max_peak >= 0.0f) {
-                                       peak_display.set_name ("MixerStripPeakDisplayPeak");
-                               }
-                       }
-               }
-       }
-}
-
-void
-GainMeter::parameter_changed(const char* parameter_name)
-{
-#define PARAM_IS(x) (!strcmp (parameter_name, (x)))
-
-       ENSURE_GUI_THREAD (bind (mem_fun(*this, &GainMeter::parameter_changed), parameter_name));
-
-       if (PARAM_IS ("meter-hold")) {
-       
-               vector<MeterInfo>::iterator i;
-               uint32_t n;
-               
-               for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
-                       
-                       (*i).meter->set_hold_count ((uint32_t) floor(Config->get_meter_hold()));
-               }
-       }
-
-#undef PARAM_IS
-}
-
 void
 GainMeter::hide_all_meters ()
 {
        bool remove_metric_area = false;
 
-       for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); ++i) {
-               if ((*i).packed) {
-                       remove_metric_area = true;
-                       meter_packer.remove (*((*i).meter));
-                       (*i).packed = false;
-               }
-       }
+       level_meter->hide_meters();
 
        if (remove_metric_area) {
                if (meter_metric_area.get_parent()) {
-                       meter_packer.remove (meter_metric_area);
+                       level_meter->remove (meter_metric_area);
                }
        }
 }
@@ -401,74 +335,11 @@ GainMeter::hide_all_meters ()
 void
 GainMeter::setup_meters (int len)
 {
-       uint32_t nmeters = _io->n_outputs();
-       guint16 width;
-
-       hide_all_meters ();
-
-       Route* r;
-
-       if ((r = dynamic_cast<Route*> (_io.get())) != 0) {
-
-               switch (r->meter_point()) {
-               case MeterPreFader:
-               case MeterInput:
-                       nmeters = r->n_inputs();
-                       break;
-               case MeterPostFader:
-                       nmeters = r->n_outputs();
-                       break;
-               }
-
-       } else {
-
-               nmeters = _io->n_outputs();
-
-       }
-
-       if (nmeters == 0) {
-               return;
-       }
-
-       if (nmeters <= 2) {
-               width = regular_meter_width;
-       } else {
-               width = thin_meter_width;
-       }
-
-       while (meters.size() < nmeters) {
-               meters.push_back (MeterInfo());
-       }
-
-       /* pack them backwards */
-
-       meter_packer.pack_end (meter_metric_area, false, false);
+       level_meter->pack_end (meter_metric_area, false, false);
        meter_metric_area.show_all ();
-
-       int b = ARDOUR_UI::config()->canvasvar_MeterColorBase.get();
-       int m = ARDOUR_UI::config()->canvasvar_MeterColorMid.get();
-       int t = ARDOUR_UI::config()->canvasvar_MeterColorTop.get();
-       int c = ARDOUR_UI::config()->canvasvar_MeterColorClip.get();
-
-       //cerr << "GainMeter::setup_meters() called color_changed = " << color_changed << " colors: " << hex << b << " " << m << " " << t << " " << c << endl;//DEBUG
-
-       for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) {
-               if (meters[n].width != width || meters[n].length != len || color_changed) {
-                       delete meters[n].meter;
-                       meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, b, m, t, c);
-                       //cerr << "GainMeter::setup_meters() w:l = " << width << ":" << len << endl;//DEBUG
-                       meters[n].width = width;
-                       meters[n].length = len;
-                       meters[n].meter->add_events (Gdk::BUTTON_RELEASE_MASK);
-                       meters[n].meter->signal_button_release_event().connect (bind (mem_fun(*this, &GainMeter::meter_button_release), n));
-               }
-
-               meter_packer.pack_end (*meters[n].meter, false, false);
-               meters[n].meter->show_all ();
-               meters[n].packed = true;
-       }
-       color_changed = false;
-}      
+       level_meter->setup_meters(len, 5);
+       
+}
 
 int
 GainMeter::get_gm_width ()
@@ -537,7 +408,7 @@ GainMeter::meter_button_release (GdkEventButton* ev, uint32_t which)
 {
        switch (ev->button) {
        case 1:
-               meters[which].meter->clear();
+               level_meter->clear_meters();
                max_peak = minus_infinity();
                peak_display.set_label (_("-inf"));
                peak_display.set_name ("MixerStripPeakDisplay");
@@ -959,10 +830,24 @@ GainMeter::gain_automation_state_changed ()
        }
 }
 
-void GainMeter::clear_meters ()
+void
+GainMeter::update_meters()
 {
-       for (vector<MeterInfo>::iterator i = meters.begin(); i < meters.end(); i++) {
-               (*i).meter->clear();
+       char buf[32];
+       float mpeak = level_meter->update_meters();
+
+       if (mpeak > max_peak) {
+               max_peak = mpeak;
+               if (mpeak <= -200.0f) {
+                       peak_display.set_label (_("-inf"));
+               } else {
+                       snprintf (buf, sizeof(buf), "%.1f", mpeak);
+                       peak_display.set_label (buf);
+               }
+
+               if (mpeak >= 0.0f) {
+                       peak_display.set_name ("MixerStripPeakDisplayPeak");
+               }
        }
 }
 
index 1673e8ca073489a0be6858f27e74df8f65c003e4..f6c5f308544892c2f3478eb00975c84693bd11e4 100644 (file)
@@ -38,6 +38,7 @@
 #include <gtkmm2ext/slider_controller.h>
 
 #include "enums.h"
+#include "level_meter.h"
 
 namespace ARDOUR {
        class IO;
@@ -62,7 +63,6 @@ class GainMeter : public Gtk::VBox
        void update_gain_sensitive ();
 
        void update_meters ();
-       void update_meters_falloff ();
 
        void effective_gain_display ();
 
@@ -75,8 +75,6 @@ class GainMeter : public Gtk::VBox
        void set_fader_name (const char * name);
        PBD::Controllable& get_controllable() { return _io->gain_control(); }
 
-       void clear_meters ();
-
   private:
 
        friend class MixerStrip;
@@ -93,6 +91,7 @@ class GainMeter : public Gtk::VBox
        Gtk::HBox                    gain_display_box;
        Gtk::HBox                    fader_box;
        Gtk::DrawingArea             meter_metric_area;
+       LevelMeter                                       *level_meter;
 
        sigc::connection gain_watching;
 
@@ -129,28 +128,10 @@ class GainMeter : public Gtk::VBox
        void gain_activated ();
        bool gain_focused (GdkEventFocus*);
 
-       struct MeterInfo {
-           Gtkmm2ext::FastMeter *meter;
-           gint16          width;
-               int                             length;   
-           bool            packed;
-           
-           MeterInfo() { 
-                   meter = 0;
-                   width = 0;
-                       length = 0;
-                   packed = false;
-           }
-       };
-
-       guint16 regular_meter_width;
-       static const guint16 thin_meter_width = 2;
-       vector<MeterInfo>    meters;
        float       max_peak;
        
        Gtk::VBox*   fader_vbox;
        Gtk::HBox   hbox;
-       Gtk::HBox   meter_packer;
 
        void gain_adjusted ();
        void gain_changed (void *);
index 6ef920235d582d9bb013e95848b791200e0478df..166e1877b96029a240f40cfa7f8918e8f6dec8f4 100644 (file)
@@ -66,6 +66,7 @@ LevelMeter::LevelMeter (boost::shared_ptr<IO> io, Session& s)
        Config->ParameterChanged.connect (mem_fun (*this, &LevelMeter::parameter_changed));
        UI::instance()->theme_changed.connect (mem_fun(*this, &LevelMeter::on_theme_changed));
        ColorsChanged.connect (mem_fun (*this, &LevelMeter::color_handler));
+       max_peak = minus_infinity();
 }
 
 void
@@ -83,7 +84,7 @@ LevelMeter::~LevelMeter ()
        }
 }
 
-void
+float
 LevelMeter::update_meters ()
 {
        vector<MeterInfo>::iterator i;
@@ -95,8 +96,12 @@ LevelMeter::update_meters ()
                        peak = _io->peak_input_power (n);
                        (*i).meter->set (log_meter (peak));
                        mpeak = _io->max_peak_power(n);
+                       if (mpeak > max_peak) {
+                               max_peak = mpeak;
+                       }
                }
        }
+       return max_peak;
 }
 
 void
@@ -133,8 +138,9 @@ LevelMeter::hide_all_meters ()
 }
 
 void
-LevelMeter::setup_meters (int len)
+LevelMeter::setup_meters (int len, int initial_width)
 {
+       regular_meter_width = initial_width;
        uint32_t nmeters = _io->n_outputs();
        guint16 width;
 
index 240cc4b7853e4361f05423730afe41797798503c..60aeb18632b31bca71b8a09e13ed7bf39949616d 100644 (file)
@@ -61,11 +61,11 @@ class LevelMeter : public Gtk::HBox
 
        void update_gain_sensitive ();
 
-       void update_meters ();
+       float update_meters ();
        void update_meters_falloff ();
        void clear_meters ();
        void hide_meters ();
-       void setup_meters (int len=0);
+       void setup_meters (int len=0, int width=3);
 
   private:
 
@@ -89,11 +89,10 @@ class LevelMeter : public Gtk::HBox
            }
        };
 
-       static const guint16 regular_meter_width = 3;
+       guint16 regular_meter_width;
        static const guint16 thin_meter_width = 2;
        vector<MeterInfo>    meters;
-
-       //Gtk::HBox   meter_packer;
+       float       max_peak;
        
        void hide_all_meters ();