From 807bc4c3d6c619244ac01d6be8ad98109140e3e6 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 4 May 2009 17:05:55 +0000 Subject: [PATCH] Reconfigure GUI meters when route I/O configuration changes. git-svn-id: svn://localhost/ardour2/branches/3.0@5037 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/gain_meter.cc | 2 +- gtk2_ardour/gain_meter.h | 6 +-- gtk2_ardour/level_meter.cc | 70 ++++++++++++++++------------------ gtk2_ardour/level_meter.h | 31 ++++++++------- libs/ardour/ardour/processor.h | 5 ++- libs/ardour/meter.cc | 4 ++ libs/ardour/processor.cc | 2 + 7 files changed, 60 insertions(+), 60 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 3540842a83..f06597253c 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -165,7 +165,7 @@ GainMeterBase::set_io (boost::shared_ptr io) _io = io; - level_meter->set_io (_io); + level_meter->set_meter (_io->peak_meter()); gain_slider->set_controllable (_io->gain_control()); boost::shared_ptr r; diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 1352532331..29d941f49a 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -58,7 +58,7 @@ namespace Gtk { class GainMeterBase : virtual public sigc::trackable { public: - GainMeterBase ( ARDOUR::Session&, const Glib::RefPtr& pix, + GainMeterBase (ARDOUR::Session&, const Glib::RefPtr& pix, bool horizontal); virtual ~GainMeterBase (); @@ -94,7 +94,7 @@ class GainMeterBase : virtual public sigc::trackable Gtkmm2ext::FocusEntry gain_display; Gtk::Button peak_display; Gtk::DrawingArea meter_metric_area; - LevelMeter *level_meter; + LevelMeter *level_meter; sigc::connection gain_watching; @@ -126,7 +126,7 @@ class GainMeterBase : virtual public sigc::trackable void gain_activated (); bool gain_focused (GdkEventFocus*); - float max_peak; + float max_peak; void gain_adjusted (); void gain_changed (); diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 96ad6879ca..675ce04fc8 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -19,9 +19,6 @@ #include -#include "ardour/io.h" -#include "ardour/route.h" -#include "ardour/route_group.h" #include "ardour/session.h" #include "ardour/session_route.h" #include "ardour/dB.h" @@ -43,7 +40,6 @@ #include "public_editor.h" #include "ardour/session.h" -#include "ardour/route.h" #include "i18n.h" @@ -60,7 +56,8 @@ using namespace std; LevelMeter::LevelMeter (Session& s) : _session (s) - + , _meter (0) + , meter_length (0) { set_spacing (1); Config->ParameterChanged.connect (mem_fun (*this, &LevelMeter::parameter_changed)); @@ -83,9 +80,12 @@ LevelMeter::~LevelMeter () } void -LevelMeter::set_io (boost::shared_ptr io) +LevelMeter::set_meter (PeakMeter& meter) { - _io = io; + _configuration_connection.disconnect(); + _meter = &meter; + _configuration_connection = _meter->ConfigurationChanged.connect( + mem_fun(*this, &LevelMeter::configuration_changed)); } float @@ -97,9 +97,9 @@ LevelMeter::update_meters () for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) { if ((*i).packed) { - peak = _io->peak_meter().peak_power (n); + peak = _meter->peak_power (n); (*i).meter->set (log_meter (peak)); - mpeak = _io->peak_meter().max_peak_power(n); + mpeak = _meter->max_peak_power(n); if (mpeak > max_peak) { max_peak = mpeak; } @@ -133,9 +133,15 @@ LevelMeter::parameter_changed(const char* parameter_name) } void -LevelMeter::hide_all_meters () +LevelMeter::configuration_changed(ChanCount in, ChanCount out) { + color_changed = true; + setup_meters (meter_length, regular_meter_width); +} +void +LevelMeter::hide_all_meters () +{ for (vector::iterator i = meters.begin(); i != meters.end(); ++i) { if ((*i).packed) { remove (*((*i).meter)); @@ -147,37 +153,19 @@ LevelMeter::hide_all_meters () void LevelMeter::setup_meters (int len, int initial_width) { - if (!_io) { + if (!_meter) { return; /* do it later */ } - uint32_t nmeters = _io->n_outputs().n_total(); + int32_t nmidi = _meter->input_streams().n_midi(); + uint32_t nmeters = _meter->input_streams().n_total(); regular_meter_width = initial_width; + meter_length = len; 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().n_total(); - break; - case MeterPostFader: - nmeters = r->n_outputs().n_total(); - break; - } - - } else { - - nmeters = _io->n_outputs().n_total(); - - } - if (nmeters == 0) { return; } @@ -192,15 +180,21 @@ LevelMeter::setup_meters (int len, int initial_width) meters.push_back (MeterInfo()); } - - 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 << "LevelMeter::setup_meters() called color_changed = " << color_changed << " colors: " << endl;//DEBUG for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) { + uint32_t b, m, t, c; + if (n < nmidi) { + b = ARDOUR_UI::config()->canvasvar_MidiNoteMeterColorBase.get(); + m = ARDOUR_UI::config()->canvasvar_MidiNoteMeterColorMid.get(); + t = ARDOUR_UI::config()->canvasvar_MidiNoteMeterColorTop.get(); + c = ARDOUR_UI::config()->canvasvar_MeterColorClip.get(); + } else { + b = ARDOUR_UI::config()->canvasvar_MeterColorBase.get(); + m = ARDOUR_UI::config()->canvasvar_MeterColorMid.get(); + t = ARDOUR_UI::config()->canvasvar_MeterColorTop.get(); + c = ARDOUR_UI::config()->canvasvar_MeterColorClip.get(); + } 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); diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h index ee2f03e3df..ac91cdfbd0 100644 --- a/gtk2_ardour/level_meter.h +++ b/gtk2_ardour/level_meter.h @@ -39,14 +39,11 @@ #include "enums.h" namespace ARDOUR { - class IO; class Session; - class Route; - class RouteGroup; + class PeakMeter; } namespace Gtkmm2ext { class FastMeter; - class BarController; } namespace Gtk { class Menu; @@ -58,7 +55,7 @@ class LevelMeter : public Gtk::HBox LevelMeter (ARDOUR::Session&); ~LevelMeter (); - virtual void set_io (boost::shared_ptr io); + virtual void set_meter (ARDOUR::PeakMeter& meter); void update_gain_sensitive (); @@ -69,18 +66,16 @@ class LevelMeter : public Gtk::HBox void setup_meters (int len=0, int width=3); private: - - //friend class MixerStrip; - boost::shared_ptr _io; - ARDOUR::Session& _session; + ARDOUR::Session& _session; + ARDOUR::PeakMeter* _meter; Width _width; struct MeterInfo { Gtkmm2ext::FastMeter *meter; - gint16 width; - int length; - bool packed; + gint16 width; + int length; + bool packed; MeterInfo() { meter = 0; @@ -90,15 +85,19 @@ class LevelMeter : public Gtk::HBox } }; - guint16 regular_meter_width; - static const guint16 thin_meter_width = 2; - std::vector meters; - float max_peak; + guint16 regular_meter_width; + int meter_length; + static const guint16 thin_meter_width = 2; + std::vector meters; + float max_peak; + + sigc::connection _configuration_connection; void hide_all_meters (); gint meter_button_release (GdkEventButton*, uint32_t); void parameter_changed (const char*); + void configuration_changed (ARDOUR::ChanCount in, ARDOUR::ChanCount out); void on_theme_changed (); bool style_changed; diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h index c2c23b8f67..1167930d61 100644 --- a/libs/ardour/ardour/processor.h +++ b/libs/ardour/ardour/processor.h @@ -107,8 +107,9 @@ class Processor : public SessionObject, public AutomatableControls, public Laten static sigc::signal ProcessorCreated; - sigc::signal ActiveChanged; - sigc::signal PlacementChanged; + sigc::signal ActiveChanged; + sigc::signal PlacementChanged; + sigc::signal ConfigurationChanged; protected: int _pending_active; diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index bdb8fec708..ec2a136fb5 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -98,12 +98,16 @@ PeakMeter::reset_max () bool PeakMeter::configure_io (ChanCount in, ChanCount out) { + cerr << "METER CONFIGURE IO " << in << " -> " << out << endl; + /* we're transparent no matter what. fight the power. */ if (out != in) { return false; } uint32_t limit = in.n_total(); + + cerr << "METER LIMIT " << limit << endl; while (_peak_power.size() > limit) { _peak_power.pop_back(); diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc index 8ea45de406..63848e8c40 100644 --- a/libs/ardour/processor.cc +++ b/libs/ardour/processor.cc @@ -256,5 +256,7 @@ Processor::configure_io (ChanCount in, ChanCount out) _configured_output = out; _configured = true; + ConfigurationChanged.emit (in, out); + return true; } -- 2.30.2