From 0acafa4d3dbcd1fc198cc2dee0cd0b3bc8ed191f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 22 Dec 2013 09:25:33 +0100 Subject: [PATCH] add K12/RMS meter type --- gtk2_ardour/level_meter.cc | 13 ++++++++++ gtk2_ardour/meter_patterns.cc | 45 +++++++++++++++++++++++++++++++++++ gtk2_ardour/meter_strip.cc | 2 ++ gtk2_ardour/mixer_strip.cc | 1 + libs/ardour/ardour/types.h | 3 ++- libs/ardour/enums.cc | 1 + libs/ardour/meter.cc | 7 +++--- 7 files changed, 68 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index bf9823518b..493a08baea 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -157,6 +157,8 @@ LevelMeterBase::update_meters () (*i).meter->set (meter_deflect_ppm (peak + meter_lineup(0))); } else if (meter_type == MeterVU) { (*i).meter->set (meter_deflect_vu (peak + vu_standard() + meter_lineup(0))); + } else if (meter_type == MeterK12) { + (*i).meter->set (meter_deflect_k (peak, 12), meter_deflect_k(_meter->meter_level(n, MeterPeak), 12)); } 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) { @@ -320,6 +322,17 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width) c[6] = c[7] = 0xffff00ff; c[8] = c[9] = 0xff0000ff; break; + case MeterK12: + stp[0] = 115.0 * meter_deflect_k(-32, 12); //-20 + stp[1] = 115.0 * meter_deflect_k(-12, 12); // 0 + stp[2] = 115.0 * meter_deflect_k(-10, 12); // +2 + stp[3] = 115.0 * meter_deflect_k( -8, 12); // +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 MeterIEC2BBC: c[0] = c[1] = c[2] = c[3] = c[4] = c[5] = c[6] = c[7] = c[8] = c[9] = ARDOUR_UI::config()->color_by_name ("meter color BBC"); diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index f392dc0872..7db2924697 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -101,6 +101,9 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterK14: return _("K14"); break; + case MeterK12: + return _("K12"); + break; case MeterVU: return _("VU"); break; @@ -199,6 +202,16 @@ static inline float mtr_col_and_fract( } fraction = meter_deflect_k (val, 14); break; + case MeterK12: + if (val >= -8.0) { + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red + } else if (val >= -12.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, 12); + break; } return fraction; } @@ -226,6 +239,7 @@ static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { case MeterIEC1NOR: case MeterIEC2BBC: case MeterIEC2EBU: + case MeterK12: case MeterK14: case MeterK20: if (rgba_p_from_style("meterstripPPM", &r, &g, &b, "bg")) { @@ -334,6 +348,20 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ case DataType::AUDIO: switch (type) { + case MeterK12: + points.insert (std::pair(-52.0f, 1.0)); + points.insert (std::pair(-42.0f, 1.0)); + points.insert (std::pair(-32.0f, 1.0)); + points.insert (std::pair(-22.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( -8.0f, 0.8)); + points.insert (std::pair( -6.0f, 1.0)); + points.insert (std::pair( -3.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); + break; case MeterK14: points.insert (std::pair(-54.0f, 1.0)); points.insert (std::pair(-44.0f, 1.0)); @@ -645,6 +673,20 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) case DataType::AUDIO: layout->set_attributes (audio_font_attributes); switch (type) { + case MeterK12: + overlay_midi = 0; + points.insert (std::pair(-52.0f, "-40")); + points.insert (std::pair(-42.0f, "-30")); + points.insert (std::pair(-32.0f, "-20")); + points.insert (std::pair(-22.0f, "-10")); + points.insert (std::pair(-18.0f, "-6")); + points.insert (std::pair(-15.0f, "-3")); + points.insert (std::pair(-12.0f, " 0")); + points.insert (std::pair( -9.0f, "+3")); + points.insert (std::pair( -6.0f, "+6")); + points.insert (std::pair( -3.0f, "+9")); + points.insert (std::pair( 0.0f, "+12")); + break; case MeterK14: overlay_midi = 0; points.insert (std::pair(-54.0f, "-40")); @@ -903,6 +945,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) case MeterK14: layout->set_text("K14"); break; + case MeterK12: + layout->set_text("K12"); + break; default: case MeterPeak: case MeterKrms: diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index 886374c61a..632c6ef82c 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -562,6 +562,7 @@ MeterStrip::update_background(MeterType type) case MeterIEC1NOR: case MeterIEC2BBC: case MeterIEC2EBU: + case MeterK12: case MeterK14: case MeterK20: mtr_container.set_name ("meterstripPPM"); @@ -747,6 +748,7 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC2EBU), MeterIEC2EBU); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK20), MeterK20); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK14), MeterK14); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterK12), MeterK12); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterVU), MeterVU); MeterType cmt = _route->meter_type(); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 50594378de..aa49e20d0c 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2141,6 +2141,7 @@ MixerStrip::popup_level_meter_menu (GdkEventButton* ev) 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(MeterK12), MeterK12); add_level_meter_item_type (items, tgroup, ArdourMeter::meter_type_string(MeterVU), MeterVU); int _strip_type; diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 91b8888f52..50a96030b1 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -187,7 +187,8 @@ namespace ARDOUR { MeterIEC1NOR = 0x080, MeterIEC2BBC = 0x100, MeterIEC2EBU = 0x200, - MeterVU = 0x400 + MeterVU = 0x400, + MeterK12 = 0x800 }; enum TrackMode { diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 72125f8772..e32fe329af 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -179,6 +179,7 @@ setup_enum_writer () REGISTER_ENUM (MeterKrms); REGISTER_ENUM (MeterK20); REGISTER_ENUM (MeterK14); + REGISTER_ENUM (MeterK12); REGISTER_ENUM (MeterIEC1DIN); REGISTER_ENUM (MeterIEC1NOR); REGISTER_ENUM (MeterIEC2BBC); diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index a7857f5859..5310fd747b 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -108,7 +108,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 & (MeterKrms | MeterK20 | MeterK14)) { + if (_meter_type & (MeterKrms | MeterK20 | MeterK14 | MeterK12)) { _kmeter[i]->process(bufs.get_audio(i).data(), nframes); } if (_meter_type & (MeterIEC1DIN | MeterIEC1NOR)) { @@ -288,7 +288,7 @@ PeakMeter::meter () /* 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; + const float audio_meter_falloff = (_meter_type & (MeterK20 | MeterK14 | MeterK12)) ? 0.12f : midi_meter_falloff; for (size_t n = 0; n < limit; ++n) { @@ -345,6 +345,7 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { case MeterKrms: case MeterK20: case MeterK14: + case MeterK12: { const uint32_t n_midi = current_meters.n_midi(); if (CHECKSIZE(_kmeter)) { @@ -404,7 +405,7 @@ PeakMeter::set_type(MeterType t) _meter_type = t; - if (t & (MeterKrms | MeterK20 | MeterK14)) { + if (t & (MeterKrms | MeterK20 | MeterK14 | MeterK12)) { const size_t n_audio = current_meters.n_audio(); for (size_t n = 0; n < n_audio; ++n) { _kmeter[n]->reset();