From 517211681ef288b6c31c5f6c3a66eef52772926b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 25 Apr 2015 06:46:56 +0200 Subject: [PATCH] 0dBFS peak meter GUI --- gtk2_ardour/level_meter.cc | 21 ++++++++++++++++ gtk2_ardour/logmeter.h | 25 +++++++++++++++++++ gtk2_ardour/meter_patterns.cc | 46 +++++++++++++++++++++++++++++------ gtk2_ardour/meter_strip.cc | 1 + gtk2_ardour/mixer_strip.cc | 1 + 5 files changed, 86 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/level_meter.cc b/gtk2_ardour/level_meter.cc index 62556c801a..7bb61a7cbc 100644 --- a/gtk2_ardour/level_meter.cc +++ b/gtk2_ardour/level_meter.cc @@ -150,6 +150,8 @@ LevelMeterBase::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 == MeterPeak0dB) { + (*i).meter->set (log_meter0dB (peak)); } else if (meter_type == MeterIEC1NOR) { (*i).meter->set (meter_deflect_nordic (peak + meter_lineup(0))); } else if (meter_type == MeterIEC1DIN) { @@ -374,6 +376,25 @@ LevelMeterBase::setup_meters (int len, int initial_width, int thin_width) c[0] = c[2] = c[3] = c[4] = c[5] = c[1]; c[7] = c[8] = c[9] = c[6]; break; + case MeterPeak0dB: + stp[1] = 115.0 * log_meter0dB(-10); + stp[2] = 115.0 * log_meter0dB(-3); + stp[3] = 115.0 * log_meter0dB(0); + switch (ARDOUR_UI::config()->get_meter_line_up_level()) { + case MeteringLineUp24: + stp[0] = 115.0 * log_meter0dB(-24); + break; + case MeteringLineUp20: + stp[0] = 115.0 * log_meter0dB(-20); + break; + default: + case MeteringLineUp18: + stp[0] = 115.0 * log_meter0dB(-18); + break; + case MeteringLineUp15: + stp[0] = 115.0 * log_meter0dB(-15); + } + break; default: // PEAK, RMS stp[1] = 77.5; // 115 * log_meter(-10) stp[2] = 92.5; // 115 * log_meter(-3) diff --git a/gtk2_ardour/logmeter.h b/gtk2_ardour/logmeter.h index a244fb4bbe..ff0520a63b 100644 --- a/gtk2_ardour/logmeter.h +++ b/gtk2_ardour/logmeter.h @@ -75,6 +75,31 @@ log_meter (float db) return def/115.0f; } +static inline float +log_meter0dB (float db) +{ + gfloat def = 0.0f; /* Meter deflection %age */ + + if (db < -70.0f) { + def = 0.0f; + } else if (db < -60.0f) { + def = (db + 70.0f) * 0.25f; + } else if (db < -50.0f) { + def = (db + 60.0f) * 0.5f + 2.5f; + } else if (db < -40.0f) { + def = (db + 50.0f) * 0.75f + 7.5f; + } else if (db < -30.0f) { + def = (db + 40.0f) * 1.5f + 15.0f; + } else if (db < -20.0f) { + def = (db + 30.0f) * 2.0f + 30.0f; + } else if (db < 0.0f) { + def = (db + 20.0f) * 2.5f + 50.0f; + } else { + def = 100.0f; + } + return def/100.0f; +} + static inline float meter_deflect_ppm (float db) { diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index b7c82b4818..de95915c36 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -81,6 +81,9 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterPeak: return _("Peak"); break; + case MeterPeak0dB: + return _("Peak 0dB"); + break; case MeterKrms: return _("RMS + Peak"); break; @@ -109,6 +112,7 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) return _("VU"); break; default: + assert(0); return _("???"); break; } @@ -141,6 +145,17 @@ static inline float mtr_col_and_fract( cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p()); } break; + case MeterPeak0dB: + fraction = log_meter0dB (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); @@ -491,6 +506,14 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ break; default: + 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)); + // no break + case MeterPeak0dB: points.insert (std::pair(-60, 0.5)); points.insert (std::pair(-50, 1.0)); points.insert (std::pair(-40, 1.0)); @@ -523,13 +546,6 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ 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; @@ -678,6 +694,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) switch (*i) { case DataType::AUDIO: layout->set_attributes (audio_font_attributes); + if (type == MeterPeak0dB) { + overlay_midi = 4; + } switch (type) { case MeterK12: overlay_midi = 0; @@ -725,6 +744,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) default: case MeterPeak: case MeterKrms: + points.insert (std::pair( 3.0f, "+3")); + // no break + case MeterPeak0dB: points.insert (std::pair(-50.0f, "-50")); points.insert (std::pair(-40.0f, "-40")); points.insert (std::pair(-30.0f, "-30")); @@ -742,7 +764,6 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) 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: @@ -832,6 +853,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) points.insert (std::pair( 96, "96")); points.insert (std::pair(100, "100")); points.insert (std::pair(112, "112")); + points.insert (std::pair(127, "127")); } else { switch (overlay_midi) { case 1: @@ -859,6 +881,13 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) points.insert (std::pair( 72, "72")); points.insert (std::pair(112, "112")); points.insert (std::pair(127, "127")); + case 4: + /* labels that don't overlay with 0dBFS*/ + points.insert (std::pair( 0, "0")); + points.insert (std::pair( 16, "16")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 84, "84")); + points.insert (std::pair(100, "100")); default: break; } @@ -947,6 +976,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; default: case MeterPeak: + case MeterPeak0dB: case MeterKrms: layout->set_text("dBFS"); break; diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc index c325673c55..f469aed600 100644 --- a/gtk2_ardour/meter_strip.cc +++ b/gtk2_ardour/meter_strip.cc @@ -842,6 +842,7 @@ MeterStrip::popup_level_meter_menu (GdkEventButton* ev) _suspend_menu_callbacks = true; add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak), MeterPeak); + add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterPeak0dB), MeterPeak0dB); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterKrms), MeterKrms); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1DIN), MeterIEC1DIN); add_level_meter_type_item (items, group, ArdourMeter::meter_type_string(MeterIEC1NOR), MeterIEC1NOR); diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index b3c69dd11c..c55bd19214 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -2304,6 +2304,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(MeterPeak0dB), MeterPeak0dB); 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);