From 406070584df05cbc8877fcb005313c2e1ad25f02 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 15:12:13 +0200 Subject: fix typo --- gtk2_ardour/rc_option_editor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index f78f5fc182..3f984eab29 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -831,7 +831,7 @@ public: t->attach (*l, 0, 1, 1, 2, FILL); t->attach (_video_server_url_entry, 1, 2, 1, 2, FILL); Gtkmm2ext::UI::instance()->set_tip (_video_server_url_entry, - _("Base URL of the video-server including http prefix. This is usually 'http://hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the video-server is runing locally")); + _("Base URL of the video-server including http prefix. This is usually 'http://hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when the video-server is running locally")); l = manage (new Label (_("Video Folder:"))); l->set_alignment (0, 0.5); -- cgit v1.2.3 From 67369333851511364cb9048de39aaad3282ce697 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 22:26:51 +0200 Subject: move mixer-metric pattern to the left --- gtk2_ardour/gain_meter.cc | 2 +- gtk2_ardour/meter_patterns.cc | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 1148c6b889..d67bf77dc7 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -944,10 +944,10 @@ GainMeter::GainMeter (Session* s, int fader_length) meter_ticks2_area.signal_expose_event().connect ( sigc::mem_fun(*this, &GainMeter::meter_ticks2_expose)); + meter_hbox.pack_start (meter_metric_area, false, false); meter_hbox.pack_start (meter_ticks1_area, false, false); meter_hbox.pack_start (meter_alignment, false, false); meter_hbox.pack_start (meter_ticks2_area, false, false); - meter_hbox.pack_start (meter_metric_area, false, false); } void diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 7818711922..2704e4555d 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -224,13 +224,14 @@ meter_render_metrics (Gtk::Widget& w, vector types) { Glib::RefPtr win (w.get_window()); - bool tickleft; + bool tickleft, tickright; bool background; gint width, height; win->get_size (width, height); tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left"; - background = types.size() == 0 || tickleft || w.get_name().substr(w.get_name().length() - 5) == "Right"; + tickright = w.get_name().substr(w.get_name().length() - 5) == "Right"; + background = types.size() == 0 || tickleft || tickright; cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); cairo_t* cr = cairo_create (surface); @@ -296,6 +297,11 @@ meter_render_metrics (Gtk::Widget& w, vector types) } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); + + if (!tickleft && !tickright && (*i) == DataType::AUDIO) { + tickleft = true; + } + } std::map points; @@ -366,11 +372,12 @@ meter_render_metrics (Gtk::Widget& w, vector types) if (tickleft) { cairo_move_to(cr, width-1.5, pos + .5); cairo_line_to(cr, width, pos + .5); - } else { + cairo_stroke (cr); + } else if (tickright) { cairo_move_to(cr, 0, pos + .5); cairo_line_to(cr, 1.5, pos + .5); + cairo_stroke (cr); } - cairo_stroke (cr); break; case DataType::MIDI: cairo_set_line_width (cr, 1.0); @@ -378,12 +385,15 @@ meter_render_metrics (Gtk::Widget& w, vector types) snprintf (buf, sizeof (buf), "%3d", j->first); pos = 1 + height - (gint) rintf (height * fraction); pos = min (pos, height); +#if 0 if (tickleft) { cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); - } else { + cairo_fill(cr); + } else if (tickright) { cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); + cairo_fill(cr); } - cairo_fill(cr); +#endif break; } -- cgit v1.2.3 From a8a4c1858c36286890c20fec18029b3bc94bbb66 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 22:39:55 +0200 Subject: use ArdourMono font for metric patterns --- gtk2_ardour/meter_patterns.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 2704e4555d..9a2cab00b5 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -244,9 +244,7 @@ meter_render_metrics (Gtk::Widget& w, vector types) Pango::AttrFontDesc* font_attr; Pango::FontDescription font; - font = Pango::FontDescription (""); // use defaults - //font = get_font_for_style("gain-fader"); - //font = w.get_style()->get_font(); + font = Pango::FontDescription ("ArdourMono"); font.set_weight (Pango::WEIGHT_NORMAL); font.set_size (9.0 * PANGO_SCALE); @@ -256,12 +254,12 @@ meter_render_metrics (Gtk::Widget& w, vector types) font.set_weight (Pango::WEIGHT_ULTRALIGHT); font.set_stretch (Pango::STRETCH_ULTRA_CONDENSED); - font.set_size (7.5 * PANGO_SCALE); + font.set_size (8.0 * PANGO_SCALE); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); midi_font_attributes.change (*font_attr); delete font_attr; - font.set_size (7.0 * PANGO_SCALE); + font.set_size (6.0 * PANGO_SCALE); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); unit_font_attributes.change (*font_attr); delete font_attr; -- cgit v1.2.3 From d51a1ec06b707ad1000bb770afeabfe0987a747b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 22:45:08 +0200 Subject: add a stripe-pattern to the meters --- libs/gtkmm2ext/fastmeter.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc index 6ea1a6dd4b..817b11ff6c 100644 --- a/libs/gtkmm2ext/fastmeter.cc +++ b/libs/gtkmm2ext/fastmeter.cc @@ -189,6 +189,18 @@ FastMeter::generate_meter_pattern ( cairo_set_source (tc, pat); cairo_rectangle (tc, 0, 0, width, height); cairo_fill (tc); + + cairo_save (tc); + cairo_set_line_width(tc, 1.0); + cairo_set_source_rgba(tc, .1, .1, .1, .5); + //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE); + for (float y=.5; y < height; y+= 2.0) { + cairo_move_to(tc, 0, y); + cairo_line_to(tc, width, y); + cairo_stroke (tc); + } + cairo_restore (tc); + cairo_set_source (tc, shade_pattern); cairo_rectangle (tc, 0, 0, width, height); cairo_fill (tc); -- cgit v1.2.3 From 1128c4eeda8cd03a7b4c2ca97b29c615ddb37af5 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 23:04:52 +0200 Subject: meter metrics: ignore global font-scaling --- gtk2_ardour/meter_patterns.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 9a2cab00b5..13b32e29e4 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -245,21 +245,22 @@ meter_render_metrics (Gtk::Widget& w, vector types) Pango::FontDescription font; font = Pango::FontDescription ("ArdourMono"); + double fixfontsize = 81920.0 / (double) ARDOUR::Config->get_font_scale(); font.set_weight (Pango::WEIGHT_NORMAL); - font.set_size (9.0 * PANGO_SCALE); + font.set_size (9.0 * PANGO_SCALE * fixfontsize); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); audio_font_attributes.change (*font_attr); delete font_attr; font.set_weight (Pango::WEIGHT_ULTRALIGHT); font.set_stretch (Pango::STRETCH_ULTRA_CONDENSED); - font.set_size (8.0 * PANGO_SCALE); + font.set_size (8.0 * PANGO_SCALE * fixfontsize); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); midi_font_attributes.change (*font_attr); delete font_attr; - font.set_size (6.0 * PANGO_SCALE); + font.set_size (6.0 * PANGO_SCALE * fixfontsize); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); unit_font_attributes.change (*font_attr); delete font_attr; -- cgit v1.2.3 From 3475ea4b2271bc526877b33bb8ae1365948d795a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 23:11:48 +0200 Subject: don't hide ticks in narrow mode --- gtk2_ardour/gain_meter.cc | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index d67bf77dc7..d9829c7af3 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -278,16 +278,12 @@ GainMeterBase::setup_meters (int len) switch (_width) { case Wide: - meter_ticks1_area.show(); - meter_ticks2_area.show(); if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) { meter_width = 10; } break; case Narrow: meter_width = 2; - meter_ticks1_area.hide(); - meter_ticks2_area.hide(); break; } level_meter->setup_meters(len, meter_width); @@ -1006,7 +1002,7 @@ GainMeter::get_gm_width () if (_width == Wide) return max(sz.width * 2, min_w * 2) + 6; else - return sz.width + min_w + 6; + return sz.width + min_w + 12; } -- cgit v1.2.3 From 55c5a76e8bec0c9f485f89f63558c1baf00e74b2 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 17 Jul 2013 23:33:23 +0200 Subject: revert to right-side mixer metric-labels --- gtk2_ardour/gain_meter.cc | 8 ++++++-- gtk2_ardour/meter_patterns.cc | 13 +++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index d9829c7af3..1148c6b889 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -278,12 +278,16 @@ GainMeterBase::setup_meters (int len) switch (_width) { case Wide: + meter_ticks1_area.show(); + meter_ticks2_area.show(); if (_route && _route->shared_peak_meter()->input_streams().n_total() == 1) { meter_width = 10; } break; case Narrow: meter_width = 2; + meter_ticks1_area.hide(); + meter_ticks2_area.hide(); break; } level_meter->setup_meters(len, meter_width); @@ -940,10 +944,10 @@ GainMeter::GainMeter (Session* s, int fader_length) meter_ticks2_area.signal_expose_event().connect ( sigc::mem_fun(*this, &GainMeter::meter_ticks2_expose)); - meter_hbox.pack_start (meter_metric_area, false, false); meter_hbox.pack_start (meter_ticks1_area, false, false); meter_hbox.pack_start (meter_alignment, false, false); meter_hbox.pack_start (meter_ticks2_area, false, false); + meter_hbox.pack_start (meter_metric_area, false, false); } void @@ -1002,7 +1006,7 @@ GainMeter::get_gm_width () if (_width == Wide) return max(sz.width * 2, min_w * 2) + 6; else - return sz.width + min_w + 12; + return sz.width + min_w + 6; } diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 13b32e29e4..35ba8491be 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -233,6 +233,10 @@ meter_render_metrics (Gtk::Widget& w, vector types) tickright = w.get_name().substr(w.get_name().length() - 5) == "Right"; background = types.size() == 0 || tickleft || tickright; + if (!tickleft && !tickright) { + tickright = true; + } + cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); cairo_t* cr = cairo_create (surface); Glib::RefPtr layout = Pango::Layout::create(w.get_pango_context()); @@ -296,11 +300,6 @@ meter_render_metrics (Gtk::Widget& w, vector types) } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - - if (!tickleft && !tickright && (*i) == DataType::AUDIO) { - tickleft = true; - } - } std::map points; @@ -384,7 +383,6 @@ meter_render_metrics (Gtk::Widget& w, vector types) snprintf (buf, sizeof (buf), "%3d", j->first); pos = 1 + height - (gint) rintf (height * fraction); pos = min (pos, height); -#if 0 if (tickleft) { cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); cairo_fill(cr); @@ -392,7 +390,6 @@ meter_render_metrics (Gtk::Widget& w, vector types) cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); cairo_fill(cr); } -#endif break; } @@ -403,7 +400,7 @@ meter_render_metrics (Gtk::Widget& w, vector types) int tw, th; layout->get_pixel_size(tw, th); - int p = pos - (th / 2); + int p = pos - (th / 2) - 1; p = min (p, height - th); p = max (p, 0); -- cgit v1.2.3 From d2c39db64db72eb364246327aafda871a71e0d8e Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 18 Jul 2013 09:00:24 +0200 Subject: mixer metric background color fix (MIDI & inactive) fixes http://tracker.ardour.org/view.php?id=5594 --- gtk2_ardour/gain_meter.cc | 29 +++++++++++++++++++++++------ gtk2_ardour/gain_meter.h | 3 ++- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 1148c6b889..f5d4f1afa2 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -950,6 +950,8 @@ GainMeter::GainMeter (Session* s, int fader_length) meter_hbox.pack_start (meter_metric_area, false, false); } +GainMeter::~GainMeter () { } + void GainMeter::set_controls (boost::shared_ptr r, boost::shared_ptr meter, @@ -977,6 +979,10 @@ GainMeter::set_controls (boost::shared_ptr r, } + if (_route) { + _route->active_changed.connect (model_connections, invalidator (*this), boost::bind (&GainMeter::route_active_changed, this), gui_context ()); + } + /* if we have a non-hidden route (ie. we're not the click or the auditioner), pack some route-dependent stuff. @@ -1067,18 +1073,21 @@ GainMeter::meter_configuration_changed (ChanCount c) set_meter_strip_name ("AudioBusMetricsInactive"); } } - else if (type == (1 << DataType::AUDIO)) { + else if ( + (type == (1 << DataType::MIDI)) + || (_route && boost::dynamic_pointer_cast(_route)) + ) { if (!_route || _route->active()) { - set_meter_strip_name ("AudioTrackMetrics"); + set_meter_strip_name ("MidiTrackMetrics"); } else { - set_meter_strip_name ("AudioTrackMetricsInactive"); + set_meter_strip_name ("MidiTrackMetricsInactive"); } } - else if (type == (1 << DataType::MIDI)) { + else if (type == (1 << DataType::AUDIO)) { if (!_route || _route->active()) { - set_meter_strip_name ("MidiTrackMetrics"); + set_meter_strip_name ("AudioTrackMetrics"); } else { - set_meter_strip_name ("MidiTrackMetricsInactive"); + set_meter_strip_name ("AudioTrackMetricsInactive"); } } else { if (!_route || _route->active()) { @@ -1090,6 +1099,14 @@ GainMeter::meter_configuration_changed (ChanCount c) meter_clear_pattern_cache(4); } +void +GainMeter::route_active_changed () +{ + if (_meter) { + meter_configuration_changed (_meter->input_streams ()); + } +} + void GainMeter::meter_type_changed (MeterType t) { diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index 9353cfeaad..0c698d54ee 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -201,7 +201,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox { public: GainMeter (ARDOUR::Session*, int); - ~GainMeter () {} + virtual ~GainMeter (); virtual void set_controls (boost::shared_ptr route, boost::shared_ptr meter, @@ -210,6 +210,7 @@ class GainMeter : public GainMeterBase, public Gtk::VBox int get_gm_width (); void setup_meters (int len=0); void set_type (ARDOUR::MeterType); + void route_active_changed (); protected: void hide_all_meters (); -- cgit v1.2.3 From f0a3f1ea52ab1a2c142e904a3fce110092ac1106 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 18 Jul 2013 09:01:47 +0200 Subject: reset meter when meter-point changes --- libs/ardour/meter.cc | 19 ++++++++++++++----- libs/ardour/route.cc | 3 +++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 90f0977e4d..961a489a63 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -129,6 +129,16 @@ PeakMeter::reset_max () _max_peak_power[i] = -INFINITY; _max_peak_signal[i] = 0; } + + const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi()); + + for (size_t n = 0; n < _peak_signal.size(); ++n) { + if (n < n_midi) { + _visible_peak_power[n] = 0; + } else { + _visible_peak_power[n] = -INFINITY; + } + } } bool @@ -159,7 +169,6 @@ PeakMeter::reflect_inputs (const ChanCount& in) const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ()); const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi()); - const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < limit; ++n) { if (n < n_midi) { @@ -169,10 +178,7 @@ PeakMeter::reflect_inputs (const ChanCount& in) } } - for (size_t n = 0; n < n_audio; ++n) { - _kmeter[n]->reset(); - } - + reset(); reset_max(); ConfigurationChanged (in, in); /* EMIT SIGNAL */ @@ -212,6 +218,9 @@ PeakMeter::reset_max_channels (const ChanCount& chn) _kmeter.push_back(new Kmeterdsp()); } assert(_kmeter.size() == n_audio); + + reset(); + reset_max(); } /** To be driven by the Meter signal from IO. diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index dad1922488..5c794fb379 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -3152,6 +3152,9 @@ Route::set_meter_point (MeterPoint p, bool force) */ } + _meter->reset(); + _meter->reset_max(); + meter_change (); /* EMIT SIGNAL */ bool const meter_visibly_changed = (_meter->display_to_user() != meter_was_visible_to_user); -- cgit v1.2.3 From b91caf557ce70468146bcb87e09b734f3d5f06f6 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 19 Jul 2013 10:37:00 +0200 Subject: adjust meter-width when configuration changes fixes http://tracker.ardour.org/view.php?id=5592 --- gtk2_ardour/gain_meter.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index f5d4f1afa2..caa1fe954a 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -1096,6 +1096,8 @@ GainMeter::meter_configuration_changed (ChanCount c) set_meter_strip_name ("AudioMidiTrackMetricsInactive"); } } + + setup_meters(); meter_clear_pattern_cache(4); } -- cgit v1.2.3 From 649cf189e87a9472581cd339eda6718cfd067e32 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 19 Jul 2013 10:37:49 +0200 Subject: update processor-name (short|long) when mixer-strip width changes --- gtk2_ardour/processor_box.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 7d2e39639b..476bb73612 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -213,6 +213,7 @@ void ProcessorEntry::set_enum_width (Width w) { _width = w; + _button.set_text (name (_width)); } void -- cgit v1.2.3 From bf408d60c896d1a072a353f79269ac3bc1600464 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Fri, 19 Jul 2013 12:04:58 +0100 Subject: Wrap calls to add_shortcut_folder() in try { ... } block. Gtk::FileChooserButton::add_shortcut_folder() throws a Glib::Error exception if the folder being added already has a shortcut, causing the 'New session' dialogue to appear empty when choosing 'New...' from the Session menu. This happens if Ardour's default session folder is set to a location that has a standard shortcut in the Gtk file chooser, e.g. the user's home directory, desktop, &c. Catch the exception in ArdourStartup::setup_new_session_page(), so that the 'New session' dialogue appears as expected, and likewise in ARDOUR_UI::open_session() to avoid a similar problem there. Fixes #5591. --- gtk2_ardour/ardour_ui.cc | 9 ++++++++- gtk2_ardour/startup.cc | 10 +++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 3bd2768a4c..556dee99fe 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1488,7 +1488,14 @@ ARDOUR_UI::open_session () open_session_selector->set_current_folder(Config->get_default_session_parent_dir()); } - open_session_selector->add_shortcut_folder (Config->get_default_session_parent_dir()); + string default_session_folder = Config->get_default_session_parent_dir(); + try { + /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */ + open_session_selector->add_shortcut_folder (default_session_folder); + } + catch (Glib::Error & e) { + std::cerr << "open_session_selector->add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl; + } FileFilter session_filter; session_filter.add_pattern ("*.ardour"); diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index 0ec79667ab..e24e7d6989 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -805,7 +805,15 @@ ArdourStartup::setup_new_session_page () string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR); session_parent_dir = session_parent_dir.substr(0, last_dir_sep); new_folder_chooser.set_current_folder (session_parent_dir); - new_folder_chooser.add_shortcut_folder (poor_mans_glob (Config->get_default_session_parent_dir())); + string default_session_folder = poor_mans_glob (Config->get_default_session_parent_dir()); + + try { + /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */ + new_folder_chooser.add_shortcut_folder (default_session_folder); + } + catch (Glib::Error & e) { + std::cerr << "new_folder_chooser.add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl; + } } else { new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir())); } -- cgit v1.2.3 From e294e78fefe77897a9a014d7b84d436a9aff6f9b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 18 Jul 2013 11:27:21 +0200 Subject: re-nice rendering of channel-splitting icon --- gtk2_ardour/processor_box.cc | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 476bb73612..1c5c47c41e 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -659,7 +659,8 @@ PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev) cairo_rectangle (cr, ev->area.x, ev->area.y, ev->area.width, ev->area.height); cairo_clip (cr); - cairo_set_line_width (cr, 1); + cairo_set_line_width (cr, 1.5); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); Gtk::Allocation a = get_allocation(); double const width = a.get_width(); @@ -674,12 +675,19 @@ PluginInsertProcessorEntry::SplittingIcon::on_expose_event (GdkEventExpose* ev) Gdk::Color const fg = get_style()->get_fg (STATE_NORMAL); cairo_set_source_rgb (cr, fg.get_red_p (), fg.get_green_p (), fg.get_blue_p ()); - cairo_move_to (cr, width * 0.3, height); - cairo_line_to (cr, width * 0.3, height * 0.5); - cairo_line_to (cr, width * 0.7, height * 0.5); - cairo_line_to (cr, width * 0.7, height); - cairo_move_to (cr, width * 0.5, height * 0.5); - cairo_line_to (cr, width * 0.5, 0); + const float si_l = rint(width * 0.3) + .5; + const float si_c = rint(width * 0.5) + .5; + const float si_r = rint(width * 0.7) + .5; + const float si_m = rint(height * 0.5) + .5; + + cairo_move_to (cr, si_l, height); + cairo_line_to (cr, si_l, si_m); + cairo_line_to (cr, si_r, si_m); + cairo_line_to (cr, si_r, height); + + cairo_set_line_cap (cr, CAIRO_LINE_CAP_BUTT); + cairo_move_to (cr, si_c, si_m); + cairo_line_to (cr, si_c, 0); cairo_stroke (cr); return true; -- cgit v1.2.3 From 72aa1cd86cf04964f08e7ca0557f73afd1c96e83 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 22 Jul 2013 18:42:01 +0200 Subject: Revert "Revert new meter types (postponed until after 3.3 release)" This reverts commit d80f672e8487f459d76ab291958bffcded08f0fd. --- gtk2_ardour/meter_patterns.cc | 9 ++++ gtk2_ardour/meter_strip.cc | 3 ++ gtk2_ardour/mixer_strip.cc | 3 ++ libs/ardour/ardour/iec1ppmdsp.h | 51 ++++++++++++++++++++ libs/ardour/ardour/iec2ppmdsp.h | 51 ++++++++++++++++++++ libs/ardour/ardour/kmeterdsp.h | 46 ++++++++++++++++++ libs/ardour/ardour/meter.h | 10 +++- libs/ardour/ardour/types.h | 5 +- libs/ardour/ardour/vumeterdsp.h | 49 ++++++++++++++++++++ libs/ardour/enums.cc | 3 ++ libs/ardour/iec1ppmdsp.cc | 100 ++++++++++++++++++++++++++++++++++++++++ libs/ardour/iec2ppmdsp.cc | 100 ++++++++++++++++++++++++++++++++++++++++ libs/ardour/kmeterdsp.cc | 23 +++++---- libs/ardour/kmeterdsp.h | 45 ------------------ libs/ardour/meter.cc | 93 ++++++++++++++++++++++++++++++++----- libs/ardour/vumeterdsp.cc | 89 +++++++++++++++++++++++++++++++++++ libs/ardour/wscript | 3 ++ 17 files changed, 613 insertions(+), 70 deletions(-) create mode 100644 libs/ardour/ardour/iec1ppmdsp.h create mode 100644 libs/ardour/ardour/iec2ppmdsp.h create mode 100644 libs/ardour/ardour/kmeterdsp.h create mode 100644 libs/ardour/ardour/vumeterdsp.h create mode 100644 libs/ardour/iec1ppmdsp.cc create mode 100644 libs/ardour/iec2ppmdsp.cc delete mode 100644 libs/ardour/kmeterdsp.h create mode 100644 libs/ardour/vumeterdsp.cc diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 35ba8491be..d658a0b3ef 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -64,6 +64,15 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterKrms: return _("RMS + Peak"); break; + case MeterIEC1: + return _("DIN"); + break; + case MeterIEC2: + return _("EBU/BBC"); + break; + case MeterVU: + return _("VU"); + break; default: return _("???"); break; diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 44144114a4..3a8410867a 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -573,6 +573,9 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) _suspend_menu_callbacks = true; add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); MeterType cmt = _route->meter_type(); const std::string cmn = ArdourMeter::meter_type_string(cmt); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 6128780cf0..dec072b067 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2135,6 +2135,9 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU); int _strip_type; if (_route->is_master()) { diff --git a/libs/ardour/ardour/iec1ppmdsp.h b/libs/ardour/ardour/iec1ppmdsp.h new file mode 100644 index 0000000000..58dea97555 --- /dev/null +++ b/libs/ardour/ardour/iec1ppmdsp.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __IEC1PPMDSP_H +#define __IEC1PPMDSP_H + + +class Iec1ppmdsp +{ +public: + + Iec1ppmdsp (void); + ~Iec1ppmdsp (void); + + void process (float *p, int n); + float read (void); + void reset (); + + static void init (float fsamp); + +private: + + float _z1; // filter state + float _z2; // filter state + float _m; // max value since last read() + bool _res; // flag to reset m + + static float _w1; // attack filter coefficient + static float _w2; // attack filter coefficient + static float _w3; // release filter coefficient + static float _g; // gain factor +}; + + +#endif diff --git a/libs/ardour/ardour/iec2ppmdsp.h b/libs/ardour/ardour/iec2ppmdsp.h new file mode 100644 index 0000000000..3574a8bd3f --- /dev/null +++ b/libs/ardour/ardour/iec2ppmdsp.h @@ -0,0 +1,51 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __IEC2PPMDSP_H +#define __IEC2PPMDSP_H + + +class Iec2ppmdsp +{ +public: + + Iec2ppmdsp (void); + ~Iec2ppmdsp (void); + + void process (float *p, int n); + float read (void); + void reset (); + + static void init (float fsamp); + +private: + + float _z1; // filter state + float _z2; // filter state + float _m; // max value since last read() + bool _res; // flag to reset m + + static float _w1; // attack filter coefficient + static float _w2; // attack filter coefficient + static float _w3; // release filter coefficient + static float _g; // gain factor +}; + + +#endif diff --git a/libs/ardour/ardour/kmeterdsp.h b/libs/ardour/ardour/kmeterdsp.h new file mode 100644 index 0000000000..eca3c76695 --- /dev/null +++ b/libs/ardour/ardour/kmeterdsp.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2008-2011 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __KMETERDSP_H +#define __KMETERDSP_H + +class Kmeterdsp +{ +public: + + Kmeterdsp (void); + ~Kmeterdsp (void); + + void process (float *p, int n); + float read (); + void reset (); + + static void init (int fsamp); + +private: + + float _z1; // filter state + float _z2; // filter state + float _rms; // max rms value since last read() + bool _flag; // flag set by read(), resets _rms + + static float _omega; // ballistics filter constant. +}; + +#endif diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h index 31ebc76179..4ac140fd04 100644 --- a/libs/ardour/ardour/meter.h +++ b/libs/ardour/ardour/meter.h @@ -23,7 +23,11 @@ #include "ardour/types.h" #include "ardour/processor.h" #include "pbd/fastlog.h" -#include "kmeterdsp.h" + +#include "ardour/kmeterdsp.h" +#include "ardour/iec1ppmdsp.h" +#include "ardour/iec2ppmdsp.h" +#include "ardour/vumeterdsp.h" namespace ARDOUR { @@ -104,7 +108,11 @@ private: std::vector _visible_peak_power; std::vector _max_peak_signal; std::vector _max_peak_power; + std::vector _kmeter; + std::vector _iec1meter; + std::vector _iec2meter; + std::vector _vumeter; MeterType _meter_type; }; diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 05d6d0b27d..df7209b581 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -181,7 +181,10 @@ namespace ARDOUR { MeterMaxSignal = 0x01, MeterMaxPeak = 0x02, MeterPeak = 0x04, - MeterKrms = 0x08 + MeterKrms = 0x08, + MeterIEC1 = 0x10, + MeterIEC2 = 0x20, + MeterVU = 0x40 }; enum TrackMode { diff --git a/libs/ardour/ardour/vumeterdsp.h b/libs/ardour/ardour/vumeterdsp.h new file mode 100644 index 0000000000..86487e8e8e --- /dev/null +++ b/libs/ardour/ardour/vumeterdsp.h @@ -0,0 +1,49 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __VUMETERDSP_H +#define __VUMETERDSP_H + + +class Vumeterdsp +{ +public: + + Vumeterdsp (void); + ~Vumeterdsp (void); + + void process (float *p, int n); + float read (void); + void reset (); + + static void init (float fsamp); + +private: + + float _z1; // filter state + float _z2; // filter state + float _m; // max value since last read() + bool _res; // flag to reset m + + static float _w; // lowpass filter coefficient + static float _g; // gain factor +}; + + +#endif diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 495ff0b4c3..12eb59ce65 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -177,6 +177,9 @@ setup_enum_writer () REGISTER_ENUM (MeterMaxPeak); REGISTER_ENUM (MeterPeak); REGISTER_ENUM (MeterKrms); + REGISTER_ENUM (MeterIEC1); + REGISTER_ENUM (MeterIEC2); + REGISTER_ENUM (MeterVU); REGISTER (_MeterType); REGISTER_ENUM (Normal); diff --git a/libs/ardour/iec1ppmdsp.cc b/libs/ardour/iec1ppmdsp.cc new file mode 100644 index 0000000000..bed825048f --- /dev/null +++ b/libs/ardour/iec1ppmdsp.cc @@ -0,0 +1,100 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "ardour/iec1ppmdsp.h" + + +float Iec1ppmdsp::_w1; +float Iec1ppmdsp::_w2; +float Iec1ppmdsp::_w3; +float Iec1ppmdsp::_g; + + +Iec1ppmdsp::Iec1ppmdsp (void) : + _z1 (0), + _z2 (0), + _m (0), + _res (true) +{ +} + + +Iec1ppmdsp::~Iec1ppmdsp (void) +{ +} + + +void Iec1ppmdsp::process (float *p, int n) +{ + float z1, z2, m, t; + + z1 = _z1; + z2 = _z2; + m = _res ? 0: _m; + _res = false; + + n /= 4; + while (n--) + { + z1 *= _w3; + z2 *= _w3; + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = z1 + z2; + if (t > m) m = t; + } + + _z1 = z1 + 1e-10f; + _z2 = z2 + 1e-10f; + _m = m; +} + + +float Iec1ppmdsp::read (void) +{ + _res = true; + return _g * _m; +} + +void Iec1ppmdsp::reset () +{ + _z1 = _z2 = _m = .0f; + _res = true; +} + +void Iec1ppmdsp::init (float fsamp) +{ + _w1 = 450.0f / fsamp; + _w2 = 1300.0f / fsamp; + _w3 = 1.0f - 5.4f / fsamp; + _g = 0.5108f; +} + +/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/iec2ppmdsp.cc b/libs/ardour/iec2ppmdsp.cc new file mode 100644 index 0000000000..76862cccd2 --- /dev/null +++ b/libs/ardour/iec2ppmdsp.cc @@ -0,0 +1,100 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "ardour/iec2ppmdsp.h" + + +float Iec2ppmdsp::_w1; +float Iec2ppmdsp::_w2; +float Iec2ppmdsp::_w3; +float Iec2ppmdsp::_g; + + +Iec2ppmdsp::Iec2ppmdsp (void) : + _z1 (0), + _z2 (0), + _m (0), + _res (true) +{ +} + + +Iec2ppmdsp::~Iec2ppmdsp (void) +{ +} + + +void Iec2ppmdsp::process (float *p, int n) +{ + float z1, z2, m, t; + + z1 = _z1; + z2 = _z2; + m = _res ? 0: _m; + _res = false; + + n /= 4; + while (n--) + { + z1 *= _w3; + z2 *= _w3; + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = fabsf (*p++); + if (t > z1) z1 += _w1 * (t - z1); + if (t > z2) z2 += _w2 * (t - z2); + t = z1 + z2; + if (t > m) m = t; + } + + _z1 = z1 + 1e-10f; + _z2 = z2 + 1e-10f; + _m = m; +} + + +float Iec2ppmdsp::read (void) +{ + _res = true; + return _g * _m; +} + +void Iec2ppmdsp::reset () +{ + _z1 = _z2 = _m = .0f; + _res = true; +} + +void Iec2ppmdsp::init (float fsamp) +{ + _w1 = 200.0f / fsamp; + _w2 = 860.0f / fsamp; + _w3 = 1.0f - 4.0f / fsamp; + _g = 0.5141f; +} + +/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/kmeterdsp.cc b/libs/ardour/kmeterdsp.cc index afd0f71719..d4460f94cb 100644 --- a/libs/ardour/kmeterdsp.cc +++ b/libs/ardour/kmeterdsp.cc @@ -1,6 +1,6 @@ /* Copyright (C) 2008-2011 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus + Adopted for Ardour 2013 by Robin Gareus This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,12 +17,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - #include -#include "kmeterdsp.h" +#include "ardour/kmeterdsp.h" + float Kmeterdsp::_omega; + Kmeterdsp::Kmeterdsp (void) : _z1 (0), _z2 (0), @@ -36,6 +37,10 @@ Kmeterdsp::~Kmeterdsp (void) { } +void Kmeterdsp::init (int fsamp) +{ + _omega = 9.72f / fsamp; // ballistic filter coefficient +} void Kmeterdsp::process (float *p, int n) { @@ -96,7 +101,6 @@ void Kmeterdsp::process (float *p, int n) } } - /* Returns highest _rms value since last call */ float Kmeterdsp::read () { @@ -105,15 +109,10 @@ float Kmeterdsp::read () return rv; } -void Kmeterdsp::init (int fsamp) -{ - _omega = 9.72f / fsamp; // ballistic filter coefficient -} - void Kmeterdsp::reset () { - _z1 = _z2 = _rms = 0.0; - _flag=false; + _z1 = _z2 = _rms = .0f; + _flag = false; } -/* vi:set ts=8 sts=8 sw=8: */ +/* vi:set ts=8 sts=8 sw=4: */ diff --git a/libs/ardour/kmeterdsp.h b/libs/ardour/kmeterdsp.h deleted file mode 100644 index 9c2309e09c..0000000000 --- a/libs/ardour/kmeterdsp.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - Copyright (C) 2008-2011 Fons Adriaensen - Adopted for Ardour 2013 by Robin Gareus - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __KMETERDSP_H -#define __KMETERDSP_H - -class Kmeterdsp -{ -public: - - Kmeterdsp (void); - ~Kmeterdsp (void); - - void process (float *p, int n); - float read (); - static void init (int fsamp); - void reset (); - -private: - - float _z1; // filter state - float _z2; // filter state - float _rms; // max rms value since last read() - bool _flag; // flag set by read(), resets _rms - - static float _omega; // ballistics filter constant. -}; - -#endif diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 961a489a63..3ca19afe76 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -40,13 +40,22 @@ PeakMeter::PeakMeter (Session& s, const std::string& name) : Processor (s, string_compose ("meter-%1", name)) { Kmeterdsp::init(s.nominal_frame_rate()); + Iec1ppmdsp::init(s.nominal_frame_rate()); + Iec2ppmdsp::init(s.nominal_frame_rate()); + Vumeterdsp::init(s.nominal_frame_rate()); } PeakMeter::~PeakMeter () { while (_kmeter.size() > 0) { delete (_kmeter.back()); + delete (_iec1meter.back()); + delete (_iec2meter.back()); + delete (_vumeter.back()); _kmeter.pop_back(); + _iec1meter.pop_back(); + _iec2meter.pop_back(); + _vumeter.pop_back(); } } @@ -100,6 +109,15 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr if (_meter_type & MeterKrms) { _kmeter[i]->process(bufs.get_audio(i).data(), nframes); } + if (_meter_type & MeterIEC1) { + _iec1meter[i]->process(bufs.get_audio(i).data(), nframes); + } + if (_meter_type & MeterIEC2) { + _iec2meter[i]->process(bufs.get_audio(i).data(), nframes); + } + if (_meter_type & MeterVU) { + _vumeter[i]->process(bufs.get_audio(i).data(), nframes); + } } // Zero any excess peaks @@ -119,6 +137,9 @@ PeakMeter::reset () for (size_t n = 0; n < _kmeter.size(); ++n) { _kmeter[n]->reset(); + _iec1meter[n]->reset(); + _iec2meter[n]->reset(); + _vumeter[n]->reset(); } } @@ -212,12 +233,24 @@ PeakMeter::reset_max_channels (const ChanCount& chn) /* alloc/free other audio-only meter types. */ while (_kmeter.size() > n_audio) { delete (_kmeter.back()); + delete (_iec1meter.back()); + delete (_iec2meter.back()); + delete (_vumeter.back()); _kmeter.pop_back(); + _iec1meter.pop_back(); + _iec2meter.pop_back(); + _vumeter.pop_back(); } while (_kmeter.size() < n_audio) { _kmeter.push_back(new Kmeterdsp()); + _iec1meter.push_back(new Iec1ppmdsp()); + _iec2meter.push_back(new Iec2ppmdsp()); + _vumeter.push_back(new Vumeterdsp()); } assert(_kmeter.size() == n_audio); + assert(_iec1meter.size() == n_audio); + assert(_iec2meter.size() == n_audio); + assert(_vumeter.size() == n_audio); reset(); reset_max(); @@ -292,32 +325,51 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { switch (type) { case MeterKrms: { - const uint32_t n_midi = current_meters.n_midi(); + const uint32_t n_midi = current_meters.n_midi(); if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) { -#if 0 - return fast_coefficient_to_dB (_kmeter[n-n_midi]->read()); -#else - return accurate_coefficient_to_dB (_kmeter[n-n_midi]->read()); -#endif + return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read()); + } + } + break; + case MeterIEC1: + { + const uint32_t n_midi = current_meters.n_midi(); + if ((n - n_midi) < _iec1meter.size() && (n - n_midi) >= 0) { + return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read()); + } + } + break; + case MeterIEC2: + { + const uint32_t n_midi = current_meters.n_midi(); + if ((n - n_midi) < _iec2meter.size() && (n - n_midi) >= 0) { + return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read()); } - return minus_infinity(); } + break; + case MeterVU: + { + const uint32_t n_midi = current_meters.n_midi(); + if ((n - n_midi) < _vumeter.size() && (n - n_midi) >= 0) { + return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read()); + } + } + break; case MeterPeak: return peak_power(n); case MeterMaxSignal: if (n < _max_peak_signal.size()) { return _max_peak_signal[n]; - } else { - return minus_infinity(); } + break; default: case MeterMaxPeak: if (n < _max_peak_power.size()) { return _max_peak_power[n]; - } else { - return minus_infinity(); } + break; } + return minus_infinity(); } void @@ -335,6 +387,25 @@ PeakMeter::set_type(MeterType t) _kmeter[n]->reset(); } } + if (t & MeterIEC1) { + const size_t n_audio = current_meters.n_audio(); + for (size_t n = 0; n < n_audio; ++n) { + _iec1meter[n]->reset(); + } + } + if (t & MeterIEC2) { + const size_t n_audio = current_meters.n_audio(); + for (size_t n = 0; n < n_audio; ++n) { + _iec2meter[n]->reset(); + } + } + if (t & MeterVU) { + const size_t n_audio = current_meters.n_audio(); + for (size_t n = 0; n < n_audio; ++n) { + _vumeter[n]->reset(); + } + } + TypeChanged(t); } diff --git a/libs/ardour/vumeterdsp.cc b/libs/ardour/vumeterdsp.cc new file mode 100644 index 0000000000..67d48f6c54 --- /dev/null +++ b/libs/ardour/vumeterdsp.cc @@ -0,0 +1,89 @@ +/* + Copyright (C) 2012 Fons Adriaensen + Adopted for Ardour 2013 by Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "ardour/vumeterdsp.h" + + +float Vumeterdsp::_w; +float Vumeterdsp::_g; + + +Vumeterdsp::Vumeterdsp (void) : + _z1 (0), + _z2 (0), + _m (0), + _res (true) +{ +} + + +Vumeterdsp::~Vumeterdsp (void) +{ +} + + +void Vumeterdsp::process (float *p, int n) +{ + float z1, z2, m, t1, t2; + + z1 = _z1; + z2 = _z2; + m = _res ? 0: _m; + _res = false; + + n /= 4; + while (n--) + { + t2 = z2 / 2; + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + t1 = fabsf (*p++) - t2; + z1 += _w * (t1 - z1); + z2 += 4 * _w * (z1 - z2); + if (z2 > m) m = z2; + } + + _z1 = z1; + _z2 = z2 + 1e-10f; + _m = m; +} + + +float Vumeterdsp::read (void) +{ + _res = true; + return _g * _m; +} + +void Vumeterdsp::reset () +{ + _z1 = _z2 = _m = .0f; + _res = true; +} + +void Vumeterdsp::init (float fsamp) +{ + _w = 11.1f / fsamp; + _g = 1.5f * 1.571f; +} diff --git a/libs/ardour/wscript b/libs/ardour/wscript index 4e7e23aa1a..ea08636ea8 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -91,6 +91,8 @@ libardour_sources = [ 'globals.cc', 'graph.cc', 'graphnode.cc', + 'iec1ppmdsp.cc', + 'iec2ppmdsp.cc', 'import.cc', 'instrument_info.cc', 'internal_return.cc', @@ -206,6 +208,7 @@ libardour_sources = [ 'user_bundle.cc', 'utils.cc', 'version.cc', + 'vumeterdsp.cc', 'worker.cc' ] -- cgit v1.2.3 From 708edd586611c6b1132e4f25be4c2c0865ba4738 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 22 Jul 2013 18:45:08 +0200 Subject: implement new meter types --- gtk2_ardour/gain_meter.cc | 10 +- gtk2_ardour/level_meter.cc | 110 ++++++-- gtk2_ardour/logmeter.h | 77 +++++ gtk2_ardour/meter_patterns.cc | 639 ++++++++++++++++++++++++++++++++---------- gtk2_ardour/meter_patterns.h | 4 +- gtk2_ardour/meter_strip.cc | 23 +- gtk2_ardour/mixer_strip.cc | 12 +- libs/ardour/ardour/types.h | 18 +- libs/ardour/enums.cc | 10 +- libs/ardour/meter.cc | 22 +- 10 files changed, 714 insertions(+), 211 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index caa1fe954a..f142f21641 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -1019,19 +1019,22 @@ GainMeter::get_gm_width () gint GainMeter::meter_metrics_expose (GdkEventExpose *ev) { - return meter_expose_metrics(ev, _types, &meter_metric_area); + assert(_route); + return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area); } gint GainMeter::meter_ticks1_expose (GdkEventExpose *ev) { - return meter_expose_ticks(ev, _types, &meter_ticks1_area); + assert(_route); + return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area); } gint GainMeter::meter_ticks2_expose (GdkEventExpose *ev) { - return meter_expose_ticks(ev, _types, &meter_ticks2_area); + assert(_route); + return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area); } boost::shared_ptr @@ -1113,4 +1116,5 @@ void GainMeter::meter_type_changed (MeterType t) { _route->set_meter_type(t); + RedrawMetrics(); } diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 6a120fdb80..fd32add587 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -114,6 +114,18 @@ LevelMeter::update_meters () const float peak = _meter->meter_level (n, meter_type); if (meter_type == MeterPeak) { (*i).meter->set (log_meter (peak)); + } else if (meter_type == MeterIEC1NOR) { + (*i).meter->set (meter_deflect_nordic (peak)); + } else if (meter_type == MeterIEC1DIN) { + (*i).meter->set (meter_deflect_din (peak)); + } else if (meter_type == MeterIEC2BBC || meter_type == MeterIEC2EBU) { + (*i).meter->set (meter_deflect_ppm (peak)); + } else if (meter_type == MeterVU) { + (*i).meter->set (meter_deflect_vu (peak)); + } else if (meter_type == MeterK14) { + (*i).meter->set (meter_deflect_k (peak, 14), meter_deflect_k(_meter->meter_level(n, MeterPeak), 14)); + } else if (meter_type == MeterK20) { + (*i).meter->set (meter_deflect_k (peak, 20), meter_deflect_k(_meter->meter_level(n, MeterPeak), 20)); } else { (*i).meter->set (log_meter (peak), log_meter(_meter->meter_level(n, MeterPeak))); } @@ -161,6 +173,8 @@ void LevelMeter::meter_type_changed (MeterType t) { meter_type = t; + color_changed = true; + setup_meters (meter_length, regular_meter_width, thin_meter_width); MeterTypeChanged(t); } @@ -227,33 +241,6 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) stp[2] = 115.0 * 100.0 / 128.0; stp[3] = 115.0 * 112.0 / 128.0; } else { - switch (Config->get_meter_line_up_level()) { - case MeteringLineUp24: - stp[0] = 42.0; - stp[1] = 77.5; - stp[2] = 92.5; - stp[3] = 100.0; - break; - case MeteringLineUp20: - stp[0] = 50.0; - stp[1] = 77.5; - stp[2] = 92.5; - stp[3] = 100.0; - break; - default: - case MeteringLineUp18: - stp[0] = 55.0; - stp[1] = 77.5; - stp[2] = 92.5; - stp[3] = 100.0; - break; - case MeteringLineUp15: - stp[0] = 62.5; - stp[1] = 77.5; - stp[2] = 92.5; - stp[3] = 100.0; - break; - } c[0] = ARDOUR_UI::config()->canvasvar_MeterColor0.get(); c[1] = ARDOUR_UI::config()->canvasvar_MeterColor1.get(); c[2] = ARDOUR_UI::config()->canvasvar_MeterColor2.get(); @@ -264,6 +251,75 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) c[7] = ARDOUR_UI::config()->canvasvar_MeterColor7.get(); c[8] = ARDOUR_UI::config()->canvasvar_MeterColor8.get(); c[9] = ARDOUR_UI::config()->canvasvar_MeterColor9.get(); + + switch (meter_type) { + case MeterK20: + stp[0] = 115.0 * meter_deflect_k(-40, 20); //-20 + stp[1] = 115.0 * meter_deflect_k(-20, 20); // 0 + stp[2] = 115.0 * meter_deflect_k(-18, 20); // +2 + stp[3] = 115.0 * meter_deflect_k(-16, 20); // +4 + c[0] = c[1] = 0x008800ff; + c[2] = c[3] = 0x00ff00ff; + c[4] = c[5] = 0xffff00ff; + c[6] = c[7] = 0xffff00ff; + c[8] = c[9] = 0xff0000ff; + break; + case MeterK14: + stp[0] = 115.0 * meter_deflect_k(-34, 14); //-20 + stp[1] = 115.0 * meter_deflect_k(-14, 14); // 0 + stp[2] = 115.0 * meter_deflect_k(-12, 14); // +2 + stp[3] = 115.0 * meter_deflect_k(-10, 14); // +4 + c[0] = c[1] = 0x008800ff; + c[2] = c[3] = 0x00ff00ff; + c[4] = c[5] = 0xffff00ff; + c[6] = c[7] = 0xffff00ff; + c[8] = c[9] = 0xff0000ff; + break; + case MeterIEC2EBU: + case MeterIEC2BBC: + stp[0] = 115.0 * meter_deflect_ppm(-18); + stp[1] = 115.0 * meter_deflect_ppm(-14); + stp[2] = 115.0 * meter_deflect_ppm(-10); + stp[3] = 115.0 * meter_deflect_ppm( -8); + break; + case MeterIEC1NOR: + stp[0] = 115.0 * meter_deflect_nordic(-18); + stp[1] = 115.0 * meter_deflect_nordic(-15); + stp[2] = 115.0 * meter_deflect_nordic(-12); + stp[3] = 115.0 * meter_deflect_nordic( -9); + break; + case MeterIEC1DIN: + stp[0] = 115.0 * meter_deflect_din(-29); + stp[1] = 115.0 * meter_deflect_din(-18); + stp[2] = 115.0 * meter_deflect_din(-15); + stp[3] = 115.0 * meter_deflect_din( -9); + break; + case MeterVU: + stp[0] = 115.0 * meter_deflect_vu(-26); // -6 + stp[1] = 115.0 * meter_deflect_vu(-23); // -3 + stp[2] = 115.0 * meter_deflect_vu(-20); // 0 + stp[3] = 115.0 * meter_deflect_vu(-18); // +2 + break; + default: // PEAK, RMS + stp[1] = 77.5; // 115 * log_meter(-10) + stp[2] = 92.5; // 115 * log_meter(-3) + stp[3] = 100.0; // 115 * log_meter(0) + switch (Config->get_meter_line_up_level()) { + case MeteringLineUp24: + stp[0] = 42.0; + break; + case MeteringLineUp20: + stp[0] = 50.0; + break; + default: + case MeteringLineUp18: + stp[0] = 55.0; + break; + case MeteringLineUp15: + stp[0] = 62.5; + break; + } + } } if (meters[n].width != width || meters[n].length != len || color_changed) { delete meters[n].meter; diff --git a/gtk2_ardour/logmeter.h b/gtk2_ardour/logmeter.h index d861509080..c7b18ea6b9 100644 --- a/gtk2_ardour/logmeter.h +++ b/gtk2_ardour/logmeter.h @@ -34,6 +34,16 @@ alt_log_meter (float power) } #endif +/* prototypes - avoid compiler warning */ +inline float log_meter (float db); +inline float meter_deflect_ppm (float); +inline float meter_deflect_din (float); +inline float meter_deflect_nordic (float); +inline float meter_deflect_vu (float); +inline float meter_deflect_k (float, float); + + + inline float log_meter (float db) { @@ -65,4 +75,71 @@ log_meter (float db) return def/115.0f; } +inline float +meter_deflect_ppm (float db) +{ + if (db < -30) { + // 2.258 == ((-30 + 32.0)/ 28.0) / 10^(-30 / 20); + return (dB_to_coefficient(db) * 2.258769757f); + } else { + const float rv = (db + 32.0f) / 28.0f; + if (rv < 1.0) { + return rv; + } else { + return 1.0; + } + } +} + +inline float +meter_deflect_din (float db) +{ + float rv = dB_to_coefficient(db); + rv = sqrtf (sqrtf (2.3676f * rv)) - 0.1803f; + if (rv >= 1.0) { + return 1.0; + } else { + return (rv > 0 ? rv : 0.0); + } +} + +inline float +meter_deflect_nordic (float db) +{ + if (db < -60) { + return 0.0; + } else { + const float rv = (db + 60.0f) / 54.0f; + if (rv < 1.0) { + return rv; + } else { + return 1.0; + } + } +} + +inline float +meter_deflect_vu (float db) +{ + const float rv = 6.77165f * dB_to_coefficient(db); + if (rv > 1.0) return 1.0; + return rv; +} + +inline float +meter_deflect_k (float db, float krange) +{ + db+=krange; + if (db < -40.0f) { + return (dB_to_coefficient(db) * 500.0f / (krange + 45.0f)); + } else { + const float rv = (db + 45.0f) / (krange + 45.0f); + if (rv < 1.0) { + return rv; + } else { + return 1.0; + } + } +} + #endif /* __ardour_gtk_log_meter_h__ */ diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index d658a0b3ef..60bd33ca26 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -39,6 +39,8 @@ using namespace ArdourMeter; static const int max_pattern_metric_size = 1026; +/* signals used by meters */ + sigc::signal ArdourMeter::ResetAllPeakDisplays; sigc::signal ArdourMeter::ResetRoutePeakDisplays; sigc::signal ArdourMeter::ResetGroupPeakDisplays; @@ -46,13 +48,28 @@ sigc::signal ArdourMeter::RedrawMetrics; sigc::signal ArdourMeter::SetMeterTypeMulti; + +/* pattern cache */ + +struct MeterMatricsMapKey { + MeterMatricsMapKey (std::string n, MeterType t) + : _n(n) + , _t(t) + {} + inline bool operator<(const MeterMatricsMapKey& rhs) const { + return (_n < rhs._n) || (_n == rhs._n && _t < rhs._t); + } + std::string _n; + MeterType _t; +}; + namespace ArdourMeter { - typedef std::map TickPatterns; - typedef std::map MetricPatterns; + typedef std::map MetricPatternMap; } -static ArdourMeter::TickPatterns ticks_patterns; -static ArdourMeter::MetricPatterns metric_patterns; +static ArdourMeter::MetricPatternMap ticks_patterns; +static ArdourMeter::MetricPatternMap metric_patterns; + const std::string ArdourMeter::meter_type_string (ARDOUR::MeterType mt) @@ -61,14 +78,26 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterPeak: return _("Peak"); break; - case MeterKrms: + case MeterRMS: return _("RMS + Peak"); break; - case MeterIEC1: - return _("DIN"); + case MeterIEC1DIN: + return _("IEC1/DIN"); + break; + case MeterIEC1NOR: + return _("IEC1/NOR"); + break; + case MeterIEC2BBC: + return _("IEC2/BBC"); + break; + case MeterIEC2EBU: + return _("IEC2/EBU"); + break; + case MeterK20: + return _("K20"); break; - case MeterIEC2: - return _("EBU/BBC"); + case MeterK14: + return _("K14"); break; case MeterVU: return _("VU"); @@ -79,8 +108,99 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) } } + +static inline float mtr_col_and_fract( + cairo_t* cr, Gdk::Color const * const c, const uint32_t peakcolor, const MeterType mt, const float val) +{ + float fraction = 0; + + switch (mt) { + default: + case MeterRMS: + case MeterPeak: + fraction = log_meter (val); + if (val >= 0 || val == -9) { + cairo_set_source_rgb (cr, + UINT_RGBA_R_FLT(peakcolor), + UINT_RGBA_G_FLT(peakcolor), + UINT_RGBA_B_FLT(peakcolor)); + } else { + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + } + break; + case MeterIEC2BBC: + case MeterIEC2EBU: + fraction = meter_deflect_ppm(val); + if (val >= -10.0) { + cairo_set_source_rgb (cr, + UINT_RGBA_R_FLT(peakcolor), + UINT_RGBA_G_FLT(peakcolor), + UINT_RGBA_B_FLT(peakcolor)); + } else { + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + } + break; + case MeterIEC1NOR: + fraction = meter_deflect_nordic(val); + if (val >= -12.0) { + cairo_set_source_rgb (cr, + UINT_RGBA_R_FLT(peakcolor), + UINT_RGBA_G_FLT(peakcolor), + UINT_RGBA_B_FLT(peakcolor)); + } else { + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + } + break; + case MeterIEC1DIN: + fraction = meter_deflect_din(val); + if (val >= -9.0) { + cairo_set_source_rgb (cr, + UINT_RGBA_R_FLT(peakcolor), + UINT_RGBA_G_FLT(peakcolor), + UINT_RGBA_B_FLT(peakcolor)); + } else { + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + } + break; + case MeterVU: + fraction = meter_deflect_vu(val); + if (val >= -20.0) { + cairo_set_source_rgb (cr, + UINT_RGBA_R_FLT(peakcolor), + UINT_RGBA_G_FLT(peakcolor), + UINT_RGBA_B_FLT(peakcolor)); + } else { + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + } + break; + case MeterK20: + fraction = meter_deflect_k (val, 20); + if (val >= -16.0) { + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red + } else if (val >= -20.0) { + cairo_set_source_rgb (cr, 0.8, 0.8, 0.0); // yellow + } else { + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); // green + } + break; + case MeterK14: + if (val >= -10.0) { + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red + } else if (val >= -14.0) { + cairo_set_source_rgb (cr, 0.8, 0.8, 0.0); // yellow + } else { + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); // green + } + fraction = meter_deflect_k (val, 14); + break; + } + return fraction; +} + + + static cairo_pattern_t* -meter_render_ticks (Gtk::Widget& w, vector types) +meter_render_ticks (Gtk::Widget& w, MeterType type, vector types) { Glib::RefPtr win (w.get_window()); @@ -131,45 +251,153 @@ meter_render_ticks (Gtk::Widget& w, vector types) switch (*i) { case DataType::AUDIO: - points.insert (std::pair(-60, 0.5)); - points.insert (std::pair(-50, 0.5)); - points.insert (std::pair(-40, 0.5)); - points.insert (std::pair(-30, 0.5)); - if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair(-24, 0.5)); - } else { - points.insert (std::pair(-25, 0.5)); - } - points.insert (std::pair(-20, 1.0)); - - points.insert (std::pair(-19, 0.5)); - points.insert (std::pair(-18, 1.0)); - points.insert (std::pair(-17, 0.5)); - points.insert (std::pair(-16, 0.5)); - points.insert (std::pair(-15, 1.0)); - - points.insert (std::pair(-14, 0.5)); - points.insert (std::pair(-13, 0.5)); - points.insert (std::pair(-12, 0.5)); - points.insert (std::pair(-11, 0.5)); - points.insert (std::pair(-10, 1.0)); - - points.insert (std::pair( -9, 0.5)); - points.insert (std::pair( -8, 0.5)); - points.insert (std::pair( -7, 0.5)); - points.insert (std::pair( -6, 0.5)); - points.insert (std::pair( -5, 1.0)); - points.insert (std::pair( -4, 0.5)); - points.insert (std::pair( -3, 0.5)); - points.insert (std::pair( -2, 0.5)); - points.insert (std::pair( -1, 0.5)); - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 1, 0.5)); - points.insert (std::pair( 2, 0.5)); - points.insert (std::pair( 3, 0.5)); - points.insert (std::pair( 4, 0.5)); - points.insert (std::pair( 5, 0.5)); + switch (type) { + case MeterK14: + points.insert (std::pair(-54.0f, 1.0)); + points.insert (std::pair(-44.0f, 1.0)); + points.insert (std::pair(-34.0f, 1.0)); + points.insert (std::pair(-24.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-11.0f, 1.0)); + points.insert (std::pair( -8.0f, 1.0)); + points.insert (std::pair( -4.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); + break; + case MeterK20: + points.insert (std::pair(-60.0f, 1.0)); + points.insert (std::pair(-50.0f, 1.0)); + points.insert (std::pair(-40.0f, 1.0)); + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-26.0f, 1.0)); + points.insert (std::pair(-23.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-10.0f, 1.0)); + points.insert (std::pair( -5.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); + break; + case MeterIEC2EBU: + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-28.0f, 0.5)); + points.insert (std::pair(-26.0f, 1.0)); + points.insert (std::pair(-24.0f, 0.5)); + points.insert (std::pair(-22.0f, 1.0)); + points.insert (std::pair(-20.0f, 0.5)); + points.insert (std::pair(-18.0f, 1.0)); + points.insert (std::pair(-16.0f, 0.5)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-12.0f, 0.5)); + points.insert (std::pair(-10.0f, 1.0)); + points.insert (std::pair( -9.0f, 0.5)); + points.insert (std::pair( -8.0f, 0.5)); + points.insert (std::pair( -6.0f, 1.0)); + break; + case MeterIEC2BBC: + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-26.0f, 1.0)); + points.insert (std::pair(-22.0f, 1.0)); + points.insert (std::pair(-18.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-10.0f, 1.0)); + points.insert (std::pair( -6.0f, 1.0)); + break; + case MeterIEC1NOR: + points.insert (std::pair(-60.0f, 1.0)); // -42 + points.insert (std::pair(-57.0f, 0.5)); + points.insert (std::pair(-54.0f, 1.0)); + points.insert (std::pair(-51.0f, 0.5)); + points.insert (std::pair(-48.0f, 1.0)); + points.insert (std::pair(-45.0f, 0.5)); + points.insert (std::pair(-42.0f, 1.0)); + points.insert (std::pair(-39.0f, 0.5)); + points.insert (std::pair(-36.0f, 1.0)); + + points.insert (std::pair(-33.0f, 1.0)); + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-27.0f, 1.0)); + points.insert (std::pair(-24.0f, 1.0)); + points.insert (std::pair(-21.0f, 1.0)); + + points.insert (std::pair(-18.0f, 1.0)); + points.insert (std::pair(-15.0f, 1.0)); + points.insert (std::pair(-12.0f, 1.0)); + points.insert (std::pair( -9.0f, 1.0)); + points.insert (std::pair( -6.0f, 1.0)); + break; + case MeterIEC1DIN: + points.insert (std::pair( -3.0f, 0.5)); // "200%" + points.insert (std::pair( -4.0f, 1.0)); // "100%" + points.insert (std::pair( -9.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-15.0f, 0.5)); // "50%" + points.insert (std::pair(-18.0f, 0.5)); // "-9" + points.insert (std::pair(-19.0f, 1.0)); // "30%" + points.insert (std::pair(-29.0f, 1.0)); // "10%" + points.insert (std::pair(-35.0f, 0.5)); // "5%" " -20" + points.insert (std::pair(-39.0f, 1.0)); // "3%" + points.insert (std::pair(-49.0f, 0.5)); // "1%" + points.insert (std::pair(-59.0f, 1.0)); + break; + case MeterVU: + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-18.0f, 1.0)); + points.insert (std::pair(-19.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-21.0f, 1.0)); + points.insert (std::pair(-22.0f, 1.0)); + points.insert (std::pair(-23.0f, 1.0)); + points.insert (std::pair(-25.0f, 1.0)); + points.insert (std::pair(-27.0f, 1.0)); + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-40.0f, 1.0)); + break; + + default: + points.insert (std::pair(-60, 0.5)); + points.insert (std::pair(-50, 1.0)); + points.insert (std::pair(-40, 1.0)); + points.insert (std::pair(-30, 1.0)); + if (Config->get_meter_line_up_level() == MeteringLineUp24) { + points.insert (std::pair(-24, 1.0)); + } else { + points.insert (std::pair(-25, 1.0)); + } + points.insert (std::pair(-20, 1.0)); + + points.insert (std::pair(-19, 0.5)); + points.insert (std::pair(-18, 1.0)); + points.insert (std::pair(-17, 0.5)); + points.insert (std::pair(-16, 0.5)); + points.insert (std::pair(-15, 1.0)); + + points.insert (std::pair(-14, 0.5)); + points.insert (std::pair(-13, 0.5)); + points.insert (std::pair(-12, 0.5)); + points.insert (std::pair(-11, 0.5)); + points.insert (std::pair(-10, 1.0)); + + points.insert (std::pair( -9, 1.0)); + points.insert (std::pair( -8, 0.5)); + points.insert (std::pair( -7, 0.5)); + points.insert (std::pair( -6, 0.5)); + points.insert (std::pair( -5, 1.0)); + points.insert (std::pair( -4, 0.5)); + points.insert (std::pair( -3, 1.0)); + points.insert (std::pair( -2, 0.5)); + points.insert (std::pair( -1, 0.5)); + + points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 1, 0.5)); + points.insert (std::pair( 2, 0.5)); + points.insert (std::pair( 3, 1.0)); + points.insert (std::pair( 4, 0.5)); + points.insert (std::pair( 5, 0.5)); + break; + } break; case DataType::MIDI: @@ -194,16 +422,10 @@ meter_render_ticks (Gtk::Widget& w, vector types) switch (*i) { case DataType::AUDIO: - if (j->first >= 0 || j->first == -9) { - cairo_set_source_rgb (cr, - UINT_RGBA_R_FLT(peakcolor), - UINT_RGBA_G_FLT(peakcolor), - UINT_RGBA_B_FLT(peakcolor)); - } else { - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - } - fraction = log_meter (j->first); + fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first); + pos = height - (gint) floor (height * fraction); + pos = max (pos, 1); cairo_move_to(cr, 0, pos + .5); cairo_line_to(cr, 3, pos + .5); cairo_stroke (cr); @@ -227,9 +449,8 @@ meter_render_ticks (Gtk::Widget& w, vector types) return pattern; } - static cairo_pattern_t* -meter_render_metrics (Gtk::Widget& w, vector types) +meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) { Glib::RefPtr win (w.get_window()); @@ -286,16 +507,16 @@ meter_render_metrics (Gtk::Widget& w, vector types) } cairo_fill (cr); + cairo_set_line_width (cr, 1.0); + height = min(max_pattern_metric_size, height); uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel"); for (vector::const_iterator i = types.begin(); i != types.end(); ++i) { Gdk::Color c; - if (types.size() > 1) { /* we're overlaying more than 1 set of marks, so use different colours */ - Gdk::Color c; switch (*i) { case DataType::AUDIO: c = w.get_style()->get_fg (Gtk::STATE_NORMAL); @@ -311,100 +532,191 @@ meter_render_metrics (Gtk::Widget& w, vector types) cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } - std::map points; + + std::map points; switch (*i) { case DataType::AUDIO: layout->set_attributes (audio_font_attributes); - points.insert (std::pair(-50, 0.5)); - points.insert (std::pair(-40, 0.5)); - points.insert (std::pair(-30, 0.5)); - points.insert (std::pair(-20, 1.0)); - if (types.size() == 1) { - if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair(-24, 0.5)); - } else { - points.insert (std::pair(-25, 0.5)); - } - points.insert (std::pair(-15, 1.0)); + switch (type) { + case MeterK14: + points.insert (std::pair(-54.0f, "-40")); + points.insert (std::pair(-44.0f, "-30")); + points.insert (std::pair(-34.0f, "-20")); + points.insert (std::pair(-24.0f, "-10")); + points.insert (std::pair(-20.0f, "-6")); + points.insert (std::pair(-17.0f, "-3")); + points.insert (std::pair(-14.0f, "0")); + points.insert (std::pair(-11.0f, "+3")); + points.insert (std::pair( -8.0f, "+6")); + points.insert (std::pair( -4.0f, "+10")); + points.insert (std::pair( 0.0f, "+14")); + break; + case MeterK20: + points.insert (std::pair(-60.0f, "-40")); + points.insert (std::pair(-50.0f, "-30")); + points.insert (std::pair(-40.0f, "-20")); + points.insert (std::pair(-30.0f, "-10")); + points.insert (std::pair(-26.0f, "-6")); + points.insert (std::pair(-23.0f, "-3")); + points.insert (std::pair(-20.0f, "0")); + points.insert (std::pair(-17.0f, "+3")); + points.insert (std::pair(-14.0f, "+6")); + points.insert (std::pair(-10.0f, "+10")); + points.insert (std::pair( -5.0f, "+15")); + points.insert (std::pair( 0.0f, "+20")); + break; + default: + case MeterPeak: + case MeterRMS: + points.insert (std::pair(-50.0f, "-50")); + points.insert (std::pair(-40.0f, "-40")); + points.insert (std::pair(-30.0f, "-30")); + points.insert (std::pair(-20.0f, "-20")); + if (types.size() == 1) { + if (Config->get_meter_line_up_level() == MeteringLineUp24) { + points.insert (std::pair(-24.0f, "-24")); + } else { + points.insert (std::pair(-25.0f, "-25")); + } + points.insert (std::pair(-15.0f, "-15")); + } + points.insert (std::pair(-18.0f, "-18")); + points.insert (std::pair(-10.0f, "-10")); + points.insert (std::pair( -5.0f, "-5")); + points.insert (std::pair( -3.0f, "-3")); + points.insert (std::pair( 0.0f, "+0")); + points.insert (std::pair( 3.0f, "+3")); + break; + + case MeterIEC2EBU: + points.insert (std::pair(-30.0f, "-12")); + points.insert (std::pair(-26.0f, "-8")); + points.insert (std::pair(-22.0f, "-4")); + points.insert (std::pair(-18.0f, "TST")); + points.insert (std::pair(-14.0f, "+4")); + points.insert (std::pair(-10.0f, "+8")); + points.insert (std::pair( -6.0f, "+12")); + break; + + case MeterIEC2BBC: + points.insert (std::pair(-30.0f, "1")); + points.insert (std::pair(-26.0f, "2")); + points.insert (std::pair(-22.0f, "3")); + points.insert (std::pair(-18.0f, "4")); + points.insert (std::pair(-14.0f, "5")); + points.insert (std::pair(-10.0f, "6")); + points.insert (std::pair( -6.0f, "7")); + break; + + case MeterIEC1NOR: + //points.insert (std::pair(-60.0f, "-42")); + points.insert (std::pair(-54.0f, "-36")); + points.insert (std::pair(-48.0f, "-30")); + points.insert (std::pair(-42.0f, "-24")); + points.insert (std::pair(-36.0f, "-18")); + + points.insert (std::pair(-33.0f, "-15")); + points.insert (std::pair(-30.0f, "-12")); + points.insert (std::pair(-27.0f, "-9")); + points.insert (std::pair(-24.0f, "-6")); + points.insert (std::pair(-21.0f, "-3")); + + points.insert (std::pair(-18.0f, "TST")); + points.insert (std::pair(-15.0f, "+3")); + points.insert (std::pair(-12.0f, "+6")); + points.insert (std::pair( -9.0f, "+9")); + points.insert (std::pair( -6.0f, "+12")); + break; + + case MeterIEC1DIN: + //points.insert (std::pair( -3.0f, "200%")); + points.insert (std::pair( -4.0f, "+5")); // "100%" + points.insert (std::pair( -9.0f, "0")); + points.insert (std::pair(-14.0f, "-5")); + //points.insert (std::pair(-15.0f, "50%")); + //points.insert (std::pair(-18.0f, "-9")); + points.insert (std::pair(-19.0f, "-10")); // "30%" + points.insert (std::pair(-29.0f, "-20")); // "10%" + //points.insert (std::pair(-35.0f, "-20")); // "5%" + points.insert (std::pair(-39.0f, "-30")); // "3%" + //points.insert (std::pair(-49.0f, "1%")); + points.insert (std::pair(-59.0f, "-50")); + break; + + case MeterVU: + points.insert (std::pair(-17.0f, "+3")); + points.insert (std::pair(-18.0f, "+2")); + points.insert (std::pair(-19.0f, "+1")); + points.insert (std::pair(-20.0f, "0")); + points.insert (std::pair(-21.0f, "-1")); + points.insert (std::pair(-22.0f, "-2")); + points.insert (std::pair(-23.0f, "-3")); + points.insert (std::pair(-25.0f, "-5")); + points.insert (std::pair(-27.0f, "-7")); + points.insert (std::pair(-30.0f, "-10")); + points.insert (std::pair(-40.0f, "-20")); + break; } - points.insert (std::pair(-18, 1.0)); - points.insert (std::pair(-10, 1.0)); - points.insert (std::pair( -5, 1.0)); - points.insert (std::pair( -3, 0.5)); - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 3, 0.5)); break; - case DataType::MIDI: layout->set_attributes (midi_font_attributes); - points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 0, "0")); if (types.size() == 1) { - points.insert (std::pair( 16, 0.5)); - points.insert (std::pair( 32, 0.5)); - points.insert (std::pair( 48, 0.5)); - points.insert (std::pair( 64, 1.0)); - points.insert (std::pair( 80, 0.5)); - points.insert (std::pair( 96, 0.5)); - points.insert (std::pair(100, 0.5)); - points.insert (std::pair(112, 0.5)); + points.insert (std::pair( 16, "16")); + points.insert (std::pair( 32, "32")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 64, "64")); + points.insert (std::pair( 80, "80")); + points.insert (std::pair( 96, "96")); + points.insert (std::pair(100, "100")); + points.insert (std::pair(112, "112")); } else { /* labels that don't overlay with dB */ - points.insert (std::pair( 24, 0.5)); - points.insert (std::pair( 48, 0.5)); - points.insert (std::pair( 72, 0.5)); + points.insert (std::pair( 24, "24")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 72, "74")); } - points.insert (std::pair(127, 1.0)); + points.insert (std::pair(127, "127")); break; } - char buf[32]; gint pos; - for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { - + for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { float fraction = 0; switch (*i) { - case DataType::AUDIO: - cairo_set_line_width (cr, (j->second)); - if (j->first >= 0) { - cairo_set_source_rgb (cr, - UINT_RGBA_R_FLT(peakcolor), - UINT_RGBA_G_FLT(peakcolor), - UINT_RGBA_B_FLT(peakcolor)); - } - fraction = log_meter (j->first); - snprintf (buf, sizeof (buf), "%+2d", j->first); - pos = height - (gint) floor (height * fraction); - if (tickleft) { - cairo_move_to(cr, width-1.5, pos + .5); - cairo_line_to(cr, width, pos + .5); - cairo_stroke (cr); - } else if (tickright) { - cairo_move_to(cr, 0, pos + .5); - cairo_line_to(cr, 1.5, pos + .5); - cairo_stroke (cr); - } - break; - case DataType::MIDI: - cairo_set_line_width (cr, 1.0); - fraction = (j->first) / 127.0; - snprintf (buf, sizeof (buf), "%3d", j->first); - pos = 1 + height - (gint) rintf (height * fraction); - pos = min (pos, height); - if (tickleft) { - cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); - cairo_fill(cr); - } else if (tickright) { - cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); - cairo_fill(cr); - } - break; + case DataType::AUDIO: + fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first); + + pos = height - (gint) floor (height * fraction); + pos = max (pos, 1); + if (tickleft) { + cairo_move_to(cr, width-1.5, pos + .5); + cairo_line_to(cr, width, pos + .5); + cairo_stroke (cr); + } else if (tickright) { + cairo_move_to(cr, 0, pos + .5); + cairo_line_to(cr, 1.5, pos + .5); + cairo_stroke (cr); + } + break; + + case DataType::MIDI: + fraction = (j->first) / 127.0; + pos = 1 + height - (gint) rintf (height * fraction); + pos = min (pos, height); + if (tickleft) { + cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); + cairo_fill(cr); + } else if (tickright) { + cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); + cairo_fill(cr); + } + break; } - layout->set_text(buf); - - /* we want logical extents, not ink extents here */ + layout->set_text(j->second.c_str()); int tw, th; layout->get_pixel_size(tw, th); @@ -418,12 +730,40 @@ meter_render_metrics (Gtk::Widget& w, vector types) } } + // add legend if (types.size() == 1) { int tw, th; layout->set_attributes (unit_font_attributes); switch (types.at(0)) { case DataType::AUDIO: - layout->set_text("dBFS"); + switch (type) { + case MeterK20: + layout->set_text("K20"); + break; + case MeterK14: + layout->set_text("K14"); + break; + default: + case MeterPeak: + case MeterRMS: + layout->set_text("dBFS"); + break; + case MeterIEC2EBU: + layout->set_text("EBU"); + break; + case MeterIEC2BBC: + layout->set_text("BBC"); + break; + case MeterIEC1DIN: + layout->set_text("DIN"); + break; + case MeterIEC1NOR: + layout->set_text("NOR"); + break; + case MeterVU: + layout->set_text("VU"); + break; + } layout->get_pixel_size(tw, th); break; case DataType::MIDI: @@ -445,9 +785,8 @@ meter_render_metrics (Gtk::Widget& w, vector types) return pattern; } - gint -ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mta) +ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, MeterType type, std::vector types, Gtk::DrawingArea *mta) { Glib::RefPtr win (mta->get_window()); cairo_t* cr; @@ -460,11 +799,12 @@ ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vectorget_name()); + const MeterMatricsMapKey key (mta->get_name(), type); + MetricPatternMap::iterator i = ticks_patterns.find (key); if (i == ticks_patterns.end()) { - pattern = meter_render_ticks (*mta, types); - ticks_patterns[mta->get_name()] = pattern; + pattern = meter_render_ticks (*mta, type, types); + ticks_patterns[key] = pattern; } else { pattern = i->second; } @@ -484,7 +824,7 @@ ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mma) +ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, MeterType type, std::vector types, Gtk::DrawingArea *mma) { Glib::RefPtr win (mma->get_window()); cairo_t* cr; @@ -497,11 +837,12 @@ ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vectorget_name()); + const MeterMatricsMapKey key (mma->get_name(), type); + MetricPatternMap::iterator i = metric_patterns.find (key); if (i == metric_patterns.end()) { - pattern = meter_render_metrics (*mma, types); - metric_patterns[mma->get_name()] = pattern; + pattern = meter_render_metrics (*mma, type, types); + metric_patterns[key] = pattern; } else { pattern = i->second; } @@ -522,12 +863,13 @@ ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vectorfirst; + MeterMatricsMapKey const * const key = &(i->first); + std::string n = key->_n; if (n.substr(n.length() - 4) == "Left") { m = 1; } if (n.substr(n.length() - 5) == "Right") { m = 2; } if (which & m) { @@ -540,7 +882,8 @@ ArdourMeter::meter_clear_pattern_cache(int which) { while (j != ticks_patterns.end()) { int m = 4; - std::string n = j->first; + MeterMatricsMapKey const * const key = &(j->first); + std::string n = key->_n; if (n.substr(n.length() - 4) == "Left") { m = 1; } if (n.substr(n.length() - 5) == "Right") { m = 2; } if (which & m) { diff --git a/gtk2_ardour/meter_patterns.h b/gtk2_ardour/meter_patterns.h index 90ef4ec980..f505ba37c7 100644 --- a/gtk2_ardour/meter_patterns.h +++ b/gtk2_ardour/meter_patterns.h @@ -37,8 +37,8 @@ extern sigc::signal RedrawMetrics; extern sigc::signal SetMeterTypeMulti; -gint meter_expose_ticks (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mta); -gint meter_expose_metrics (GdkEventExpose *ev, std::vector types, Gtk::DrawingArea *mma); +gint meter_expose_ticks (GdkEventExpose *ev, ARDOUR::MeterType type, std::vector types, Gtk::DrawingArea *mta); +gint meter_expose_metrics (GdkEventExpose *ev, ARDOUR::MeterType type, std::vector types, Gtk::DrawingArea *mma); void meter_clear_pattern_cache(int which=7); diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 3a8410867a..263241bbd1 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -112,8 +112,8 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) level_meter = new LevelMeter(sess); level_meter->set_meter (_route->shared_peak_meter().get()); level_meter->clear_meters(); - level_meter->setup_meters (220, meter_width, 6); level_meter->set_type (_route->meter_type()); + level_meter->setup_meters (220, meter_width, 6); level_meter->ButtonPress.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::level_meter_button_press, this, _1)); level_meter->MeterTypeChanged.connect_same_thread (level_meter_connection, boost::bind (&MeterStrip::meter_type_changed, this, _1)); @@ -394,7 +394,8 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a) gint MeterStrip::meter_metrics_expose (GdkEventExpose *ev) { - return meter_expose_metrics(ev, _types, &meter_metric_area); + // TODO meter-type - set with set_metric_mode() + return meter_expose_metrics(ev, /*XXX*/ MeterPeak, _types, &meter_metric_area); } void @@ -432,13 +433,15 @@ MeterStrip::set_pos (int pos) gint MeterStrip::meter_ticks1_expose (GdkEventExpose *ev) { - return meter_expose_ticks(ev, _types, &meter_ticks1_area); + assert(_route); + return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks1_area); } gint MeterStrip::meter_ticks2_expose (GdkEventExpose *ev) { - return meter_expose_ticks(ev, _types, &meter_ticks2_area); + assert(_route); + return meter_expose_ticks(ev, _route->meter_type(), _types, &meter_ticks2_area); } void @@ -572,10 +575,14 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) _suspend_menu_callbacks = true; add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterRMS), MeterRMS); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); MeterType cmt = _route->meter_type(); const std::string cmn = ArdourMeter::meter_type_string(cmt); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index dec072b067..e4afad2fea 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2134,10 +2134,14 @@ 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(MeterKrms), MeterKrms); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC1), MeterIEC1); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2), MeterIEC2); - add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterRMS), MeterRMS); + 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); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK20), MeterK20); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterK14), MeterK14); + add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU); int _strip_type; if (_route->is_master()) { diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index df7209b581..7b396796ad 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -178,13 +178,17 @@ namespace ARDOUR { }; enum MeterType { - MeterMaxSignal = 0x01, - MeterMaxPeak = 0x02, - MeterPeak = 0x04, - MeterKrms = 0x08, - MeterIEC1 = 0x10, - MeterIEC2 = 0x20, - MeterVU = 0x40 + MeterMaxSignal = 0x001, + MeterMaxPeak = 0x002, + MeterPeak = 0x004, + MeterRMS = 0x008, + MeterK20 = 0x010, + MeterK14 = 0x020, + MeterIEC1DIN = 0x040, + MeterIEC1NOR = 0x080, + MeterIEC2BBC = 0x100, + MeterIEC2EBU = 0x200, + MeterVU = 0x400 }; enum TrackMode { diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 12eb59ce65..eab3176f57 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -176,9 +176,13 @@ setup_enum_writer () REGISTER_ENUM (MeterMaxSignal); REGISTER_ENUM (MeterMaxPeak); REGISTER_ENUM (MeterPeak); - REGISTER_ENUM (MeterKrms); - REGISTER_ENUM (MeterIEC1); - REGISTER_ENUM (MeterIEC2); + REGISTER_ENUM (MeterRMS); + REGISTER_ENUM (MeterK20); + REGISTER_ENUM (MeterK14); + REGISTER_ENUM (MeterIEC1DIN); + REGISTER_ENUM (MeterIEC1NOR); + REGISTER_ENUM (MeterIEC2BBC); + REGISTER_ENUM (MeterIEC2EBU); REGISTER_ENUM (MeterVU); REGISTER (_MeterType); diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 3ca19afe76..8b9ed436a4 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -106,13 +106,13 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr // Meter audio in to the rest of the peaks for (uint32_t i = 0; i < n_audio; ++i, ++n) { _peak_signal[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_signal[n]); - if (_meter_type & MeterKrms) { + if (_meter_type & (MeterRMS | MeterK20 | MeterK14)) { _kmeter[i]->process(bufs.get_audio(i).data(), nframes); } - if (_meter_type & MeterIEC1) { + if (_meter_type & (MeterIEC1DIN | MeterIEC1NOR)) { _iec1meter[i]->process(bufs.get_audio(i).data(), nframes); } - if (_meter_type & MeterIEC2) { + if (_meter_type & (MeterIEC2BBC | MeterIEC2EBU)) { _iec2meter[i]->process(bufs.get_audio(i).data(), nframes); } if (_meter_type & MeterVU) { @@ -323,7 +323,9 @@ PeakMeter::meter () float PeakMeter::meter_level(uint32_t n, MeterType type) { switch (type) { - case MeterKrms: + case MeterRMS: + case MeterK20: + case MeterK14: { const uint32_t n_midi = current_meters.n_midi(); if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) { @@ -331,7 +333,8 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { } } break; - case MeterIEC1: + case MeterIEC1DIN: + case MeterIEC1NOR: { const uint32_t n_midi = current_meters.n_midi(); if ((n - n_midi) < _iec1meter.size() && (n - n_midi) >= 0) { @@ -339,7 +342,8 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { } } break; - case MeterIEC2: + case MeterIEC2BBC: + case MeterIEC2EBU: { const uint32_t n_midi = current_meters.n_midi(); if ((n - n_midi) < _iec2meter.size() && (n - n_midi) >= 0) { @@ -381,19 +385,19 @@ PeakMeter::set_type(MeterType t) _meter_type = t; - if (t & MeterKrms) { + if (t & (MeterRMS | MeterK20 | MeterK14)) { const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < n_audio; ++n) { _kmeter[n]->reset(); } } - if (t & MeterIEC1) { + if (t & (MeterIEC1DIN | MeterIEC1NOR)) { const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < n_audio; ++n) { _iec1meter[n]->reset(); } } - if (t & MeterIEC2) { + if (t & (MeterIEC2BBC | MeterIEC2EBU)) { const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < n_audio; ++n) { _iec2meter[n]->reset(); -- cgit v1.2.3 From df17094b478100f41ebaf4cd30432cef933b7523 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 22 Jul 2013 19:56:30 +0200 Subject: minor tweaks to meter-names and legend --- gtk2_ardour/meter_patterns.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 60bd33ca26..5f4476e15d 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -85,7 +85,7 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) return _("IEC1/DIN"); break; case MeterIEC1NOR: - return _("IEC1/NOR"); + return _("IEC1/Nordic"); break; case MeterIEC2BBC: return _("IEC2/BBC"); @@ -773,7 +773,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) } Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - cairo_move_to (cr, 2, height - th - 1.5); + cairo_move_to (cr, 2, height - th - 0.5); pango_cairo_show_layout (cr, layout->gobj()); } -- cgit v1.2.3 From 06e7ad67ae9fb84828011d7522d7c1b4cbeb7c37 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 22 Jul 2013 19:59:24 +0200 Subject: restore session backwards compatibility to 3.3 --- gtk2_ardour/meter_patterns.cc | 8 ++++---- gtk2_ardour/meter_strip.cc | 2 +- gtk2_ardour/mixer_strip.cc | 2 +- libs/ardour/ardour/types.h | 2 +- libs/ardour/enums.cc | 2 +- libs/ardour/meter.cc | 6 +++--- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 5f4476e15d..ff977c84c3 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -78,7 +78,7 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterPeak: return _("Peak"); break; - case MeterRMS: + case MeterKrms: return _("RMS + Peak"); break; case MeterIEC1DIN: @@ -116,7 +116,7 @@ static inline float mtr_col_and_fract( switch (mt) { default: - case MeterRMS: + case MeterKrms: case MeterPeak: fraction = log_meter (val); if (val >= 0 || val == -9) { @@ -568,7 +568,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; default: case MeterPeak: - case MeterRMS: + case MeterKrms: points.insert (std::pair(-50.0f, "-50")); points.insert (std::pair(-40.0f, "-40")); points.insert (std::pair(-30.0f, "-30")); @@ -745,7 +745,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; default: case MeterPeak: - case MeterRMS: + case MeterKrms: layout->set_text("dBFS"); break; case MeterIEC2EBU: diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 263241bbd1..20419de7c7 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -575,7 +575,7 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) _suspend_menu_callbacks = true; add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); - add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterRMS), MeterRMS); + add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); add_level_meter_item (items, group, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index e4afad2fea..d77023d201 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2134,7 +2134,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(MeterRMS), MeterRMS); + 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); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterIEC2BBC), MeterIEC2BBC); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 7b396796ad..553ee1ea28 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -181,7 +181,7 @@ namespace ARDOUR { MeterMaxSignal = 0x001, MeterMaxPeak = 0x002, MeterPeak = 0x004, - MeterRMS = 0x008, + MeterKrms = 0x008, MeterK20 = 0x010, MeterK14 = 0x020, MeterIEC1DIN = 0x040, diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index eab3176f57..0d225fada3 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -176,7 +176,7 @@ setup_enum_writer () REGISTER_ENUM (MeterMaxSignal); REGISTER_ENUM (MeterMaxPeak); REGISTER_ENUM (MeterPeak); - REGISTER_ENUM (MeterRMS); + REGISTER_ENUM (MeterKrms); REGISTER_ENUM (MeterK20); REGISTER_ENUM (MeterK14); REGISTER_ENUM (MeterIEC1DIN); diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 8b9ed436a4..32c7439fd5 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -106,7 +106,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr // Meter audio in to the rest of the peaks for (uint32_t i = 0; i < n_audio; ++i, ++n) { _peak_signal[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_signal[n]); - if (_meter_type & (MeterRMS | MeterK20 | MeterK14)) { + if (_meter_type & (MeterKrms | MeterK20 | MeterK14)) { _kmeter[i]->process(bufs.get_audio(i).data(), nframes); } if (_meter_type & (MeterIEC1DIN | MeterIEC1NOR)) { @@ -323,7 +323,7 @@ PeakMeter::meter () float PeakMeter::meter_level(uint32_t n, MeterType type) { switch (type) { - case MeterRMS: + case MeterKrms: case MeterK20: case MeterK14: { @@ -385,7 +385,7 @@ PeakMeter::set_type(MeterType t) _meter_type = t; - if (t & (MeterRMS | MeterK20 | MeterK14)) { + if (t & (MeterKrms | MeterK20 | MeterK14)) { const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < n_audio; ++n) { _kmeter[n]->reset(); -- cgit v1.2.3 From 8013160eb369ae8a97392284602e41cc77617b79 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 13:30:23 +0200 Subject: meterbridge metrics update: * display metrics for every used meter-type * show metrics between meters with differnet types * update text and label alignment for meterbridge * fix crash when deleting metrics-strip (zero route) * clean up metric pattern code (use float for dBFS) --- gtk2_ardour/meter_patterns.cc | 274 ++++++++++++++++++++++-------------------- gtk2_ardour/meter_strip.cc | 26 ++-- gtk2_ardour/meter_strip.h | 8 +- gtk2_ardour/meterbridge.cc | 86 ++++++++----- gtk2_ardour/meterbridge.h | 2 +- gtk2_ardour/route_ui.cc | 5 + 6 files changed, 230 insertions(+), 171 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index ff977c84c3..193039b3eb 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -108,7 +108,6 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) } } - static inline float mtr_col_and_fract( cairo_t* cr, Gdk::Color const * const c, const uint32_t peakcolor, const MeterType mt, const float val) { @@ -198,7 +197,6 @@ static inline float mtr_col_and_fract( } - static cairo_pattern_t* meter_render_ticks (Gtk::Widget& w, MeterType type, vector types) { @@ -247,38 +245,39 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } - std::map points; + // tick-maker position in dBFS, line-thickness + std::map points; switch (*i) { case DataType::AUDIO: switch (type) { case MeterK14: - points.insert (std::pair(-54.0f, 1.0)); - points.insert (std::pair(-44.0f, 1.0)); - points.insert (std::pair(-34.0f, 1.0)); - points.insert (std::pair(-24.0f, 1.0)); - points.insert (std::pair(-20.0f, 1.0)); - points.insert (std::pair(-17.0f, 1.0)); - points.insert (std::pair(-14.0f, 1.0)); - points.insert (std::pair(-11.0f, 1.0)); - points.insert (std::pair( -8.0f, 1.0)); - points.insert (std::pair( -4.0f, 1.0)); - points.insert (std::pair( 0.0f, 1.0)); + points.insert (std::pair(-54.0f, 1.0)); + points.insert (std::pair(-44.0f, 1.0)); + points.insert (std::pair(-34.0f, 1.0)); + points.insert (std::pair(-24.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-11.0f, 1.0)); + points.insert (std::pair( -8.0f, 1.0)); + points.insert (std::pair( -4.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); break; case MeterK20: - points.insert (std::pair(-60.0f, 1.0)); - points.insert (std::pair(-50.0f, 1.0)); - points.insert (std::pair(-40.0f, 1.0)); - points.insert (std::pair(-30.0f, 1.0)); - points.insert (std::pair(-26.0f, 1.0)); - points.insert (std::pair(-23.0f, 1.0)); - points.insert (std::pair(-20.0f, 1.0)); - points.insert (std::pair(-17.0f, 1.0)); - points.insert (std::pair(-14.0f, 1.0)); - points.insert (std::pair(-10.0f, 1.0)); - points.insert (std::pair( -5.0f, 1.0)); - points.insert (std::pair( 0.0f, 1.0)); + points.insert (std::pair(-60.0f, 1.0)); + points.insert (std::pair(-50.0f, 1.0)); + points.insert (std::pair(-40.0f, 1.0)); + points.insert (std::pair(-30.0f, 1.0)); + points.insert (std::pair(-26.0f, 1.0)); + points.insert (std::pair(-23.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-17.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-10.0f, 1.0)); + points.insert (std::pair( -5.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); break; case MeterIEC2EBU: points.insert (std::pair(-30.0f, 1.0)); @@ -357,64 +356,64 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ break; default: - points.insert (std::pair(-60, 0.5)); - points.insert (std::pair(-50, 1.0)); - points.insert (std::pair(-40, 1.0)); - points.insert (std::pair(-30, 1.0)); + points.insert (std::pair(-60, 0.5)); + points.insert (std::pair(-50, 1.0)); + points.insert (std::pair(-40, 1.0)); + points.insert (std::pair(-30, 1.0)); if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair(-24, 1.0)); + points.insert (std::pair(-24, 1.0)); } else { - points.insert (std::pair(-25, 1.0)); + points.insert (std::pair(-25, 1.0)); } - points.insert (std::pair(-20, 1.0)); - - points.insert (std::pair(-19, 0.5)); - points.insert (std::pair(-18, 1.0)); - points.insert (std::pair(-17, 0.5)); - points.insert (std::pair(-16, 0.5)); - points.insert (std::pair(-15, 1.0)); - - points.insert (std::pair(-14, 0.5)); - points.insert (std::pair(-13, 0.5)); - points.insert (std::pair(-12, 0.5)); - points.insert (std::pair(-11, 0.5)); - points.insert (std::pair(-10, 1.0)); - - points.insert (std::pair( -9, 1.0)); - points.insert (std::pair( -8, 0.5)); - points.insert (std::pair( -7, 0.5)); - points.insert (std::pair( -6, 0.5)); - points.insert (std::pair( -5, 1.0)); - points.insert (std::pair( -4, 0.5)); - points.insert (std::pair( -3, 1.0)); - points.insert (std::pair( -2, 0.5)); - points.insert (std::pair( -1, 0.5)); - - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 1, 0.5)); - points.insert (std::pair( 2, 0.5)); - points.insert (std::pair( 3, 1.0)); - points.insert (std::pair( 4, 0.5)); - points.insert (std::pair( 5, 0.5)); + points.insert (std::pair(-20, 1.0)); + + points.insert (std::pair(-19, 0.5)); + points.insert (std::pair(-18, 1.0)); + points.insert (std::pair(-17, 0.5)); + points.insert (std::pair(-16, 0.5)); + points.insert (std::pair(-15, 1.0)); + + points.insert (std::pair(-14, 0.5)); + points.insert (std::pair(-13, 0.5)); + points.insert (std::pair(-12, 0.5)); + points.insert (std::pair(-11, 0.5)); + points.insert (std::pair(-10, 1.0)); + + points.insert (std::pair( -9, 1.0)); + points.insert (std::pair( -8, 0.5)); + points.insert (std::pair( -7, 0.5)); + points.insert (std::pair( -6, 0.5)); + points.insert (std::pair( -5, 1.0)); + points.insert (std::pair( -4, 0.5)); + points.insert (std::pair( -3, 1.0)); + points.insert (std::pair( -2, 0.5)); + points.insert (std::pair( -1, 0.5)); + + points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 1, 0.5)); + points.insert (std::pair( 2, 0.5)); + points.insert (std::pair( 3, 1.0)); + points.insert (std::pair( 4, 0.5)); + points.insert (std::pair( 5, 0.5)); break; } break; case DataType::MIDI: - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 16, 0.5)); - points.insert (std::pair( 32, 0.5)); - points.insert (std::pair( 48, 0.5)); - points.insert (std::pair( 64, 1.0)); - points.insert (std::pair( 80, 0.5)); - points.insert (std::pair( 96, 0.5)); - points.insert (std::pair(100, 1.0)); - points.insert (std::pair(112, 0.5)); - points.insert (std::pair(127, 1.0)); + points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 16, 0.5)); + points.insert (std::pair( 32, 0.5)); + points.insert (std::pair( 48, 0.5)); + points.insert (std::pair( 64, 1.0)); + points.insert (std::pair( 80, 0.5)); + points.insert (std::pair( 96, 0.5)); + points.insert (std::pair(100, 1.0)); + points.insert (std::pair(112, 0.5)); + points.insert (std::pair(127, 1.0)); break; } - for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { + for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { cairo_set_line_width (cr, (j->second)); float fraction = 0; @@ -533,6 +532,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) } + // label-pos in dBFS, label-text std::map points; switch (*i) { @@ -540,53 +540,53 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) layout->set_attributes (audio_font_attributes); switch (type) { case MeterK14: - points.insert (std::pair(-54.0f, "-40")); - points.insert (std::pair(-44.0f, "-30")); - points.insert (std::pair(-34.0f, "-20")); - points.insert (std::pair(-24.0f, "-10")); - points.insert (std::pair(-20.0f, "-6")); - points.insert (std::pair(-17.0f, "-3")); - points.insert (std::pair(-14.0f, "0")); - points.insert (std::pair(-11.0f, "+3")); - points.insert (std::pair( -8.0f, "+6")); - points.insert (std::pair( -4.0f, "+10")); - points.insert (std::pair( 0.0f, "+14")); + points.insert (std::pair(-54.0f, "-40")); + points.insert (std::pair(-44.0f, "-30")); + points.insert (std::pair(-34.0f, "-20")); + points.insert (std::pair(-24.0f, "-10")); + points.insert (std::pair(-20.0f, "-6")); + points.insert (std::pair(-17.0f, "-3")); + points.insert (std::pair(-14.0f, "0")); + points.insert (std::pair(-11.0f, "+3")); + points.insert (std::pair( -8.0f, "+6")); + points.insert (std::pair( -4.0f, "+10")); + points.insert (std::pair( 0.0f, "+14")); break; case MeterK20: - points.insert (std::pair(-60.0f, "-40")); - points.insert (std::pair(-50.0f, "-30")); - points.insert (std::pair(-40.0f, "-20")); - points.insert (std::pair(-30.0f, "-10")); - points.insert (std::pair(-26.0f, "-6")); - points.insert (std::pair(-23.0f, "-3")); - points.insert (std::pair(-20.0f, "0")); - points.insert (std::pair(-17.0f, "+3")); - points.insert (std::pair(-14.0f, "+6")); - points.insert (std::pair(-10.0f, "+10")); - points.insert (std::pair( -5.0f, "+15")); - points.insert (std::pair( 0.0f, "+20")); + points.insert (std::pair(-60.0f, "-40")); + points.insert (std::pair(-50.0f, "-30")); + points.insert (std::pair(-40.0f, "-20")); + points.insert (std::pair(-30.0f, "-10")); + points.insert (std::pair(-26.0f, "-6")); + points.insert (std::pair(-23.0f, "-3")); + points.insert (std::pair(-20.0f, "0")); + points.insert (std::pair(-17.0f, "+3")); + points.insert (std::pair(-14.0f, "+6")); + points.insert (std::pair(-10.0f, "+10")); + points.insert (std::pair( -5.0f, "+15")); + points.insert (std::pair( 0.0f, "+20")); break; default: case MeterPeak: case MeterKrms: - points.insert (std::pair(-50.0f, "-50")); - points.insert (std::pair(-40.0f, "-40")); - points.insert (std::pair(-30.0f, "-30")); - points.insert (std::pair(-20.0f, "-20")); + points.insert (std::pair(-50.0f, "-50")); + points.insert (std::pair(-40.0f, "-40")); + points.insert (std::pair(-30.0f, "-30")); + points.insert (std::pair(-20.0f, "-20")); if (types.size() == 1) { if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair(-24.0f, "-24")); + points.insert (std::pair(-24.0f, "-24")); } else { - points.insert (std::pair(-25.0f, "-25")); + points.insert (std::pair(-25.0f, "-25")); } - points.insert (std::pair(-15.0f, "-15")); + points.insert (std::pair(-15.0f, "-15")); } - points.insert (std::pair(-18.0f, "-18")); - points.insert (std::pair(-10.0f, "-10")); - points.insert (std::pair( -5.0f, "-5")); - points.insert (std::pair( -3.0f, "-3")); - points.insert (std::pair( 0.0f, "+0")); - points.insert (std::pair( 3.0f, "+3")); + points.insert (std::pair(-18.0f, "-18")); + points.insert (std::pair(-10.0f, "-10")); + points.insert (std::pair( -5.0f, "-5")); + points.insert (std::pair( -3.0f, "-3")); + points.insert (std::pair( 0.0f, "+0")); + points.insert (std::pair( 3.0f, "+3")); break; case MeterIEC2EBU: @@ -600,13 +600,13 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; case MeterIEC2BBC: - points.insert (std::pair(-30.0f, "1")); - points.insert (std::pair(-26.0f, "2")); - points.insert (std::pair(-22.0f, "3")); - points.insert (std::pair(-18.0f, "4")); - points.insert (std::pair(-14.0f, "5")); - points.insert (std::pair(-10.0f, "6")); - points.insert (std::pair( -6.0f, "7")); + points.insert (std::pair(-30.0f, " 1 ")); + points.insert (std::pair(-26.0f, " 2 ")); + points.insert (std::pair(-22.0f, " 3 ")); + points.insert (std::pair(-18.0f, " 4 ")); + points.insert (std::pair(-14.0f, " 5 ")); + points.insert (std::pair(-10.0f, " 6 ")); + points.insert (std::pair( -6.0f, " 7 ")); break; case MeterIEC1NOR: @@ -661,23 +661,23 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; case DataType::MIDI: layout->set_attributes (midi_font_attributes); - points.insert (std::pair( 0, "0")); + points.insert (std::pair( 0, "0")); if (types.size() == 1) { - points.insert (std::pair( 16, "16")); - points.insert (std::pair( 32, "32")); - points.insert (std::pair( 48, "48")); - points.insert (std::pair( 64, "64")); - points.insert (std::pair( 80, "80")); - points.insert (std::pair( 96, "96")); - points.insert (std::pair(100, "100")); - points.insert (std::pair(112, "112")); + points.insert (std::pair( 16, "16")); + points.insert (std::pair( 32, "32")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 64, "64")); + points.insert (std::pair( 80, "80")); + points.insert (std::pair( 96, "96")); + points.insert (std::pair(100, "100")); + points.insert (std::pair(112, "112")); } else { /* labels that don't overlay with dB */ - points.insert (std::pair( 24, "24")); - points.insert (std::pair( 48, "48")); - points.insert (std::pair( 72, "74")); + points.insert (std::pair( 24, "24")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 72, "74")); } - points.insert (std::pair(127, "127")); + points.insert (std::pair(127, "127")); break; } @@ -685,6 +685,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { float fraction = 0; + bool align_center = background; // this is true for meterbridge meters w/ fixed background switch (*i) { case DataType::AUDIO: fraction = mtr_col_and_fract(cr, &c, peakcolor, type, j->first); @@ -703,6 +704,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; case DataType::MIDI: + align_center = false; // don't bleed into legend fraction = (j->first) / 127.0; pos = 1 + height - (gint) rintf (height * fraction); pos = min (pos, height); @@ -725,7 +727,11 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) p = min (p, height - th); p = max (p, 0); - cairo_move_to (cr, width-3-tw, p); + if (align_center) { + cairo_move_to (cr, (width-tw)/2.0, p); + } else { + cairo_move_to (cr, width-3-tw, p); + } pango_cairo_show_layout (cr, layout->gobj()); } } @@ -767,13 +773,17 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) layout->get_pixel_size(tw, th); break; case DataType::MIDI: - layout->set_text("vel"); + layout->set_text("mid"); layout->get_pixel_size(tw, th); break; } Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - cairo_move_to (cr, 2, height - th - 0.5); + if (tickleft) { + cairo_move_to (cr, width - 2 - tw, height - th - 0.5); + } else { + cairo_move_to (cr, 2, height - th - 0.5); + } pango_cairo_show_layout (cr, layout->gobj()); } diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 20419de7c7..4e4ffe11cf 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -57,7 +57,7 @@ using namespace ArdourMeter; PBD::Signal1 MeterStrip::CatchDeletion; PBD::Signal0 MeterStrip::MetricChanged; -MeterStrip::MeterStrip (int metricmode) +MeterStrip::MeterStrip (int metricmode, MeterType mt) : AxisView(0) , RouteUI(0) { @@ -67,7 +67,7 @@ MeterStrip::MeterStrip (int metricmode) peakbx.set_size_request(-1, 14); namebx.set_size_request(18, 52); - set_metric_mode(metricmode); + set_metric_mode(metricmode, mt); meter_metric_area.set_size_request(25, 10); meter_metric_area.signal_expose_event().connect ( @@ -394,13 +394,17 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a) gint MeterStrip::meter_metrics_expose (GdkEventExpose *ev) { - // TODO meter-type - set with set_metric_mode() - return meter_expose_metrics(ev, /*XXX*/ MeterPeak, _types, &meter_metric_area); + if (_route) { + return meter_expose_metrics(ev, _route->meter_type(), _types, &meter_metric_area); + } else { + return meter_expose_metrics(ev, metric_type, _types, &meter_metric_area); + } } void -MeterStrip::set_metric_mode (int metricmode) +MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt) { + metric_type = mt; _types.clear (); switch(metricmode) { case 0: @@ -425,9 +429,12 @@ MeterStrip::set_metric_mode (int metricmode) meter_metric_area.queue_draw (); } -void -MeterStrip::set_pos (int pos) +MeterType +MeterStrip::meter_type() { + assert((!_route && _strip_type == 0) || (_route && _strip_type != 0)); + if (!_route) return metric_type; + return _route->meter_type(); } gint @@ -619,7 +626,10 @@ MeterStrip::set_meter_type (MeterType type) void MeterStrip::meter_type_changed (MeterType type) { - _route->set_meter_type(type); + if (_route->meter_type() != type) { + _route->set_meter_type(type); + } + MetricChanged(); } void diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index 60e77eb2ef..4c532df5c7 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -47,7 +47,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI { public: MeterStrip (ARDOUR::Session*, boost::shared_ptr); - MeterStrip (int); + MeterStrip (int, ARDOUR::MeterType); ~MeterStrip (); void set_session (ARDOUR::Session* s); @@ -63,9 +63,10 @@ class MeterStrip : public Gtk::VBox, public RouteUI void set_meter_type_multi (int, ARDOUR::RouteGroup*, ARDOUR::MeterType); - void set_metric_mode (int); - void set_pos(int); + void set_metric_mode (int, ARDOUR::MeterType); bool has_midi() { return _has_midi; } + bool is_metric_display() { return _strip_type == 0; } + ARDOUR::MeterType meter_type(); protected: boost::shared_ptr _route; @@ -106,6 +107,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI ArdourButton peak_display; std::vector _types; + ARDOUR::MeterType metric_type; float max_peak; bool _has_midi; diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index cdecb36c7c..2b51e9a85f 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -101,8 +101,8 @@ Meterbridge::Meterbridge () , VisibilityTracker (*((Gtk::Window*) this)) , _visible (false) , _show_busses (false) - , metrics_left (1) - , metrics_right (2) + , metrics_left (1, MeterPeak) + , metrics_right (2, MeterPeak) , cur_max_width (-1) { set_name ("Meter Bridge"); @@ -140,7 +140,7 @@ Meterbridge::Meterbridge () signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context()); MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context()); - MeterStrip::MetricChanged.connect_same_thread (*this, boost::bind(&Meterbridge::update_metrics, this)); + MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context()); /* work around ScrolledWindowViewport alignment mess Part one */ Gtk::HBox * yspc = manage (new Gtk::HBox()); @@ -192,6 +192,10 @@ Meterbridge::Meterbridge () Meterbridge::~Meterbridge () { + while (_metrics.size() > 0) { + delete (_metrics.back()); + _metrics.pop_back(); + } } void @@ -550,7 +554,6 @@ Meterbridge::add_strips (RouteList& routes) } resync_order(); - update_metrics(); } void @@ -567,24 +570,6 @@ Meterbridge::remove_strip (MeterStrip* strip) break; } } - update_metrics(); -} - -void -Meterbridge::update_metrics () -{ - bool have_midi = false; - for (list::iterator i = strips.begin(); i != strips.end(); ++i) { - if ( (*i).s->has_midi() && (*i).visible) { - have_midi = true; - break; - } - } - if (have_midi) { - metrics_right.set_metric_mode(2); - } else { - metrics_right.set_metric_mode(3); - } } void @@ -598,6 +583,11 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) int pos = 0; int vis = 0; + unsigned int metrics = 0; + MeterType lmt = MeterPeak; + bool have_midi = false; + metrics_left.set_metric_mode(1, lmt); + for (list::iterator i = strips.begin(); i != strips.end(); ++i) { if (! (*i).s->route()->active()) { @@ -642,9 +632,55 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) (*i).visible = true; vis++; } - (*i).s->set_pos(vis); + + MeterType nmt = (*i).s->meter_type(); + if (nmt == MeterKrms) nmt = MeterPeak; // identical metrics + + if ((*i).visible && nmt != lmt && pos == 0) { + lmt = nmt; + metrics_left.set_metric_mode(1, lmt); + } else if ((*i).visible && nmt != lmt) { + + if (_metrics.size() <= metrics) { + _metrics.push_back(new MeterStrip(have_midi ? 2 : 3, lmt)); + meterarea.pack_start (*_metrics[metrics], false, false); + _metrics[metrics]->set_session(_session); + _metrics[metrics]->show(); + } else { + _metrics[metrics]->set_metric_mode(have_midi ? 2 : 3, lmt); + } + meterarea.reorder_child(*_metrics[metrics], pos++); + metrics++; + + lmt = nmt; + + if (_metrics.size() <= metrics) { + _metrics.push_back(new MeterStrip(1, lmt)); + meterarea.pack_start (*_metrics[metrics], false, false); + _metrics[metrics]->set_session(_session); + _metrics[metrics]->show(); + } else { + _metrics[metrics]->set_metric_mode(1, lmt); + } + meterarea.reorder_child(*_metrics[metrics], pos++); + metrics++; + have_midi = false; + } + + if ((*i).visible && (*i).s->has_midi()) { + have_midi = true; + } + meterarea.reorder_child(*((*i).s), pos++); } + + metrics_right.set_metric_mode(have_midi ? 2 : 3, lmt); + + while (_metrics.size() > metrics) { + meterarea.remove(*_metrics.back()); + delete (_metrics.back()); + _metrics.pop_back(); + } } void @@ -659,21 +695,17 @@ Meterbridge::parameter_changed (std::string const & p) if (p == "show-busses-on-meterbridge") { _show_busses = _session->config.get_show_busses_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "show-master-on-meterbridge") { _show_master = _session->config.get_show_master_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "show-midi-on-meterbridge") { _show_midi = _session->config.get_show_midi_on_meterbridge(); resync_order(); - update_metrics(); } else if (p == "meter-line-up-level") { meter_clear_pattern_cache(); - update_metrics(); } else if (p == "show-rec-on-meterbridge") { scroller.queue_resize(); diff --git a/gtk2_ardour/meterbridge.h b/gtk2_ardour/meterbridge.h index 32ab2c929d..cca31d370c 100644 --- a/gtk2_ardour/meterbridge.h +++ b/gtk2_ardour/meterbridge.h @@ -78,7 +78,6 @@ class Meterbridge : void add_strips (ARDOUR::RouteList&); void remove_strip (MeterStrip *); - void update_metrics (); void session_going_away (); void sync_order_keys (ARDOUR::RouteSortOrderKey src); @@ -116,6 +115,7 @@ class Meterbridge : MeterStrip metrics_left; MeterStrip metrics_right; + std::vector _metrics; Gtk::VBox metrics_vpacker_left; Gtk::VBox metrics_vpacker_right; diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index bf14719d70..bbc60ef425 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -66,6 +66,11 @@ boost::weak_ptr RouteUI::_showing_sends_to; RouteUI::RouteUI (ARDOUR::Session* sess) : AxisView(sess) + , mute_menu(0) + , solo_menu(0) + , sends_menu(0) + , record_menu(0) + , _invert_menu(0) { if (sess) init (); } -- cgit v1.2.3 From d5209cb4bfb1a3ee41ffb45ec0ead71a540f19d1 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 23 Jul 2013 11:28:45 -0400 Subject: fix #5609 (import with 1 track per channel mis-associates tracks + channels) when using ImportDistinctChannels, correctly name regions so that playlists for each channel/track are also named differently, and thus reloaded properly when the session is reloaded. --- gtk2_ardour/editor.h | 10 +++-- gtk2_ardour/editor_audio_import.cc | 83 +++++++++++++++++++++++++++---------- gtk2_ardour/editor_videotimeline.cc | 2 +- gtk2_ardour/sfdb_ui.cc | 3 +- 4 files changed, 70 insertions(+), 28 deletions(-) diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 919d6e0781..c12d1354d1 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1249,13 +1249,17 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool idle_drop_paths (std::vector paths, framepos_t frame, double ypos, bool copy); void drop_paths_part_two (const std::vector& paths, framepos_t frame, double ypos, bool copy); - int import_sndfiles (std::vector paths, Editing::ImportMode mode, ARDOUR::SrcQuality, framepos_t& pos, + int import_sndfiles (std::vector paths, Editing::ImportDisposition, Editing::ImportMode mode, + ARDOUR::SrcQuality, framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr&, bool); - int embed_sndfiles (std::vector paths, bool multiple_files, bool& check_sample_rate, Editing::ImportMode mode, + int embed_sndfiles (std::vector paths, bool multiple_files, bool& check_sample_rate, + Editing::ImportDisposition disposition, Editing::ImportMode mode, framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr&); - int add_sources (std::vector paths, ARDOUR::SourceList& sources, framepos_t& pos, Editing::ImportMode, + int add_sources (std::vector paths, ARDOUR::SourceList& sources, framepos_t& pos, + Editing::ImportDisposition, Editing::ImportMode, int target_regions, int target_tracks, boost::shared_ptr&, bool add_channel_suffix); + int finish_bringing_in_material (boost::shared_ptr region, uint32_t, uint32_t, framepos_t& pos, Editing::ImportMode mode, boost::shared_ptr& existing_track); diff --git a/gtk2_ardour/editor_audio_import.cc b/gtk2_ardour/editor_audio_import.cc index 31ccdb7a53..3cb2d378c2 100644 --- a/gtk2_ardour/editor_audio_import.cc +++ b/gtk2_ardour/editor_audio_import.cc @@ -264,7 +264,7 @@ Editor::get_nth_selected_midi_track (int nth) const } void -Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode, SrcQuality quality, framepos_t& pos) +Editor::do_import (vector paths, ImportDisposition disposition, ImportMode mode, SrcQuality quality, framepos_t& pos) { boost::shared_ptr track; vector to_import; @@ -280,7 +280,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode bool ok = true; - if (chns == Editing::ImportMergeFiles) { + if (disposition == Editing::ImportMergeFiles) { /* create 1 region from all paths, add to 1 track, ignore "track" @@ -299,7 +299,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode ok = false; } else { ipw.show (); - ok = (import_sndfiles (paths, mode, quality, pos, 1, 1, track, false) == 0); + ok = (import_sndfiles (paths, disposition, mode, quality, pos, 1, 1, track, false) == 0); } } else { @@ -334,7 +334,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode ipw.show (); - switch (chns) { + switch (disposition) { case Editing::ImportDistinctFiles: to_import.clear (); @@ -344,7 +344,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode track = get_nth_selected_audio_track (nth++); } - ok = (import_sndfiles (to_import, mode, quality, pos, 1, -1, track, replace) == 0); + ok = (import_sndfiles (to_import, disposition, mode, quality, pos, 1, -1, track, replace) == 0); break; case Editing::ImportDistinctChannels: @@ -352,7 +352,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode to_import.clear (); to_import.push_back (*a); - ok = (import_sndfiles (to_import, mode, quality, pos, -1, -1, track, replace) == 0); + ok = (import_sndfiles (to_import, disposition, mode, quality, pos, -1, -1, track, replace) == 0); break; case Editing::ImportSerializeFiles: @@ -360,7 +360,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode to_import.clear (); to_import.push_back (*a); - ok = (import_sndfiles (to_import, mode, quality, pos, 1, 1, track, replace) == 0); + ok = (import_sndfiles (to_import, disposition, mode, quality, pos, 1, 1, track, replace) == 0); break; case Editing::ImportMergeFiles: @@ -378,7 +378,7 @@ Editor::do_import (vector paths, ImportDisposition chns, ImportMode mode } void -Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, framepos_t& pos) +Editor::do_embed (vector paths, ImportDisposition import_as, ImportMode mode, framepos_t& pos) { boost::shared_ptr track; bool check_sample_rate = true; @@ -388,7 +388,7 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, int nth = 0; bool use_timestamp = (pos == -1); - switch (chns) { + switch (import_as) { case Editing::ImportDistinctFiles: for (vector::iterator a = paths.begin(); a != paths.end(); ++a) { @@ -404,7 +404,7 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, track = get_nth_selected_audio_track (nth++); } - if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, 1, -1, track) < -1) { + if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, -1, track) < -1) { goto out; } } @@ -421,14 +421,14 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, to_embed.clear (); to_embed.push_back (*a); - if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, -1, -1, track) < -1) { + if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, -1, -1, track) < -1) { goto out; } } break; case Editing::ImportMergeFiles: - if (embed_sndfiles (paths, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) { + if (embed_sndfiles (paths, multi, check_sample_rate, import_as, mode, pos, 1, 1, track) < -1) { goto out; } break; @@ -444,7 +444,7 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, to_embed.clear (); to_embed.push_back (*a); - if (embed_sndfiles (to_embed, multi, check_sample_rate, mode, pos, 1, 1, track) < -1) { + if (embed_sndfiles (to_embed, multi, check_sample_rate, import_as, mode, pos, 1, 1, track) < -1) { goto out; } } @@ -460,7 +460,7 @@ Editor::do_embed (vector paths, ImportDisposition chns, ImportMode mode, } int -Editor::import_sndfiles (vector paths, ImportMode mode, SrcQuality quality, framepos_t& pos, +Editor::import_sndfiles (vector paths, ImportDisposition disposition, ImportMode mode, SrcQuality quality, framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr& track, bool replace) { import_status.paths = paths; @@ -501,6 +501,7 @@ Editor::import_sndfiles (vector paths, ImportMode mode, SrcQuality quali import_status.paths, import_status.sources, import_status.pos, + disposition, import_status.mode, import_status.target_regions, import_status.target_tracks, @@ -518,7 +519,8 @@ Editor::import_sndfiles (vector paths, ImportMode mode, SrcQuality quali int Editor::embed_sndfiles (vector paths, bool multifile, - bool& check_sample_rate, ImportMode mode, framepos_t& pos, int target_regions, int target_tracks, + bool& check_sample_rate, ImportDisposition disposition, ImportMode mode, + framepos_t& pos, int target_regions, int target_tracks, boost::shared_ptr& track) { boost::shared_ptr source; @@ -603,6 +605,7 @@ Editor::embed_sndfiles (vector paths, bool multifile, set_canvas_cursor (_cursors->wait); for (int n = 0; n < finfo.channels; ++n) { + try { /* check if we have this thing embedded already */ @@ -613,7 +616,7 @@ Editor::embed_sndfiles (vector paths, bool multifile, source = boost::dynamic_pointer_cast ( SourceFactory::createExternal (DataType::AUDIO, *_session, - path, n, + path, n, (mode == ImportAsTapeTrack ? Source::Destructive : Source::Flag (0)), @@ -638,7 +641,8 @@ Editor::embed_sndfiles (vector paths, bool multifile, goto out; } - ret = add_sources (paths, sources, pos, mode, target_regions, target_tracks, track, true); + + ret = add_sources (paths, sources, pos, disposition, mode, target_regions, target_tracks, track, true); out: set_canvas_cursor (current_canvas_cursor); @@ -646,7 +650,7 @@ Editor::embed_sndfiles (vector paths, bool multifile, } int -Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, ImportMode mode, +Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, ImportDisposition disposition, ImportMode mode, int target_regions, int target_tracks, boost::shared_ptr& track, bool /*add_channel_suffix*/) { vector > regions; @@ -654,7 +658,7 @@ Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, uint32_t input_chan = 0; uint32_t output_chan = 0; bool use_timestamp; - + use_timestamp = (pos == -1); // kludge (for MIDI we're abusing "channel" for "track" here) @@ -707,10 +711,43 @@ Editor::add_sources (vector paths, SourceList& sources, framepos_t& pos, boost::shared_ptr fs = boost::dynamic_pointer_cast (*x); - if (fs) { - region_name = region_name_from_path (fs->path(), false, false, sources.size(), n); - } else{ - region_name = (*x)->name(); + if (sources.size() > 1 && disposition == ImportDistinctChannels) { + + /* generate a per-channel region name so that things work as + * intended + */ + + string path; + + if (fs) { + region_name = basename_nosuffix (fs->path()); + } else { + region_name = (*x)->name(); + } + + switch (sources.size()) { + /* zero and one channel handled + by previous if() condition + */ + case 2: + if (n == 0) { + region_name += "-L"; + } else { + region_name += "-R"; + } + break; + default: + region_name += (char) '-'; + region_name += (char) ('1' + n); + break; + } + + } else { + if (fs) { + region_name = region_name_from_path (fs->path(), false, false, sources.size(), n); + } else{ + region_name = (*x)->name(); + } } PropertyList plist; diff --git a/gtk2_ardour/editor_videotimeline.cc b/gtk2_ardour/editor_videotimeline.cc index 7395d767c7..0a516fb748 100644 --- a/gtk2_ardour/editor_videotimeline.cc +++ b/gtk2_ardour/editor_videotimeline.cc @@ -109,7 +109,7 @@ Editor::embed_audio_from_video (std::string path, framepos_t n) ipw.show (); boost::shared_ptr track; - bool ok = (import_sndfiles (paths, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0); + bool ok = (import_sndfiles (paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, ARDOUR::SrcBest, n, 1, 1, track, false) == 0); if (ok && track) { boost::shared_ptr pl = track->playlist(); pl->find_next_region(n, ARDOUR::End, 0)->set_video_locked(true); diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc index e8db9d4939..986ed7f985 100644 --- a/gtk2_ardour/sfdb_ui.cc +++ b/gtk2_ardour/sfdb_ui.cc @@ -342,7 +342,8 @@ SoundFileBox::audition () try { afs = boost::dynamic_pointer_cast ( SourceFactory::createExternal (DataType::AUDIO, *_session, - path, n, Source::Flag (0), false)); + path, n, + Source::Flag (0), false)); srclist.push_back(afs); -- cgit v1.2.3 From 8e376f7a2a2cd490860bd1c233b7e688ac9ffba3 Mon Sep 17 00:00:00 2001 From: Colin Fletcher Date: Tue, 23 Jul 2013 16:15:23 +0100 Subject: Fix special handling of 'zoom vertical' scroll wheel modifier key. gtkmm2ext/keyboard.cc has a special case to emit a signal on the key-up of the modifier key used to adjust track heights in conjunction with the scroll wheel, so that the same track continues to be resized even when it's shrunk to no longer be under the mouse cursor. However, this code assumed that the modifier key for this was . Fix it to use the event->state bit corresponding to ScrollZoomVerticalModifier instead, and rename the relevant functions to clarify that it's the 'zoom vertical' modifier key they're dealing with. Partially fixes #5610. --- gtk2_ardour/editor.cc | 4 ++-- gtk2_ardour/editor.h | 15 ++++++++------- libs/gtkmm2ext/gtkmm2ext/keyboard.h | 2 +- libs/gtkmm2ext/keyboard.cc | 11 +++++++---- 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index d3e3ae9828..300e317a38 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -697,7 +697,7 @@ Editor::Editor () signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler)); signal_delete_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::exit_on_main_window_close)); - Gtkmm2ext::Keyboard::the_keyboard().ShiftReleased.connect (sigc::mem_fun (*this, &Editor::shift_key_released)); + Gtkmm2ext::Keyboard::the_keyboard().ZoomVerticalModifierReleased.connect (sigc::mem_fun (*this, &Editor::zoom_vertical_modifier_released)); /* allow external control surfaces/protocols to do various things */ @@ -5499,7 +5499,7 @@ Editor::popup_control_point_context_menu (ArdourCanvas::Item* item, GdkEvent* ev } void -Editor::shift_key_released () +Editor::zoom_vertical_modifier_released() { _stepping_axis_view = 0; } diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index c12d1354d1..033888c4b6 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -2082,15 +2082,16 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD bool _control_point_toggled_on_press; /** This is used by TimeAxisView to keep a track of the TimeAxisView that is currently being - stepped in height using Shift-Scrollwheel. When a scroll event occurs, we do the step on - this _stepping_axis_view if it is non-0 (and we set up this _stepping_axis_view with the - TimeAxisView underneath the mouse if it is 0). Then Editor resets _stepping_axis_view when - the shift key is released. In this (hacky) way, pushing shift and moving the scroll wheel - will operate on the same track until shift is released (rather than skipping about to whatever - happens to be underneath the mouse at the time). + stepped in height using ScrollZoomVerticalModifier+Scrollwheel. When a scroll event + occurs, we do the step on this _stepping_axis_view if it is non-0 (and we set up this + _stepping_axis_view with the TimeAxisView underneath the mouse if it is 0). Then Editor + resets _stepping_axis_view when the modifier key is released. In this (hacky) way, + pushing the modifier key and moving the scroll wheel will operate on the same track + until the key is released (rather than skipping about to whatever happens to be + underneath the mouse at the time). */ TimeAxisView* _stepping_axis_view; - void shift_key_released (); + void zoom_vertical_modifier_released(); friend class Drag; friend class RegionDrag; diff --git a/libs/gtkmm2ext/gtkmm2ext/keyboard.h b/libs/gtkmm2ext/gtkmm2ext/keyboard.h index 84988e1525..2c6b026a42 100644 --- a/libs/gtkmm2ext/gtkmm2ext/keyboard.h +++ b/libs/gtkmm2ext/gtkmm2ext/keyboard.h @@ -164,7 +164,7 @@ class Keyboard : public sigc::trackable, PBD::Stateful } }; - sigc::signal0 ShiftReleased; + sigc::signal0 ZoomVerticalModifierReleased; protected: static Keyboard* _the_keyboard; diff --git a/libs/gtkmm2ext/keyboard.cc b/libs/gtkmm2ext/keyboard.cc index f694471d9a..5087f61a23 100644 --- a/libs/gtkmm2ext/keyboard.cc +++ b/libs/gtkmm2ext/keyboard.cc @@ -248,12 +248,15 @@ Keyboard::snooper (GtkWidget *widget, GdkEventKey *event) keyval = event->keyval; } - if (keyval == GDK_Shift_L) { + if (event->state & ScrollZoomVerticalModifier) { /* There is a special and rather hacky situation in Editor which makes - it useful to know when a shift key has been released, so emit a signal - here (see Editor::_stepping_axis_view) + it useful to know when the modifier key for vertical zoom has been + released, so emit a signal here (see Editor::_stepping_axis_view). + Note that the state bit for the modifier key is set for the key-up + event when the modifier is released, but not the key-down when it + is pressed, so we get here on key-up, which is what we want. */ - ShiftReleased (); /* EMIT SIGNAL */ + ZoomVerticalModifierReleased (); /* EMIT SIGNAL */ } if (event->type == GDK_KEY_PRESS) { -- cgit v1.2.3 From c4c70c347d2e264fb33e1965bc1c1ccc16bc2830 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 14:23:20 +0200 Subject: use fixed fall-off time for k-meter --- libs/ardour/meter.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 32c7439fd5..cc014caf63 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -273,6 +273,11 @@ PeakMeter::meter () const size_t limit = min (_peak_signal.size(), (size_t) current_meters.n_total ()); const size_t n_midi = min (_peak_signal.size(), (size_t) current_meters.n_midi()); + /* 0.01f ^= 100 Hz update rate */ + const float midi_meter_falloff = Config->get_meter_falloff() * 0.01f; + /* kmeters: 24dB / 2 sec */ + const float audio_meter_falloff = (_meter_type & (MeterK20 | MeterK14)) ? 0.12f : midi_meter_falloff; + for (size_t n = 0; n < limit; ++n) { /* grab peak since last read */ @@ -283,11 +288,11 @@ PeakMeter::meter () if (n < n_midi) { _max_peak_power[n] = -INFINITY; // std::max (new_peak, _max_peak_power[n]); // XXX _max_peak_signal[n] = 0; - if (Config->get_meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) { + if (midi_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) { ; } else { - /* empirical WRT to falloff times , 0.01f ^= 100 Hz update rate */ - new_peak = _visible_peak_power[n] - sqrt(_visible_peak_power[n] * Config->get_meter_falloff() * 0.01f * 0.0002f); + /* empirical algorithm WRT to audio falloff times */ + new_peak = _visible_peak_power[n] - sqrt(_visible_peak_power[n] * midi_meter_falloff * 0.0002f); if (new_peak < (1.0 / 512.0)) new_peak = 0; } _visible_peak_power[n] = new_peak; @@ -310,11 +315,11 @@ PeakMeter::meter () _max_peak_power[n] = std::max (new_peak, _max_peak_power[n]); - if (Config->get_meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) { + if (audio_meter_falloff == 0.0f || new_peak > _visible_peak_power[n]) { _visible_peak_power[n] = new_peak; } else { // do falloff - new_peak = _visible_peak_power[n] - (Config->get_meter_falloff() * 0.01f); + new_peak = _visible_peak_power[n] - (audio_meter_falloff); _visible_peak_power[n] = std::max (new_peak, -INFINITY); } } -- cgit v1.2.3 From dd65329363c27d4674d8b3ec80342b59340d58be Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 20:24:23 +0200 Subject: clean up video related messages --- gtk2_ardour/export_video_dialog.cc | 2 +- gtk2_ardour/transcode_ffmpeg.cc | 9 +++++---- gtk2_ardour/transcode_video_dialog.cc | 2 +- gtk2_ardour/video_server_dialog.cc | 10 +++++++--- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc index eb4213b237..5ccfa172ea 100644 --- a/gtk2_ardour/export_video_dialog.cc +++ b/gtk2_ardour/export_video_dialog.cc @@ -85,7 +85,7 @@ ExportVideoDialog::ExportVideoDialog (PublicEditor& ed, Session* s) , fps_checkbox (_("Override FPS (Default is to retain FPS from the input video file):")) , meta_checkbox (_("Include Session Metadata")) #if 1 /* tentative debug mode */ - , debug_checkbox (_("Enable Debug Mode: Print ffmpeg Command & Output to stdout.")) + , debug_checkbox (_("Debug Mode: Print ffmpeg command and output to stdout.")) #endif { set_session (s); diff --git a/gtk2_ardour/transcode_ffmpeg.cc b/gtk2_ardour/transcode_ffmpeg.cc index 9499c6c184..9e4aa39fa0 100644 --- a/gtk2_ardour/transcode_ffmpeg.cc +++ b/gtk2_ardour/transcode_ffmpeg.cc @@ -67,18 +67,19 @@ TranscodeFfmpeg::TranscodeFfmpeg (std::string f) } if (ffmpeg_exe.empty() || ffprobe_exe.empty()) { - warning << _( + warning << string_compose( + _( "No ffprobe or ffmpeg executables could be found on this system.\n" "Video import and export is not possible until you install those tools.\n" - "Ardour requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n" + "%1 requires ffmpeg and ffprobe from ffmpeg.org - version 1.1 or newer.\n" "\n" - "The tools are included with the Ardour releases from ardour.org " + "The tools are included with the %1 releases from ardour.org " "and also available with the video-server at http://x42.github.com/harvid/\n" "\n" "Important: the files need to be installed in $PATH and named ffmpeg_harvid and ffprobe_harvid.\n" "If you already have a suitable ffmpeg installation on your system, we recommend creating " "symbolic links from ffmpeg to ffmpeg_harvid and from ffprobe to ffprobe_harvid.\n" - ) << endmsg; + ), PROGRAM_NAME) << endmsg; return; } ffexecok = true; diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc index 5c6ae0c7b4..ee0d755b17 100644 --- a/gtk2_ardour/transcode_video_dialog.cc +++ b/gtk2_ardour/transcode_video_dialog.cc @@ -66,7 +66,7 @@ TranscodeVideoDialog::TranscodeVideoDialog (Session* s, std::string infile) , bitrate_adjustment (2000, 500, 10000, 10, 100, 0) , bitrate_spinner (bitrate_adjustment) #if 1 /* tentative debug mode */ - , debug_checkbox (_("Debug Mode: Print ffmpeg Command and Output to stdout.")) + , debug_checkbox (_("Debug Mode: Print ffmpeg command and output to stdout.")) #endif { set_session (s); diff --git a/gtk2_ardour/video_server_dialog.cc b/gtk2_ardour/video_server_dialog.cc index 8838409ccf..d7a018a045 100644 --- a/gtk2_ardour/video_server_dialog.cc +++ b/gtk2_ardour/video_server_dialog.cc @@ -87,8 +87,10 @@ VideoServerDialog::VideoServerDialog (Session* s) } else { PBD::warning << - _("The external video server 'harvid' can not be found. The tool is included with the Ardour releases from ardour.org, " - "alternatively you can download it from http://x42.github.com/harvid/ or acquire it from your distribution.") << endmsg; + string_compose( + _("The external video server 'harvid' can not be found. The tool is included with the %1 releases from ardour.org, " + "alternatively you can download it from http://x42.github.com/harvid/ or acquire it from your distribution."), PROGRAM_NAME) + << endmsg; } @@ -129,7 +131,9 @@ VideoServerDialog::VideoServerDialog (Session* s) t->attach (*l, 0, 1, 2, 3, FILL); t->attach (cachesize_spinner, 1, 2, 2, 3); - l = manage (new Label (_("Ardour relies on an external Video Server for the videotimeline.\nThe server configured in Edit -> Prefereces -> Video is not reachable.\nDo you want ardour to launch 'harvid' on this machine?"), Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); + l = manage (new Label (string_compose( + _("%1 relies on an external Video Server for the videotimeline.\nThe server configured in Edit -> Prefereces -> Video is not reachable.\nDo you want ardour to launch 'harvid' on this machine?"), PROGRAM_NAME) + , Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER, false)); l->set_max_width_chars(80); l->set_line_wrap(); vbox->pack_start (*l, true, true, 4); -- cgit v1.2.3 From 8da6a70ead63767b701a00aeaf859569b0d31ee4 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 21:20:51 +0200 Subject: implement meter-lineup and VU standard preferences --- gtk2_ardour/level_meter.cc | 38 ++++++++++++++++++++++++++---- gtk2_ardour/rc_option_editor.cc | 26 +++++++++++++++----- libs/ardour/ardour/rc_configuration_vars.h | 1 + libs/ardour/ardour/types.h | 8 +++++++ libs/ardour/enums.cc | 20 ++++++++++++++++ 5 files changed, 82 insertions(+), 11 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index fd32add587..d3bb4ad5ab 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -85,6 +85,34 @@ LevelMeter::set_meter (PeakMeter* meter) } } +static float meter_lineup(float offset) { + switch (Config->get_meter_line_up_level()) { + case MeteringLineUp24: + return offset + 6.0; + case MeteringLineUp20: + return offset + 2.0; + case MeteringLineUp18: + return offset; + case MeteringLineUp15: + return offset - 3.0; + default: + break; + } + return offset; +} + +static float vu_standard() { + // note - default meter config is +2dB (france) + switch (Config->get_meter_vu_standard()) { + case MeteringVUfrench: // +2dB + return 0; + case MeteringVUamerican: // 0dB + return -2; + case MeteringVUstandard: // -4dB + return -6; + } +} + float LevelMeter::update_meters () { @@ -115,18 +143,18 @@ LevelMeter::update_meters () if (meter_type == MeterPeak) { (*i).meter->set (log_meter (peak)); } else if (meter_type == MeterIEC1NOR) { - (*i).meter->set (meter_deflect_nordic (peak)); + (*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0))); } else if (meter_type == MeterIEC1DIN) { - (*i).meter->set (meter_deflect_din (peak)); + (*i).meter->set (meter_deflect_din (peak + meter_lineup(3.0))); } else if (meter_type == MeterIEC2BBC || meter_type == MeterIEC2EBU) { - (*i).meter->set (meter_deflect_ppm (peak)); + (*i).meter->set (meter_deflect_ppm (peak + meter_lineup(0))); } else if (meter_type == MeterVU) { - (*i).meter->set (meter_deflect_vu (peak)); + (*i).meter->set (meter_deflect_vu (peak + vu_standard() + meter_lineup(0))); } else if (meter_type == MeterK14) { (*i).meter->set (meter_deflect_k (peak, 14), meter_deflect_k(_meter->meter_level(n, MeterPeak), 14)); } else if (meter_type == MeterK20) { (*i).meter->set (meter_deflect_k (peak, 20), meter_deflect_k(_meter->meter_level(n, MeterPeak), 20)); - } else { + } else { // RMS (*i).meter->set (log_meter (peak), log_meter(_meter->meter_level(n, MeterPeak))); } } diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 3f984eab29..501d76262b 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1928,20 +1928,34 @@ RCOptionEditor::RCOptionEditor () ComboOption* mlu = new ComboOption ( "meter-line-up-level", - _("Meter line-up level"), + _("Meter line-up level; 0dBu"), sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_line_up_level), sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level) ); - mlu->add (MeteringLineUp24, _("-24dB")); - mlu->add (MeteringLineUp20, _("-20dB (SMPTE)")); - mlu->add (MeteringLineUp18, _("-18dB (EBU)")); - mlu->add (MeteringLineUp15, _("-15dB")); + mlu->add (MeteringLineUp24, _("-24dBFS")); + mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE)")); + mlu->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)")); + mlu->add (MeteringLineUp15, _("-15dBFS (DIN)")); - Gtkmm2ext::UI::instance()->set_tip (mlu->tip_widget(), _("Configure meter-ticks and color-knee point.")); + Gtkmm2ext::UI::instance()->set_tip (mlu->tip_widget(), _("Configure meter-ticks and color-knee point for dBFS scale DPM, set reference/offset level for IEC PPM.")); add_option (S_("Preferences|GUI"), mlu); + + ComboOption* mvu = new ComboOption ( + "meter-vu-standard", + _("VU Meter standard"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_meter_vu_standard), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard) + ); + + mvu->add (MeteringVUfrench, _("+2dB (France)")); + mvu->add (MeteringVUamerican, _(" 0dB (North America, Australia)")); + mvu->add (MeteringVUstandard, _("-4dB (standard)")); + + add_option (S_("Preferences|GUI"), mvu); + Gtk::Adjustment *mpk = manage (new Gtk::Adjustment(0, -10, 0, .1, .1)); HSliderOption *mpks = new HSliderOption("meter-peak", _("Peak threshold [dBFS]"), diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index f87781c8a9..5716fa5105 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -149,6 +149,7 @@ CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", fal CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100.0f) CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 32.0f) +CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUfrench) CONFIG_VARIABLE (MeterLineUp, meter_line_up_level, "meter-line-up-level", MeteringLineUp18) CONFIG_VARIABLE (float, meter_peak, "meter-peak", 0.0f) diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 553ee1ea28..11cdb79575 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -383,6 +383,12 @@ namespace ARDOUR { MeteringRoute ///< meter what is going through the route }; + enum VUMeterStandard { + MeteringVUfrench, // + 2 + MeteringVUamerican, // +-0 + MeteringVUstandard // -4 + }; + enum MeterLineUp { MeteringLineUp24, MeteringLineUp20, @@ -590,6 +596,7 @@ std::istream& operator>>(std::istream& o, ARDOUR::HeaderFormat& sf); std::istream& operator>>(std::istream& o, ARDOUR::AutoConnectOption& sf); std::istream& operator>>(std::istream& o, ARDOUR::EditMode& sf); std::istream& operator>>(std::istream& o, ARDOUR::MonitorModel& sf); +std::istream& operator>>(std::istream& o, ARDOUR::VUMeterStandard& sf); std::istream& operator>>(std::istream& o, ARDOUR::MeterLineUp& sf); std::istream& operator>>(std::istream& o, ARDOUR::PFLPosition& sf); std::istream& operator>>(std::istream& o, ARDOUR::AFLPosition& sf); @@ -612,6 +619,7 @@ std::ostream& operator<<(std::ostream& o, const ARDOUR::HeaderFormat& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::AutoConnectOption& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::EditMode& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::MonitorModel& sf); +std::ostream& operator<<(std::ostream& o, const ARDOUR::VUMeterStandard& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::MeterLineUp& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::PFLPosition& sf); std::ostream& operator<<(std::ostream& o, const ARDOUR::AFLPosition& sf); diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 0d225fada3..e60977a3e5 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -62,6 +62,7 @@ setup_enum_writer () ColorMode _ColorMode; MeterFalloff _MeterFalloff; MeterHold _MeterHold; + VUMeterStandard _VUMeterStandard; MeterLineUp _MeterLineUp; EditMode _EditMode; RegionPoint _RegionPoint; @@ -222,6 +223,11 @@ setup_enum_writer () REGISTER_ENUM (MeterHoldLong); REGISTER (_MeterHold); + REGISTER_ENUM (MeteringVUfrench); + REGISTER_ENUM (MeteringVUamerican); + REGISTER_ENUM (MeteringVUstandard); + REGISTER (_VUMeterStandard); + REGISTER_ENUM (MeteringLineUp24); REGISTER_ENUM (MeteringLineUp20); REGISTER_ENUM (MeteringLineUp18); @@ -675,6 +681,20 @@ std::ostream& operator<<(std::ostream& o, const MonitorModel& var) return o << s; } +std::istream& operator>>(std::istream& o, VUMeterStandard& var) +{ + std::string s; + o >> s; + var = (VUMeterStandard) string_2_enum (s, var); + return o; +} + +std::ostream& operator<<(std::ostream& o, const VUMeterStandard& var) +{ + std::string s = enum_2_string (var); + return o << s; +} + std::istream& operator>>(std::istream& o, MeterLineUp& var) { std::string s; -- cgit v1.2.3 From 5d9fc75d7b3ec79c9fbad313a5eded7f30525d8c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 23:07:17 +0200 Subject: BBC meter labels are always white --- gtk2_ardour/meter_patterns.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 193039b3eb..ef3513f259 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -128,6 +128,9 @@ static inline float mtr_col_and_fract( } break; case MeterIEC2BBC: + fraction = meter_deflect_ppm(val); + cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); + break; case MeterIEC2EBU: fraction = meter_deflect_ppm(val); if (val >= -10.0) { -- cgit v1.2.3 From c8f1a545db1762d992768c47c9b112b0a8902630 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 23:07:41 +0200 Subject: clarify meter preference options --- gtk2_ardour/rc_option_editor.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 501d76262b..2044282862 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1933,8 +1933,8 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_line_up_level) ); - mlu->add (MeteringLineUp24, _("-24dBFS")); - mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE)")); + mlu->add (MeteringLineUp24, _("-24dBFS (SMPTE US: 4dBu = -20dBFS)")); + mlu->add (MeteringLineUp20, _("-20dBFS (SMPTE RP.0155)")); mlu->add (MeteringLineUp18, _("-18dBFS (EBU, BBC)")); mlu->add (MeteringLineUp15, _("-15dBFS (DIN)")); @@ -1950,9 +1950,9 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_meter_vu_standard) ); - mvu->add (MeteringVUfrench, _("+2dB (France)")); - mvu->add (MeteringVUamerican, _(" 0dB (North America, Australia)")); - mvu->add (MeteringVUstandard, _("-4dB (standard)")); + mvu->add (MeteringVUfrench, _("0VU = -2dBu (France)")); + mvu->add (MeteringVUamerican, _("0VU = 0dBu (North America, Australia)")); + mvu->add (MeteringVUstandard, _("0VU = +4dBu (standard)")); add_option (S_("Preferences|GUI"), mvu); -- cgit v1.2.3 From f2b547a14d20a6a8602b37fbcbca535044c0ce65 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 23:11:50 +0200 Subject: change default VU mode to "0VU = +4dBu (standard)" --- libs/ardour/ardour/rc_configuration_vars.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index 5716fa5105..6c351faf25 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -149,7 +149,7 @@ CONFIG_VARIABLE (bool, super_rapid_clock_update, "super-rapid-clock-update", fal CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100.0f) CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 32.0f) -CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUfrench) +CONFIG_VARIABLE (VUMeterStandard, meter_vu_standard, "meter-vu-standard", MeteringVUstandard) CONFIG_VARIABLE (MeterLineUp, meter_line_up_level, "meter-line-up-level", MeteringLineUp18) CONFIG_VARIABLE (float, meter_peak, "meter-peak", 0.0f) -- cgit v1.2.3 From 6706f45b95d39028f643606705aeb3f82686b28c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 23 Jul 2013 23:53:22 +0200 Subject: add "0VU = +8dBu" VU meter config --- gtk2_ardour/level_meter.cc | 8 +++++--- gtk2_ardour/rc_option_editor.cc | 1 + libs/ardour/ardour/types.h | 7 ++++--- libs/ardour/enums.cc | 1 + 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index d3bb4ad5ab..536b83b3f2 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -104,12 +104,14 @@ static float meter_lineup(float offset) { static float vu_standard() { // note - default meter config is +2dB (france) switch (Config->get_meter_vu_standard()) { - case MeteringVUfrench: // +2dB + case MeteringVUfrench: // 0VU = -2dBu return 0; - case MeteringVUamerican: // 0dB + case MeteringVUamerican: // 0VU = 0dBu return -2; - case MeteringVUstandard: // -4dB + case MeteringVUstandard: // 0VU = +4dBu return -6; + case MeteringVUeight: // 0VU = +8dBu + return -10; } } diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 2044282862..4297f61e0b 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1953,6 +1953,7 @@ RCOptionEditor::RCOptionEditor () mvu->add (MeteringVUfrench, _("0VU = -2dBu (France)")); mvu->add (MeteringVUamerican, _("0VU = 0dBu (North America, Australia)")); mvu->add (MeteringVUstandard, _("0VU = +4dBu (standard)")); + mvu->add (MeteringVUstandard, _("0VU = +8dBu")); add_option (S_("Preferences|GUI"), mvu); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 11cdb79575..2115149872 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -384,9 +384,10 @@ namespace ARDOUR { }; enum VUMeterStandard { - MeteringVUfrench, // + 2 - MeteringVUamerican, // +-0 - MeteringVUstandard // -4 + MeteringVUfrench, // 0VU = -2dBu + MeteringVUamerican, // 0VU = 0dBu + MeteringVUstandard, // 0VU = +4dBu + MeteringVUeight // 0VU = +8dBu }; enum MeterLineUp { diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index e60977a3e5..ab181d2956 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -226,6 +226,7 @@ setup_enum_writer () REGISTER_ENUM (MeteringVUfrench); REGISTER_ENUM (MeteringVUamerican); REGISTER_ENUM (MeteringVUstandard); + REGISTER_ENUM (MeteringVUeight); REGISTER (_VUMeterStandard); REGISTER_ENUM (MeteringLineUp24); -- cgit v1.2.3 From 8deccea615aae9a0be0800d7858ccedcea4133e5 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 01:39:16 +0200 Subject: limit width and resize meterbride window --- gtk2_ardour/meter_strip.cc | 4 +++- gtk2_ardour/meter_strip.h | 1 + gtk2_ardour/meterbridge.cc | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 4e4ffe11cf..061c14d468 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -56,6 +56,7 @@ using namespace ArdourMeter; PBD::Signal1 MeterStrip::CatchDeletion; PBD::Signal0 MeterStrip::MetricChanged; +PBD::Signal0 MeterStrip::ConfigurationChanged; MeterStrip::MeterStrip (int metricmode, MeterType mt) : AxisView(0) @@ -366,8 +367,9 @@ MeterStrip::meter_configuration_changed (ChanCount c) _has_midi = true; } - if (old_has_midi != _has_midi) MetricChanged(); on_theme_changed(); + if (old_has_midi != _has_midi) MetricChanged(); + else ConfigurationChanged(); } void diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index 4c532df5c7..fd5f65be3c 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -56,6 +56,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI static PBD::Signal1 CatchDeletion; static PBD::Signal0 MetricChanged; + static PBD::Signal0 ConfigurationChanged; void reset_peak_display (); void reset_route_peak_display (ARDOUR::Route*); diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index 2b51e9a85f..fe29977b86 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -141,6 +141,7 @@ Meterbridge::Meterbridge () Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Meterbridge::sync_order_keys, this, _1), gui_context()); MeterStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Meterbridge::remove_strip, this, _1), gui_context()); MeterStrip::MetricChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::resync_order, this), gui_context()); + MeterStrip::ConfigurationChanged.connect (*this, invalidator (*this), boost::bind(&Meterbridge::queue_resize, this), gui_context()); /* work around ScrolledWindowViewport alignment mess Part one */ Gtk::HBox * yspc = manage (new Gtk::HBox()); @@ -336,7 +337,8 @@ Meterbridge::on_size_request (Gtk::Requisition* r) Gtk::Window::on_size_request(r); Gdk::Geometry geom; - geom.max_width = meterarea.get_width() + metrics_left.get_width() + metrics_right.get_width(); + Gtk::Requisition mr = meterarea.size_request(); + geom.max_width = mr.width + metrics_left.get_width() + metrics_right.get_width(); geom.max_height = max_height; if (cur_max_width != geom.max_width) { -- cgit v1.2.3 From 8b616b075758b5013c65ac89c501b17ca7dc4e49 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 01:43:24 +0200 Subject: meterbridge: meter-type dependent color-schema --- gtk2_ardour/level_meter.cc | 1 + gtk2_ardour/meter_patterns.cc | 93 ++++++++++++++++++++++++++++--------------- 2 files changed, 62 insertions(+), 32 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 536b83b3f2..558000b5f5 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -104,6 +104,7 @@ static float meter_lineup(float offset) { static float vu_standard() { // note - default meter config is +2dB (france) switch (Config->get_meter_vu_standard()) { + default: case MeteringVUfrench: // 0VU = -2dBu return 0; case MeteringVUamerican: // 0VU = 0dBu diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index ef3513f259..756cdcccbd 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -199,6 +199,38 @@ static inline float mtr_col_and_fract( return fraction; } +static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { + switch(type) { + case MeterVU: + cairo_set_source_rgb (cr, 1.0, 1.0, 0.85); + break; + case MeterIEC1DIN: + case MeterIEC1NOR: + case MeterIEC2BBC: + case MeterIEC2EBU: + case MeterK14: + case MeterK20: + cairo_set_source_rgb (cr, 0.1, 0.1, 0.1); + break; + default: + { + Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_ACTIVE); + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); + } + break; + } +} + +static void set_fg_color(MeterType type, Gdk::Color * c) { + switch(type) { + case MeterVU: + c->set_rgb_p(0.0, 0.0, 0.0); + break; + default: + c->set_rgb_p(1.0, 1.0, 1.0); + break; + } +} static cairo_pattern_t* meter_render_ticks (Gtk::Widget& w, MeterType type, vector types) @@ -217,8 +249,13 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ cairo_move_to (cr, 0, 0); cairo_rectangle (cr, 0, 0, width, height); - { - Gdk::Color c = w.get_style()->get_bg (background ? Gtk::STATE_ACTIVE : Gtk::STATE_NORMAL); + + if (background) { + /* meterbridge */ + set_bg_color(w, cr, type); + } else { + /* mixer */ + Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } cairo_fill (cr); @@ -229,24 +266,16 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ for (vector::const_iterator i = types.begin(); i != types.end(); ++i) { Gdk::Color c; - c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - - if (types.size() > 1) { + if (types.size() > 1 && (*i) == DataType::MIDI) { /* we're overlaying more than 1 set of marks, so use different colours */ - switch (*i) { - case DataType::AUDIO: - c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - case DataType::MIDI: - c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - } + c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + } else if (background) { + set_fg_color(type, &c); + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); // tick-maker position in dBFS, line-thickness std::map points; @@ -503,8 +532,12 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) cairo_move_to (cr, 0, 0); cairo_rectangle (cr, 0, 0, width, height); - { - Gdk::Color c = w.get_style()->get_bg (background ? Gtk::STATE_ACTIVE : Gtk::STATE_NORMAL); + if (background) { + /* meterbridge */ + set_bg_color(w, cr, type); + } else { + /* mixer */ + Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_NORMAL); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } cairo_fill (cr); @@ -513,26 +546,20 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) height = min(max_pattern_metric_size, height); uint32_t peakcolor = ARDOUR_UI::config()->color_by_name ("meterbridge peaklabel"); + Gdk::Color c; for (vector::const_iterator i = types.begin(); i != types.end(); ++i) { - Gdk::Color c; - if (types.size() > 1) { + if (types.size() > 1 && (*i) == DataType::MIDI) { /* we're overlaying more than 1 set of marks, so use different colours */ - switch (*i) { - case DataType::AUDIO: - c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - case DataType::MIDI: - c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - break; - } + c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + } else if (background) { + set_fg_color(type, &c); + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } + cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); // label-pos in dBFS, label-text @@ -780,7 +807,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) layout->get_pixel_size(tw, th); break; } - Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + if (!background) { + c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); + } cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); if (tickleft) { cairo_move_to (cr, width - 2 - tw, height - th - 0.5); -- cgit v1.2.3 From efb16a6faab10668cb9bd51c6b889b569bcd9fe7 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 02:46:53 +0200 Subject: meter background color.. --- gtk2_ardour/level_meter.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 558000b5f5..0046cbc824 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -255,7 +255,12 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) for (int32_t n = nmeters-1; nmeters && n >= 0 ; --n) { uint32_t c[10]; + uint32_t b[4]; float stp[4]; + b[0] = ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(); + b[1] = ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get(); + b[2] = 0x991122ff; // red highlight gradient Bot + b[3] = 0x551111ff; // red highlight gradient Top if (n < nmidi) { c[0] = ARDOUR_UI::config()->canvasvar_MidiMeterColor0.get(); c[1] = ARDOUR_UI::config()->canvasvar_MidiMeterColor1.get(); @@ -330,6 +335,8 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) stp[1] = 115.0 * meter_deflect_vu(-23); // -3 stp[2] = 115.0 * meter_deflect_vu(-20); // 0 stp[3] = 115.0 * meter_deflect_vu(-18); // +2 + b[0] = 0x80806dff; + b[1] = 0xc0c0a3ff; break; default: // PEAK, RMS stp[1] = 77.5; // 115 * log_meter(-10) @@ -357,9 +364,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], - ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(), - ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get(), - 0x991122ff, 0x551111ff, + b[0], b[1], b[2], b[3], stp[0], stp[1], stp[2], stp[3] ); meters[n].width = width; -- cgit v1.2.3 From fa332f31fa43d8807b197a1cabfd39784cf3ef8a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 02:47:37 +0200 Subject: allow to en/disable shade and LED meter style --- gtk2_ardour/level_meter.cc | 5 ++++- libs/gtkmm2ext/fastmeter.cc | 39 ++++++++++++++++++++---------------- libs/gtkmm2ext/gtkmm2ext/fastmeter.h | 19 +++++++++++------- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 0046cbc824..d57481b701 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -257,6 +257,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) uint32_t c[10]; uint32_t b[4]; float stp[4]; + int styleflags = 3; b[0] = ARDOUR_UI::config()->canvasvar_MeterBackgroundBot.get(); b[1] = ARDOUR_UI::config()->canvasvar_MeterBackgroundTop.get(); b[2] = 0x991122ff; // red highlight gradient Bot @@ -337,6 +338,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) stp[3] = 115.0 * meter_deflect_vu(-18); // +2 b[0] = 0x80806dff; b[1] = 0xc0c0a3ff; + styleflags = 1; break; default: // PEAK, RMS stp[1] = 77.5; // 115 * log_meter(-10) @@ -365,7 +367,8 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], b[0], b[1], b[2], b[3], - stp[0], stp[1], stp[2], stp[3] + stp[0], stp[1], stp[2], stp[3], + styleflags ); meters[n].width = width; meters[n].length = len; diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc index 817b11ff6c..282b9e10b8 100644 --- a/libs/gtkmm2ext/fastmeter.cc +++ b/libs/gtkmm2ext/fastmeter.cc @@ -51,7 +51,8 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, int bgc0, int bgc1, int bgh0, int bgh1, float stp0, float stp1, - float stp2, float stp3 + float stp2, float stp3, + int styleflags ) { orientation = o; @@ -88,6 +89,8 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, _stp[2] = stp2; _stp[3] = stp3; + _styleflags = styleflags; + set_events (BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK); pixrect.x = 1; @@ -96,7 +99,7 @@ FastMeter::FastMeter (long hold, unsigned long dimen, Orientation o, int len, if (!len) { len = 250; } - fgpattern = request_vertical_meter(dimen, len, _clr, _stp, true); + fgpattern = request_vertical_meter(dimen, len, _clr, _stp, _styleflags); bgpattern = request_vertical_background (dimen, len, _bgc, false); pixheight = len; pixwidth = dimen; @@ -116,7 +119,7 @@ FastMeter::~FastMeter () Cairo::RefPtr FastMeter::generate_meter_pattern ( - int width, int height, int *clr, float *stp, bool shade) + int width, int height, int *clr, float *stp, int styleflags) { guint8 r,g,b,a; double knee; @@ -177,7 +180,7 @@ FastMeter::generate_meter_pattern ( cairo_pattern_add_color_stop_rgb (pat, 1.0, r/255.0, g/255.0, b/255.0); - if (shade && !no_rgba_overlay) { + if ((styleflags & 1) && !no_rgba_overlay) { cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0); cairo_pattern_add_color_stop_rgba (shade_pattern, 0, 1.0, 1.0, 1.0, 0.2); cairo_pattern_add_color_stop_rgba (shade_pattern, 1, 0.0, 0.0, 0.0, 0.3); @@ -190,16 +193,18 @@ FastMeter::generate_meter_pattern ( cairo_rectangle (tc, 0, 0, width, height); cairo_fill (tc); - cairo_save (tc); - cairo_set_line_width(tc, 1.0); - cairo_set_source_rgba(tc, .1, .1, .1, .5); - //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE); - for (float y=.5; y < height; y+= 2.0) { - cairo_move_to(tc, 0, y); - cairo_line_to(tc, width, y); - cairo_stroke (tc); + if (styleflags & 2) { // LED stripes + cairo_save (tc); + cairo_set_line_width(tc, 1.0); + cairo_set_source_rgba(tc, .1, .1, .1, .5); + //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE); + for (float y=.5; y < height; y+= 2.0) { + cairo_move_to(tc, 0, y); + cairo_line_to(tc, width, y); + cairo_stroke (tc); + } + cairo_restore (tc); } - cairo_restore (tc); cairo_set_source (tc, shade_pattern); cairo_rectangle (tc, 0, 0, width, height); @@ -270,7 +275,7 @@ FastMeter::generate_meter_background ( Cairo::RefPtr FastMeter::request_vertical_meter( - int width, int height, int *clr, float *stp, bool shade) + int width, int height, int *clr, float *stp, int styleflags) { if (height < min_pattern_metric_size) height = min_pattern_metric_size; @@ -281,7 +286,7 @@ FastMeter::request_vertical_meter( stp[0], stp[1], stp[2], stp[3], clr[0], clr[1], clr[2], clr[3], clr[4], clr[5], clr[6], clr[7], - clr[8], clr[9]); + clr[8], clr[9], styleflags); Pattern10Map::iterator i; if ((i = vm_pattern_cache.find (key)) != vm_pattern_cache.end()) { @@ -290,7 +295,7 @@ FastMeter::request_vertical_meter( // TODO flush pattern cache if it gets too large Cairo::RefPtr p = generate_meter_pattern ( - width, height, clr, stp, shade); + width, height, clr, stp, styleflags); vm_pattern_cache[key] = p; return p; @@ -361,7 +366,7 @@ FastMeter::on_size_allocate (Gtk::Allocation &alloc) } if (pixheight != h) { - fgpattern = request_vertical_meter (request_width, h, _clr, _stp, true); + fgpattern = request_vertical_meter (request_width, h, _clr, _stp, _styleflags); bgpattern = request_vertical_background (request_width, h, highlight ? _bgh : _bgc, highlight); pixheight = h - 2; pixwidth = request_width - 2; diff --git a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h index 15c962deb4..3a806262f1 100644 --- a/libs/gtkmm2ext/gtkmm2ext/fastmeter.h +++ b/libs/gtkmm2ext/gtkmm2ext/fastmeter.h @@ -47,7 +47,8 @@ class FastMeter : public Gtk::DrawingArea { float stp0 = 55.0, // log_meter(-18); float stp1 = 77.5, // log_meter(-9); float stp2 = 92.5, // log_meter(-3); // 95.0, // log_meter(-2); - float stp3 = 100.0 + float stp3 = 100.0, + int styleflags = 3 ); virtual ~FastMeter (); @@ -79,6 +80,7 @@ private: int _clr[10]; int _bgc[2]; int _bgh[2]; + int _styleflags; Orientation orientation; GdkRectangle pixrect; @@ -99,14 +101,14 @@ private: static bool no_rgba_overlay; static Cairo::RefPtr generate_meter_pattern ( - int w, int h, int *clr, float *stp, bool shade); + int, int, int *, float *, int); static Cairo::RefPtr request_vertical_meter ( - int w, int h, int *clr, float *stp, bool shade); + int, int, int *, float *, int); static Cairo::RefPtr generate_meter_background ( - int w, int h, int *bgc, bool shade); + int, int, int *, bool); static Cairo::RefPtr request_vertical_background ( - int w, int h, int *bgc, bool shade); + int, int, int *, bool); struct Pattern10MapKey { Pattern10MapKey ( @@ -114,20 +116,23 @@ private: float stp0, float stp1, float stp2, float stp3, int c0, int c1, int c2, int c3, int c4, int c5, int c6, int c7, - int c8, int c9 + int c8, int c9, int st ) : dim(w, h) , stp(stp0, stp1, stp2, stp3) , cols(c0, c1, c2, c3, c4, c5, c6, c7, c8, c9) + , style(st) {} inline bool operator<(const Pattern10MapKey& rhs) const { return (dim < rhs.dim) || (dim == rhs.dim && stp < rhs.stp) - || (dim == rhs.dim && stp == rhs.stp && cols < rhs.cols); + || (dim == rhs.dim && stp == rhs.stp && cols < rhs.cols) + || (dim == rhs.dim && stp == rhs.stp && cols == rhs.cols && style < rhs.style); } boost::tuple dim; boost::tuple stp; boost::tuple cols; + int style; }; typedef std::map > Pattern10Map; -- cgit v1.2.3 From 6b96a4baa30e60bcabced774acbb6d0c686a5014 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 11:57:11 +0200 Subject: amend to 8deccea6 (resize meterbridge window) --- gtk2_ardour/meterbridge.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index fe29977b86..a2bc047bdb 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -683,6 +683,7 @@ Meterbridge::sync_order_keys (RouteSortOrderKey src) delete (_metrics.back()); _metrics.pop_back(); } + queue_resize(); } void -- cgit v1.2.3 From d8372bdf9b62eec064ec7e94bb6237a5363ee40a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 11:59:40 +0200 Subject: color meterbridge strips --- gtk2_ardour/ardour3_styles.rc.in | 17 +++++++++++++ gtk2_ardour/ardour3_widget_list.rc | 4 +++ gtk2_ardour/meter_patterns.cc | 8 +++--- gtk2_ardour/meter_strip.cc | 52 ++++++++++++++++++++++++++++---------- gtk2_ardour/meter_strip.h | 4 ++- 5 files changed, 68 insertions(+), 17 deletions(-) diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in index 45b8458370..8a88e7cbbe 100644 --- a/gtk2_ardour/ardour3_styles.rc.in +++ b/gtk2_ardour/ardour3_styles.rc.in @@ -989,3 +989,20 @@ style "default_toggle_button" bg[ACTIVE] = @@COLPREFIX@_contrasting_indicator fg[ACTIVE] = @@COLPREFIX@_darkest } + + +style "meter_strip_dpm" = "default" +{ +} + +style "meter_strip_ppm" = "default" +{ + bg[NORMAL] = { 0.1, 0.1, 0.1 } + fg[NORMAL] = { 1.0, 1.0, 1.0 } +} + +style "meter_strip_vu" = "default" +{ + bg[NORMAL] = { 1.0, 1.0, 0.85 } + fg[NORMAL] = { 0.0, 0.0, 0.0 } +} diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc index 05ebde9421..26b9a99b7f 100644 --- a/gtk2_ardour/ardour3_widget_list.rc +++ b/gtk2_ardour/ardour3_widget_list.rc @@ -290,6 +290,10 @@ widget "*PluginLoadButton" style:highest "small_button" widget "*PluginLoadButton*" style:highest "small_button" widget "*PluginEditorButton" style:highest "default_toggle_button" +widget "*meterstripPPM" style:highest "meter_strip_ppm" +widget "*meterstripDPM" style:highest "meter_strip_dpm" +widget "*meterstripVU" style:highest "meter_strip_vu" + widget "*MetricDialogFrame" style:highest "base_frame" widget "*MetricEntry" style:highest "medium_bold_entry" widget "*MetricButton" style:highest "default_button" diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 756cdcccbd..4cd96f2433 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -200,6 +200,7 @@ static inline float mtr_col_and_fract( } static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { + // TODO use "meterstrip*" stype switch(type) { case MeterVU: cairo_set_source_rgb (cr, 1.0, 1.0, 0.85); @@ -221,7 +222,8 @@ static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { } } -static void set_fg_color(MeterType type, Gdk::Color * c) { +static void set_fg_color(Gtk::Widget& w, MeterType type, Gdk::Color * c) { + // TODO use "meterstrip*" stype switch(type) { case MeterVU: c->set_rgb_p(0.0, 0.0, 0.0); @@ -270,7 +272,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ /* we're overlaying more than 1 set of marks, so use different colours */ c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); } else if (background) { - set_fg_color(type, &c); + set_fg_color(w, type, &c); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); @@ -554,7 +556,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) /* we're overlaying more than 1 set of marks, so use different colours */ c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); } else if (background) { - set_fg_color(type, &c); + set_fg_color(w, type, &c); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } else { c = w.get_style()->get_fg (Gtk::STATE_NORMAL); diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 061c14d468..f7f18fb273 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -64,7 +64,7 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt) { level_meter = 0; _strip_type = 0; - set_spacing(2); + strip.set_spacing(2); peakbx.set_size_request(-1, 14); namebx.set_size_request(18, 52); @@ -77,15 +77,17 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt) meterbox.pack_start(meter_metric_area, true, false); - pack_start (peakbx, false, false); - pack_start (meterbox, true, true); - pack_start (btnbox, false, false); - pack_start (namebx, false, false); + strip.pack_start (peakbx, false, false); + strip.pack_start (meterbox, true, true); + strip.pack_start (btnbox, false, false); + strip.pack_start (namebx, false, false); + add(strip); peakbx.show(); btnbox.show(); meter_metric_area.show(); meterbox.show(); + strip.show(); UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed)); @@ -98,7 +100,7 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) , _route(rt) , peak_display() { - set_spacing(2); + strip.set_spacing(2); RouteUI::set_route (rt); SessionHandlePtr::set_session (sess); @@ -174,11 +176,12 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) update_button_box(); update_name_box(); + update_background (_route->meter_type()); - pack_start (peakbx, false, false); - pack_start (meterbox, true, true); - pack_start (btnbox, false, false); - pack_start (namebx, false, false); + strip.pack_start (peakbx, false, false); + strip.pack_start (meterbox, true, true); + strip.pack_start (btnbox, false, false); + strip.pack_start (namebx, false, false); name_label.show(); peak_display.show(); peakbx.show(); @@ -189,6 +192,8 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) meter_align.show(); peak_align.show(); btnbox.show(); + add(strip); + strip.show(); _route->shared_peak_meter()->ConfigurationChanged.connect ( route_connections, invalidator (*this), boost::bind (&MeterStrip::meter_configuration_changed, this, _1), gui_context() @@ -375,7 +380,7 @@ MeterStrip::meter_configuration_changed (ChanCount c) void MeterStrip::on_size_request (Gtk::Requisition* r) { - VBox::on_size_request(r); + EventBox::on_size_request(r); } void @@ -390,7 +395,7 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a) name_label.set_size_request(18, nh-2); name_label.layout()->set_width((nh-4) * PANGO_SCALE); } - VBox::on_size_allocate(a); + EventBox::on_size_allocate(a); } gint @@ -427,10 +432,30 @@ MeterStrip::set_metric_mode (int metricmode, ARDOUR::MeterType mt) _types.push_back (DataType::AUDIO); break; } - + update_background (mt); meter_metric_area.queue_draw (); } +void +MeterStrip::update_background(MeterType type) +{ + switch(type) { + case MeterIEC1DIN: + case MeterIEC1NOR: + case MeterIEC2BBC: + case MeterIEC2EBU: + case MeterK14: + case MeterK20: + set_name ("meterstripPPM"); + break; + case MeterVU: + set_name ("meterstripVU"); + break; + default: + set_name ("meterstripDPM"); + } +} + MeterType MeterStrip::meter_type() { @@ -631,6 +656,7 @@ MeterStrip::meter_type_changed (MeterType type) if (_route->meter_type() != type) { _route->set_meter_type(type); } + update_background (type); MetricChanged(); } diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index fd5f65be3c..4b5868e9d2 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -43,7 +43,7 @@ namespace Gtk { class Style; } -class MeterStrip : public Gtk::VBox, public RouteUI +class MeterStrip : public Gtk::EventBox, public RouteUI { public: MeterStrip (ARDOUR::Session*, boost::shared_ptr); @@ -90,6 +90,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI void set_button_names (); private: + Gtk::VBox strip; Gtk::HBox meterbox; Gtk::HBox namebx; ArdourButton name_label; @@ -120,6 +121,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI void strip_property_changed (const PBD::PropertyChange&); void meter_configuration_changed (ARDOUR::ChanCount); void meter_type_changed (ARDOUR::MeterType); + void update_background (ARDOUR::MeterType); static int max_pattern_metric_size; // == FastMeter::max_pattern_metric_size -- cgit v1.2.3 From 6f72c8534458dccf1901a95f366280728eee58bd Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 15:47:53 +0200 Subject: add separator line to meterbridge --- gtk2_ardour/ardour3_styles.rc.in | 5 +++ gtk2_ardour/ardour3_widget_list.rc | 1 + gtk2_ardour/meter_strip.cc | 69 +++++++++++++++++++++++++++----------- gtk2_ardour/meter_strip.h | 8 +++-- 4 files changed, 62 insertions(+), 21 deletions(-) diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in index 8a88e7cbbe..7a432f06dd 100644 --- a/gtk2_ardour/ardour3_styles.rc.in +++ b/gtk2_ardour/ardour3_styles.rc.in @@ -1006,3 +1006,8 @@ style "meter_strip_vu" = "default" bg[NORMAL] = { 1.0, 1.0, 0.85 } fg[NORMAL] = { 0.0, 0.0, 0.0 } } + +style "meter_strip_sep" = "default" +{ + bg[NORMAL] = { 0.0, 0.0, 0.0 } +} diff --git a/gtk2_ardour/ardour3_widget_list.rc b/gtk2_ardour/ardour3_widget_list.rc index 26b9a99b7f..0e7075cef4 100644 --- a/gtk2_ardour/ardour3_widget_list.rc +++ b/gtk2_ardour/ardour3_widget_list.rc @@ -293,6 +293,7 @@ widget "*PluginEditorButton" style:highest "default_toggle_button" widget "*meterstripPPM" style:highest "meter_strip_ppm" widget "*meterstripDPM" style:highest "meter_strip_dpm" widget "*meterstripVU" style:highest "meter_strip_vu" +widget "*BlackSeparator" style:highest "meter_strip_sep" widget "*MetricDialogFrame" style:highest "base_frame" widget "*MetricEntry" style:highest "medium_bold_entry" diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index f7f18fb273..8ec9834c9d 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -64,9 +64,11 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt) { level_meter = 0; _strip_type = 0; - strip.set_spacing(2); + mtr_vbox.set_spacing(2); + nfo_vbox.set_spacing(2); peakbx.set_size_request(-1, 14); namebx.set_size_request(18, 52); + spacer.set_size_request(-1,0); set_metric_mode(metricmode, mt); @@ -77,17 +79,30 @@ MeterStrip::MeterStrip (int metricmode, MeterType mt) meterbox.pack_start(meter_metric_area, true, false); - strip.pack_start (peakbx, false, false); - strip.pack_start (meterbox, true, true); - strip.pack_start (btnbox, false, false); - strip.pack_start (namebx, false, false); - add(strip); + mtr_vbox.pack_start (peakbx, false, false); + mtr_vbox.pack_start (meterbox, true, true); + mtr_vbox.pack_start (spacer, false, false); + mtr_container.add(mtr_vbox); + + mtr_hsep.set_size_request(-1,1); + mtr_hsep.set_name("BlackSeparator"); + + nfo_vbox.pack_start (mtr_hsep, false, false); + nfo_vbox.pack_start (btnbox, false, false); + nfo_vbox.pack_start (namebx, false, false); + + pack_start (mtr_container, true, true); + pack_start (nfo_vbox, false, false); peakbx.show(); btnbox.show(); meter_metric_area.show(); meterbox.show(); - strip.show(); + spacer.show(); + mtr_vbox.show(); + mtr_container.show(); + mtr_hsep.show(); + nfo_vbox.show(); UI::instance()->theme_changed.connect (sigc::mem_fun(*this, &MeterStrip::on_theme_changed)); ColorsChanged.connect (sigc::mem_fun (*this, &MeterStrip::on_theme_changed)); @@ -100,7 +115,8 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) , _route(rt) , peak_display() { - strip.set_spacing(2); + mtr_vbox.set_spacing(2); + nfo_vbox.set_spacing(2); RouteUI::set_route (rt); SessionHandlePtr::set_session (sess); @@ -173,27 +189,42 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr rt) mutebox.set_size_request(16, 16); solobox.set_size_request(16, 16); recbox.set_size_request(16, 16); + spacer.set_size_request(-1,0); update_button_box(); update_name_box(); update_background (_route->meter_type()); - strip.pack_start (peakbx, false, false); - strip.pack_start (meterbox, true, true); - strip.pack_start (btnbox, false, false); - strip.pack_start (namebx, false, false); + mtr_vbox.pack_start (peakbx, false, false); + mtr_vbox.pack_start (meterbox, true, true); + mtr_vbox.pack_start (spacer, false, false); + mtr_container.add(mtr_vbox); + + mtr_hsep.set_size_request(-1,1); + mtr_hsep.set_name("BlackSeparator"); + + nfo_vbox.pack_start (mtr_hsep, false, false); + nfo_vbox.pack_start (btnbox, false, false); + nfo_vbox.pack_start (namebx, false, false); + + pack_start (mtr_container, true, true); + pack_start (nfo_vbox, false, false); + name_label.show(); peak_display.show(); peakbx.show(); meter_ticks1_area.show(); meter_ticks2_area.show(); meterbox.show(); + spacer.show(); level_meter->show(); meter_align.show(); peak_align.show(); btnbox.show(); - add(strip); - strip.show(); + mtr_vbox.show(); + mtr_container.show(); + mtr_hsep.show(); + nfo_vbox.show(); _route->shared_peak_meter()->ConfigurationChanged.connect ( route_connections, invalidator (*this), boost::bind (&MeterStrip::meter_configuration_changed, this, _1), gui_context() @@ -380,7 +411,7 @@ MeterStrip::meter_configuration_changed (ChanCount c) void MeterStrip::on_size_request (Gtk::Requisition* r) { - EventBox::on_size_request(r); + VBox::on_size_request(r); } void @@ -395,7 +426,7 @@ MeterStrip::on_size_allocate (Gtk::Allocation& a) name_label.set_size_request(18, nh-2); name_label.layout()->set_width((nh-4) * PANGO_SCALE); } - EventBox::on_size_allocate(a); + VBox::on_size_allocate(a); } gint @@ -446,13 +477,13 @@ MeterStrip::update_background(MeterType type) case MeterIEC2EBU: case MeterK14: case MeterK20: - set_name ("meterstripPPM"); + mtr_container.set_name ("meterstripPPM"); break; case MeterVU: - set_name ("meterstripVU"); + mtr_container.set_name ("meterstripVU"); break; default: - set_name ("meterstripDPM"); + mtr_container.set_name ("meterstripDPM"); } } diff --git a/gtk2_ardour/meter_strip.h b/gtk2_ardour/meter_strip.h index 4b5868e9d2..f1fe69bce2 100644 --- a/gtk2_ardour/meter_strip.h +++ b/gtk2_ardour/meter_strip.h @@ -43,7 +43,7 @@ namespace Gtk { class Style; } -class MeterStrip : public Gtk::EventBox, public RouteUI +class MeterStrip : public Gtk::VBox, public RouteUI { public: MeterStrip (ARDOUR::Session*, boost::shared_ptr); @@ -90,8 +90,12 @@ class MeterStrip : public Gtk::EventBox, public RouteUI void set_button_names (); private: - Gtk::VBox strip; + Gtk::VBox mtr_vbox; + Gtk::VBox nfo_vbox; + Gtk::EventBox mtr_container; + Gtk::HSeparator mtr_hsep; Gtk::HBox meterbox; + Gtk::HBox spacer; Gtk::HBox namebx; ArdourButton name_label; Gtk::DrawingArea meter_metric_area; -- cgit v1.2.3 From fd9c0a63fdaf689f60aa9f434a2bd148cb4fec2f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 15:26:40 +0200 Subject: increase meterbridge with if scrollbar is not visible.. --- gtk2_ardour/meterbridge.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc index a2bc047bdb..3042ba1d0e 100644 --- a/gtk2_ardour/meterbridge.cc +++ b/gtk2_ardour/meterbridge.cc @@ -338,9 +338,25 @@ Meterbridge::on_size_request (Gtk::Requisition* r) Gdk::Geometry geom; Gtk::Requisition mr = meterarea.size_request(); + geom.max_width = mr.width + metrics_left.get_width() + metrics_right.get_width(); geom.max_height = max_height; + const Gtk::Scrollbar * hsc = scroller.get_hscrollbar(); + Glib::RefPtr screen = get_screen (); + Gdk::Rectangle monitor_rect; + screen->get_monitor_geometry (0, monitor_rect); + const int scr_w = monitor_rect.get_width() - 44; + + if (cur_max_width < geom.max_width + && cur_max_width < scr_w + && !(scroller.get_hscrollbar_visible() && hsc)) { + int h = r->height; + *r = Gtk::Requisition(); + r->width = geom.max_width; + r->height = h; + } + if (cur_max_width != geom.max_width) { cur_max_width = geom.max_width; geom.height_inc = 16; -- cgit v1.2.3 From 2ca3329c1084451feacd724e5411f06222de9f1b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 16:15:06 +0200 Subject: fix display-type of editor-mixer level-meter --- gtk2_ardour/level_meter.cc | 3 ++- gtk2_ardour/level_meter.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index d57481b701..f0562ea716 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -361,7 +361,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) } } } - if (meters[n].width != width || meters[n].length != len || color_changed) { + if (meters[n].width != width || meters[n].length != len || color_changed || meter_type != visible_meter_type) { delete meters[n].meter; meters[n].meter = new FastMeter ((uint32_t) floor (Config->get_meter_hold()), width, FastMeter::Vertical, len, c[0], c[1], c[2], c[3], c[4], @@ -383,6 +383,7 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) } show(); color_changed = false; + visible_meter_type = meter_type; } void diff --git a/gtk2_ardour/level_meter.h b/gtk2_ardour/level_meter.h index ead63aa50b..d3fd4f9bbd 100644 --- a/gtk2_ardour/level_meter.h +++ b/gtk2_ardour/level_meter.h @@ -101,6 +101,7 @@ class LevelMeter : public Gtk::HBox, public ARDOUR::SessionHandlePtr std::vector meters; float max_peak; ARDOUR::MeterType meter_type; + ARDOUR::MeterType visible_meter_type; PBD::ScopedConnection _configuration_connection; PBD::ScopedConnection _meter_type_connection; -- cgit v1.2.3 From 33b067c12c93fe3499a6290c8db48517df97c73c Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 15:47:01 +0200 Subject: increase saturation of meter-shader --- libs/gtkmm2ext/fastmeter.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libs/gtkmm2ext/fastmeter.cc b/libs/gtkmm2ext/fastmeter.cc index 282b9e10b8..bac0ba0c92 100644 --- a/libs/gtkmm2ext/fastmeter.cc +++ b/libs/gtkmm2ext/fastmeter.cc @@ -182,8 +182,9 @@ FastMeter::generate_meter_pattern ( if ((styleflags & 1) && !no_rgba_overlay) { cairo_pattern_t* shade_pattern = cairo_pattern_create_linear (0.0, 0.0, width, 0.0); - cairo_pattern_add_color_stop_rgba (shade_pattern, 0, 1.0, 1.0, 1.0, 0.2); - cairo_pattern_add_color_stop_rgba (shade_pattern, 1, 0.0, 0.0, 0.0, 0.3); + cairo_pattern_add_color_stop_rgba (shade_pattern, 0, 0.0, 0.0, 0.0, 0.15); + cairo_pattern_add_color_stop_rgba (shade_pattern, 0.4, 1.0, 1.0, 1.0, 0.05); + cairo_pattern_add_color_stop_rgba (shade_pattern, 1, 0.0, 0.0, 0.0, 0.25); cairo_surface_t* surface; cairo_t* tc = 0; @@ -196,7 +197,7 @@ FastMeter::generate_meter_pattern ( if (styleflags & 2) { // LED stripes cairo_save (tc); cairo_set_line_width(tc, 1.0); - cairo_set_source_rgba(tc, .1, .1, .1, .5); + cairo_set_source_rgba(tc, .0, .0, .0, .3); //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE); for (float y=.5; y < height; y+= 2.0) { cairo_move_to(tc, 0, y); -- cgit v1.2.3 From 6981e4d68e6f0bcb49a5f1d1518257283dbbaaeb Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 16:14:27 +0200 Subject: revert VU meter background to default gray-shade --- gtk2_ardour/level_meter.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index f0562ea716..05f7569925 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -336,8 +336,6 @@ LevelMeter::setup_meters (int len, int initial_width, int thin_width) stp[1] = 115.0 * meter_deflect_vu(-23); // -3 stp[2] = 115.0 * meter_deflect_vu(-20); // 0 stp[3] = 115.0 * meter_deflect_vu(-18); // +2 - b[0] = 0x80806dff; - b[1] = 0xc0c0a3ff; styleflags = 1; break; default: // PEAK, RMS -- cgit v1.2.3 From b70057f5769bcb52ddd3072282d419d38b829a45 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 22:04:46 +0200 Subject: add [master] meter to the toolbar http://tracker.ardour.org/view.php?id=5601 --- gtk2_ardour/ardour_ui.cc | 31 +++++++++++++++++++++++++++++++ gtk2_ardour/ardour_ui.h | 7 +++++++ gtk2_ardour/ardour_ui2.cc | 1 + gtk2_ardour/ardour_ui_dialogs.cc | 27 +++++++++++++++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 556dee99fe..6a000d2981 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -181,6 +181,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) , solo_alert_button (_("solo")) , feedback_alert_button (_("feedback")) + , editor_meter(0) + , speaker_config_window (X_("speaker-config"), _("Speaker Configuration")) , theme_manager (X_("theme-manager"), _("Theme Manager")) , key_editor (X_("key-editor"), _("Key Bindings")) @@ -1033,6 +1035,9 @@ ARDOUR_UI::every_point_zero_something_seconds () // august 2007: actual update frequency: 25Hz (40ms), not 100Hz SuperRapidScreenUpdate(); /* EMIT_SIGNAL */ + if (editor_meter) { + editor_meter->update_meters(); + } return TRUE; } @@ -4114,3 +4119,29 @@ ARDOUR_UI::session_format_mismatch (std::string xml_path, std::string backup_pat msg.run (); } + + +void +ARDOUR_UI::reset_peak_display () +{ + if (!_session || !_session->master_out() || !editor_meter) return; + editor_meter->clear_meters(); +} + +void +ARDOUR_UI::reset_group_peak_display (RouteGroup* group) +{ + if (!_session || !_session->master_out()) return; + if (group == _session->master_out()->route_group()) { + reset_peak_display (); + } +} + +void +ARDOUR_UI::reset_route_peak_display (Route* route) +{ + if (!_session || !_session->master_out()) return; + if (_session->master_out().get() == route) { + reset_peak_display (); + } +} diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index 5817293b29..5feb18a2a1 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -104,6 +104,7 @@ class SpeakerDialog; class ThemeManager; class TimeInfoBox; class MidiTracer; +class LevelMeter; class GlobalPortMatrixWindow; class GUIObjectState; @@ -281,6 +282,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr void get_process_buffers (); void drop_process_buffers (); + void reset_peak_display (); + void reset_route_peak_display (ARDOUR::Route*); + void reset_group_peak_display (ARDOUR::RouteGroup*); + const std::string& announce_string() const { return _announce_string; } protected: @@ -444,6 +449,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr ArdourButton feedback_alert_button; Gtk::VBox alert_box; + Gtk::VBox meter_box; + LevelMeter * editor_meter; void solo_blink (bool); void sync_blink (bool); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 50affa6c96..d9ff245b67 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -417,6 +417,7 @@ ARDOUR_UI::setup_transport () transport_tearoff_hbox.pack_start (_editor_transport_box, false, false); } transport_tearoff_hbox.pack_start (alert_box, false, false); + transport_tearoff_hbox.pack_start (meter_box, false, false); if (Profile->get_sae()) { Image* img = manage (new Image ((::get_icon (X_("sae"))))); diff --git a/gtk2_ardour/ardour_ui_dialogs.cc b/gtk2_ardour/ardour_ui_dialogs.cc index 8c78d6494d..26cde95444 100644 --- a/gtk2_ardour/ardour_ui_dialogs.cc +++ b/gtk2_ardour/ardour_ui_dialogs.cc @@ -39,6 +39,7 @@ #include "keyeditor.h" #include "location_ui.h" #include "main_clock.h" +#include "meter_patterns.h" #include "midi_tracer.h" #include "mixer_ui.h" #include "public_editor.h" @@ -186,6 +187,26 @@ ARDOUR_UI::set_session (Session *s) point_zero_something_second_connection = Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds), 40); update_format (); + + if (editor_meter) { + meter_box.remove(*editor_meter); + delete editor_meter; + editor_meter = 0; + } + + if (_session && _session->master_out()) { + editor_meter = new LevelMeter(_session); + editor_meter->set_meter (_session->master_out()->shared_peak_meter().get()); + editor_meter->clear_meters(); + editor_meter->set_type (_session->master_out()->meter_type()); + editor_meter->setup_meters (30, 12, 6); + meter_box.pack_start(*editor_meter); + + ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display)); + ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display)); + ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display)); + } + } int @@ -225,6 +246,12 @@ ARDOUR_UI::unload_session (bool hide_stuff) point_one_second_connection.disconnect (); point_zero_something_second_connection.disconnect(); + if (editor_meter) { + meter_box.remove(*editor_meter); + delete editor_meter; + editor_meter = 0; + } + ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false); rec_button.set_sensitive (false); -- cgit v1.2.3 From e469ce0961196a3075c391b2256c84e6042c1e2a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 22:05:24 +0200 Subject: get meter color from gtkrc style file --- gtk2_ardour/meter_patterns.cc | 28 ++++++++++++++++++++------ gtk2_ardour/utils.cc | 47 +++++++++++++++++++++++++++++++++++++++++++ gtk2_ardour/utils.h | 2 ++ 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 4cd96f2433..0182cc3e89 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -200,10 +200,14 @@ static inline float mtr_col_and_fract( } static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { - // TODO use "meterstrip*" stype + float r,g,b; switch(type) { case MeterVU: - cairo_set_source_rgb (cr, 1.0, 1.0, 0.85); + if (rgba_p_from_style("meterstripVU", &r, &g, &b, "bg")) { + cairo_set_source_rgb (cr, r, g, b); + } else { + cairo_set_source_rgb (cr, 1.0, 1.0, 0.85); + } break; case MeterIEC1DIN: case MeterIEC1NOR: @@ -211,7 +215,11 @@ static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { case MeterIEC2EBU: case MeterK14: case MeterK20: - cairo_set_source_rgb (cr, 0.1, 0.1, 0.1); + if (rgba_p_from_style("meterstripPPM", &r, &g, &b, "bg")) { + cairo_set_source_rgb (cr, r, g, b); + } else { + cairo_set_source_rgb (cr, 0.1, 0.1, 0.1); + } break; default: { @@ -223,13 +231,21 @@ static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { } static void set_fg_color(Gtk::Widget& w, MeterType type, Gdk::Color * c) { - // TODO use "meterstrip*" stype + float r,g,b; switch(type) { case MeterVU: - c->set_rgb_p(0.0, 0.0, 0.0); + if (rgba_p_from_style("meterstripVU", &r, &g, &b)) { + c->set_rgb_p(r, g, b); + } else { + c->set_rgb_p(0.0, 0.0, 0.0); + } break; default: - c->set_rgb_p(1.0, 1.0, 1.0); + if (rgba_p_from_style("meterstripPPM", &r, &g, &b)) { + c->set_rgb_p(r, g, b); + } else { + c->set_rgb_p(1.0, 1.0, 1.0); + } break; } } diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index d4bc460269..72a922046f 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -301,6 +301,53 @@ rgba_from_style (string style, uint32_t r, uint32_t g, uint32_t b, uint32_t a, s } } +bool +rgba_p_from_style (string style, float *r, float *g, float *b, string attr, int state) +{ + static Gtk::Window* window = 0; + assert (r && g && b); + + if (window == 0) { + window = new Window (WINDOW_TOPLEVEL); + } + + Gtk::EventBox foo; + + window->add (foo); + + foo.set_name (style); + foo.ensure_style (); + + GtkRcStyle* rc = foo.get_style()->gobj()->rc_style; + + if (!rc) { + warning << string_compose (_("missing RGBA style for \"%1\""), style) << endl; + return false; + } + if (attr == "fg") { + *r = rc->fg[state].red / 65535.0; + *g = rc->fg[state].green / 65535.0; + *b = rc->fg[state].blue / 65535.0; + } else if (attr == "bg") { + *r = rc->bg[state].red / 65535.0; + *g = rc->bg[state].green / 65535.0; + *b = rc->bg[state].blue / 65535.0; + } else if (attr == "base") { + *r = rc->base[state].red / 65535.0; + *g = rc->base[state].green / 65535.0; + *b = rc->base[state].blue / 65535.0; + } else if (attr == "text") { + *r = rc->text[state].red / 65535.0; + *g = rc->text[state].green / 65535.0; + *b = rc->text[state].blue / 65535.0; + } else { + return false; + } + + window->remove (); + return true; +} + bool canvas_item_visible (ArdourCanvas::Item* item) { diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h index d3110104fb..5d7bf000ea 100644 --- a/gtk2_ardour/utils.h +++ b/gtk2_ardour/utils.h @@ -56,6 +56,8 @@ Pango::FontDescription get_font_for_style (std::string widgetname); uint32_t rgba_from_style (std::string, uint32_t, uint32_t, uint32_t, uint32_t, std::string = "fg", int = Gtk::STATE_NORMAL, bool = true); +bool rgba_p_from_style (std::string, float*, float*, float*, std::string = "fg", int = Gtk::STATE_NORMAL); + void decorate (Gtk::Window& w, Gdk::WMDecoration d); bool canvas_item_visible (ArdourCanvas::Item* item); -- cgit v1.2.3 From a9975f44a518dd978234d6e067943dbc84a4ac21 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 24 Jul 2013 22:29:46 +0200 Subject: reduce brightness of VU meter backplate & increase contrast of peak-label --- gtk2_ardour/ardour3_styles.rc.in | 2 +- gtk2_ardour/ardour3_ui_default.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in index 7a432f06dd..42f22c5059 100644 --- a/gtk2_ardour/ardour3_styles.rc.in +++ b/gtk2_ardour/ardour3_styles.rc.in @@ -1003,7 +1003,7 @@ style "meter_strip_ppm" = "default" style "meter_strip_vu" = "default" { - bg[NORMAL] = { 1.0, 1.0, 0.85 } + bg[NORMAL] = { .95, .88, .57 } fg[NORMAL] = { 0.0, 0.0, 0.0 } } diff --git a/gtk2_ardour/ardour3_ui_default.conf b/gtk2_ardour/ardour3_ui_default.conf index 372cab8a16..6331198dca 100644 --- a/gtk2_ardour/ardour3_ui_default.conf +++ b/gtk2_ardour/ardour3_ui_default.conf @@ -221,7 +221,7 @@