0dBFS peak meter GUI
authorRobin Gareus <robin@gareus.org>
Sat, 25 Apr 2015 04:46:56 +0000 (06:46 +0200)
committerRobin Gareus <robin@gareus.org>
Sat, 25 Apr 2015 04:46:56 +0000 (06:46 +0200)
gtk2_ardour/level_meter.cc
gtk2_ardour/logmeter.h
gtk2_ardour/meter_patterns.cc
gtk2_ardour/meter_strip.cc
gtk2_ardour/mixer_strip.cc

index 62556c801a776dc72cd5309b2cab8f6311251a38..7bb61a7cbc33af9517a3d1bdae17b265610dce44 100644 (file)
@@ -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)
index a244fb4bbeab2a73be15cc603182e64505ea3f9f..ff0520a63b64bc05a392446ecc3670a878e6ead3 100644 (file)
@@ -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)
 {
index b7c82b48184918367f752c8c32f7f4d9cd486c82..de95915c36a9a47dfbf0bb3774175b71a2ee23cd 100644 (file)
@@ -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<ARDOUR::DataType> typ
                                        break;
 
                                default:
+                                       points.insert (std::pair<float,float>(  0, 1.0));
+                                       points.insert (std::pair<float,float>(  1, 0.5));
+                                       points.insert (std::pair<float,float>(  2, 0.5));
+                                       points.insert (std::pair<float,float>(  3, 1.0));
+                                       points.insert (std::pair<float,float>(  4, 0.5));
+                                       points.insert (std::pair<float,float>(  5, 0.5));
+                                       // no break
+                               case MeterPeak0dB:
                                        points.insert (std::pair<float,float>(-60, 0.5));
                                        points.insert (std::pair<float,float>(-50, 1.0));
                                        points.insert (std::pair<float,float>(-40, 1.0));
@@ -523,13 +546,6 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
                                        points.insert (std::pair<float,float>( -3, 1.0));
                                        points.insert (std::pair<float,float>( -2, 0.5));
                                        points.insert (std::pair<float,float>( -1, 0.5));
-
-                                       points.insert (std::pair<float,float>(  0, 1.0));
-                                       points.insert (std::pair<float,float>(  1, 0.5));
-                                       points.insert (std::pair<float,float>(  2, 0.5));
-                                       points.insert (std::pair<float,float>(  3, 1.0));
-                                       points.insert (std::pair<float,float>(  4, 0.5));
-                                       points.insert (std::pair<float,float>(  5, 0.5));
                                        break;
                        }
                        break;
@@ -678,6 +694,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> 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<DataType> types)
                                default:
                                case MeterPeak:
                                case MeterKrms:
+                                       points.insert (std::pair<float,string>(  3.0f, "+3"));
+                                       // no break
+                               case MeterPeak0dB:
                                        points.insert (std::pair<float,string>(-50.0f, "-50"));
                                        points.insert (std::pair<float,string>(-40.0f, "-40"));
                                        points.insert (std::pair<float,string>(-30.0f, "-30"));
@@ -742,7 +764,6 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                        points.insert (std::pair<float,string>( -5.0f, "-5"));
                                        points.insert (std::pair<float,string>( -3.0f, "-3"));
                                        points.insert (std::pair<float,string>(  0.0f, "+0"));
-                                       points.insert (std::pair<float,string>(  3.0f, "+3"));
                                        break;
 
                                case MeterIEC2EBU:
@@ -832,6 +853,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                points.insert (std::pair<float,string>( 96,  "96"));
                                points.insert (std::pair<float,string>(100, "100"));
                                points.insert (std::pair<float,string>(112, "112"));
+                               points.insert (std::pair<float,string>(127, "127"));
                        } else {
                                switch (overlay_midi) {
                                        case 1:
@@ -859,6 +881,13 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                                points.insert (std::pair<float,string>( 72, "72"));
                                                points.insert (std::pair<float,string>(112, "112"));
                                                points.insert (std::pair<float,string>(127, "127"));
+                                       case 4:
+                                               /* labels that don't overlay with 0dBFS*/
+                                               points.insert (std::pair<float,string>(  0, "0"));
+                                               points.insert (std::pair<float,string>( 16, "16"));
+                                               points.insert (std::pair<float,string>( 48, "48"));
+                                               points.insert (std::pair<float,string>( 84, "84"));
+                                               points.insert (std::pair<float,string>(100, "100"));
                                        default:
                                                break;
                                }
@@ -947,6 +976,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                                break;
                                        default:
                                        case MeterPeak:
+                                       case MeterPeak0dB:
                                        case MeterKrms:
                                                layout->set_text("dBFS");
                                                break;
index c325673c5581303ead7048216e279b5b00c8dd40..f469aed600b953ed912068b705e856418c47e0f1 100644 (file)
@@ -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);
index b3c69dd11c54fabf2cb63e8efc0261f551b435ca..c55bd1921407305e3ee471556f8736b67e80daab 100644 (file)
@@ -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);