diff options
author | Doug McLain <doug@nostar.net> | 2008-03-21 07:08:05 +0000 |
---|---|---|
committer | Doug McLain <doug@nostar.net> | 2008-03-21 07:08:05 +0000 |
commit | 525f02ca7553de76c527fae4910569a1ed4a86cf (patch) | |
tree | 107646c810354720e364ecd157fa91f478e0b91a | |
parent | caaa0470deae42e128f37c67f388d0e4d694439b (diff) |
Undo 3160 for now. The canvas stops updating when the mixer is open (but only on one of 3 machines) so I obviously broke something
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3161 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 4 | ||||
-rw-r--r-- | gtk2_ardour/gain_meter.cc | 174 | ||||
-rw-r--r-- | gtk2_ardour/gain_meter.h | 23 | ||||
-rw-r--r-- | gtk2_ardour/level_meter.cc | 10 | ||||
-rw-r--r-- | gtk2_ardour/level_meter.h | 9 |
5 files changed, 178 insertions, 42 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index a465eed360..180b4701f6 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1392,6 +1392,7 @@ ARDOUR_UI::remove_last_capture() void ARDOUR_UI::transport_record (bool roll) { + if (session) { switch (session->record_status()) { case Session::Disabled: @@ -1417,6 +1418,7 @@ ARDOUR_UI::transport_record (bool roll) session->disable_record (false, true); } } + cerr << "ARDOUR_UI::transport_record () called roll = " << roll << " session->record_status() = " << session->record_status() << endl; } void @@ -1430,6 +1432,8 @@ ARDOUR_UI::transport_roll () rolling = session->transport_rolling (); + cerr << "ARDOUR_UI::transport_roll () called session->record_status() = " << session->record_status() << endl; + if (session->get_play_loop()) { session->request_play_loop (false); auto_loop_button.set_visual_state (1); diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 2ef72aed21..ac4da8507b 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -73,7 +73,8 @@ 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 ("") + gain_automation_state_button (""), + regular_meter_width(5) { if (slider == 0) { @@ -90,8 +91,6 @@ 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"); @@ -118,6 +117,8 @@ 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"); @@ -150,7 +151,7 @@ GainMeter::GainMeter (boost::shared_ptr<IO> io, Session& s) */ gain_display_box.pack_end (peak_display, true, true); - hbox.pack_end (*level_meter, true, true); + hbox.pack_end (meter_packer, true, true); if (!r->hidden()) { @@ -194,6 +195,8 @@ 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 (); @@ -212,7 +215,7 @@ void GainMeter::set_width (Width w, int len) { _width = w; - level_meter->setup_meters (len); + setup_meters (len); } Glib::RefPtr<Gdk::Pixmap> @@ -313,21 +316,84 @@ GainMeter::~GainMeter () delete meter_menu; } - if (level_meter) { - delete level_meter; + for (vector<MeterInfo>::iterator i = meters.begin(); i != meters.end(); i++) { + if ((*i).meter) { + delete (*i).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; - level_meter->hide_meters(); + 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; + } + } if (remove_metric_area) { if (meter_metric_area.get_parent()) { - level_meter->remove (meter_metric_area); + meter_packer.remove (meter_metric_area); } } } @@ -335,11 +401,74 @@ GainMeter::hide_all_meters () void GainMeter::setup_meters (int len) { - level_meter->pack_end (meter_metric_area, false, false); + 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); meter_metric_area.show_all (); - level_meter->setup_meters(len, 5); - -} + + 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; +} int GainMeter::get_gm_width () @@ -408,7 +537,7 @@ GainMeter::meter_button_release (GdkEventButton* ev, uint32_t which) { switch (ev->button) { case 1: - level_meter->clear_meters(); + meters[which].meter->clear(); max_peak = minus_infinity(); peak_display.set_label (_("-inf")); peak_display.set_name ("MixerStripPeakDisplay"); @@ -830,21 +959,10 @@ GainMeter::gain_automation_state_changed () } } -void -GainMeter::update_meters() +void GainMeter::clear_meters () { - 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"); + for (vector<MeterInfo>::iterator i = meters.begin(); i < meters.end(); i++) { + (*i).meter->clear(); } } diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 4aa2a679aa..ba6984088d 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -38,7 +38,6 @@ #include <gtkmm2ext/slider_controller.h> #include "enums.h" -#include "level_meter.h" namespace ARDOUR { class IO; @@ -63,6 +62,7 @@ class GainMeter : public Gtk::VBox void update_gain_sensitive (); void update_meters (); + void update_meters_falloff (); void effective_gain_display (); @@ -74,6 +74,8 @@ 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; @@ -90,7 +92,6 @@ 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; @@ -127,10 +128,28 @@ 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 *); diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 166e1877b9..6ef920235d 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -66,7 +66,6 @@ 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 @@ -84,7 +83,7 @@ LevelMeter::~LevelMeter () } } -float +void LevelMeter::update_meters () { vector<MeterInfo>::iterator i; @@ -96,12 +95,8 @@ 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 @@ -138,9 +133,8 @@ LevelMeter::hide_all_meters () } void -LevelMeter::setup_meters (int len, int initial_width) +LevelMeter::setup_meters (int len) { - 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 60aeb18632..240cc4b785 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 (); - float update_meters (); + void update_meters (); void update_meters_falloff (); void clear_meters (); void hide_meters (); - void setup_meters (int len=0, int width=3); + void setup_meters (int len=0); private: @@ -89,10 +89,11 @@ class LevelMeter : public Gtk::HBox } }; - guint16 regular_meter_width; + static const guint16 regular_meter_width = 3; static const guint16 thin_meter_width = 2; vector<MeterInfo> meters; - float max_peak; + + //Gtk::HBox meter_packer; void hide_all_meters (); |