From caaa0470deae42e128f37c67f388d0e4d694439b Mon Sep 17 00:00:00 2001 From: Doug McLain Date: Thu, 20 Mar 2008 14:27:23 +0000 Subject: build the meters in GainMeter from the LevelMeters class instead of doing it all over again git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3160 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/gain_meter.cc | 174 ++++++++------------------------------------- gtk2_ardour/gain_meter.h | 23 +----- gtk2_ardour/level_meter.cc | 10 ++- gtk2_ardour/level_meter.h | 9 ++- 4 files changed, 42 insertions(+), 174 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index ac4da8507b..2ef72aed21 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -73,8 +73,7 @@ GainMeter::GainMeter (boost::shared_ptr 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, 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, 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, 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, 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 @@ -316,84 +313,21 @@ GainMeter::~GainMeter () delete meter_menu; } - for (vector::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::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::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::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 (_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,21 @@ GainMeter::gain_automation_state_changed () } } -void GainMeter::clear_meters () +void +GainMeter::update_meters() { - for (vector::iterator i = meters.begin(); i < meters.end(); i++) { - (*i).meter->clear(); + char buf[32]; + float mpeak = level_meter->update_meters(); + + 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"); } } diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index ba6984088d..4aa2a679aa 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -38,6 +38,7 @@ #include #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 (); @@ -74,8 +74,6 @@ class GainMeter : public Gtk::VBox void set_meter_strip_name (const char * name); void set_fader_name (const char * name); - void clear_meters (); - private: friend class MixerStrip; @@ -92,6 +90,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; @@ -128,28 +127,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 meters; float max_peak; Gtk::VBox* fader_vbox; Gtk::HBox hbox; - Gtk::HBox meter_packer; void gain_adjusted (); void gain_changed (void *); diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 6ef920235d..166e1877b9 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -66,6 +66,7 @@ LevelMeter::LevelMeter (boost::shared_ptr 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::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; diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h index 240cc4b785..60aeb18632 100644 --- a/gtk2_ardour/level_meter.h +++ b/gtk2_ardour/level_meter.h @@ -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 meters; - - //Gtk::HBox meter_packer; + float max_peak; void hide_all_meters (); -- cgit v1.2.3