diff options
author | Robin Gareus <robin@gareus.org> | 2013-07-22 18:45:08 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2013-07-22 18:45:08 +0200 |
commit | 708edd586611c6b1132e4f25be4c2c0865ba4738 (patch) | |
tree | 501211154ef6f5cc06606874edfe3371f7049825 /gtk2_ardour/meter_patterns.cc | |
parent | 72aa1cd86cf04964f08e7ca0557f73afd1c96e83 (diff) |
implement new meter types
Diffstat (limited to 'gtk2_ardour/meter_patterns.cc')
-rw-r--r-- | gtk2_ardour/meter_patterns.cc | 639 |
1 files changed, 491 insertions, 148 deletions
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<void> ArdourMeter::ResetAllPeakDisplays; sigc::signal<void,ARDOUR::Route*> ArdourMeter::ResetRoutePeakDisplays; sigc::signal<void,ARDOUR::RouteGroup*> ArdourMeter::ResetGroupPeakDisplays; @@ -46,13 +48,28 @@ sigc::signal<void> ArdourMeter::RedrawMetrics; sigc::signal<void, int, ARDOUR::RouteGroup*, ARDOUR::MeterType> 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<std::string,cairo_pattern_t*> TickPatterns; - typedef std::map<std::string,cairo_pattern_t*> MetricPatterns; + typedef std::map<MeterMatricsMapKey, cairo_pattern_t*> 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<ARDOUR::DataType> types) +meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> types) { Glib::RefPtr<Gdk::Window> win (w.get_window()); @@ -131,45 +251,153 @@ meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types) switch (*i) { case DataType::AUDIO: - points.insert (std::pair<int,float>(-60, 0.5)); - points.insert (std::pair<int,float>(-50, 0.5)); - points.insert (std::pair<int,float>(-40, 0.5)); - points.insert (std::pair<int,float>(-30, 0.5)); - if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair<int,float>(-24, 0.5)); - } else { - points.insert (std::pair<int,float>(-25, 0.5)); - } - points.insert (std::pair<int,float>(-20, 1.0)); - - points.insert (std::pair<int,float>(-19, 0.5)); - points.insert (std::pair<int,float>(-18, 1.0)); - points.insert (std::pair<int,float>(-17, 0.5)); - points.insert (std::pair<int,float>(-16, 0.5)); - points.insert (std::pair<int,float>(-15, 1.0)); - - points.insert (std::pair<int,float>(-14, 0.5)); - points.insert (std::pair<int,float>(-13, 0.5)); - points.insert (std::pair<int,float>(-12, 0.5)); - points.insert (std::pair<int,float>(-11, 0.5)); - points.insert (std::pair<int,float>(-10, 1.0)); - - points.insert (std::pair<int,float>( -9, 0.5)); - points.insert (std::pair<int,float>( -8, 0.5)); - points.insert (std::pair<int,float>( -7, 0.5)); - points.insert (std::pair<int,float>( -6, 0.5)); - points.insert (std::pair<int,float>( -5, 1.0)); - points.insert (std::pair<int,float>( -4, 0.5)); - points.insert (std::pair<int,float>( -3, 0.5)); - points.insert (std::pair<int,float>( -2, 0.5)); - points.insert (std::pair<int,float>( -1, 0.5)); - points.insert (std::pair<int,float>( 0, 1.0)); - points.insert (std::pair<int,float>( 1, 0.5)); - points.insert (std::pair<int,float>( 2, 0.5)); - points.insert (std::pair<int,float>( 3, 0.5)); - points.insert (std::pair<int,float>( 4, 0.5)); - points.insert (std::pair<int,float>( 5, 0.5)); + switch (type) { + case MeterK14: + points.insert (std::pair<int,float>(-54.0f, 1.0)); + points.insert (std::pair<int,float>(-44.0f, 1.0)); + points.insert (std::pair<int,float>(-34.0f, 1.0)); + points.insert (std::pair<int,float>(-24.0f, 1.0)); + points.insert (std::pair<int,float>(-20.0f, 1.0)); + points.insert (std::pair<int,float>(-17.0f, 1.0)); + points.insert (std::pair<int,float>(-14.0f, 1.0)); + points.insert (std::pair<int,float>(-11.0f, 1.0)); + points.insert (std::pair<int,float>( -8.0f, 1.0)); + points.insert (std::pair<int,float>( -4.0f, 1.0)); + points.insert (std::pair<int,float>( 0.0f, 1.0)); + break; + case MeterK20: + points.insert (std::pair<int,float>(-60.0f, 1.0)); + points.insert (std::pair<int,float>(-50.0f, 1.0)); + points.insert (std::pair<int,float>(-40.0f, 1.0)); + points.insert (std::pair<int,float>(-30.0f, 1.0)); + points.insert (std::pair<int,float>(-26.0f, 1.0)); + points.insert (std::pair<int,float>(-23.0f, 1.0)); + points.insert (std::pair<int,float>(-20.0f, 1.0)); + points.insert (std::pair<int,float>(-17.0f, 1.0)); + points.insert (std::pair<int,float>(-14.0f, 1.0)); + points.insert (std::pair<int,float>(-10.0f, 1.0)); + points.insert (std::pair<int,float>( -5.0f, 1.0)); + points.insert (std::pair<int,float>( 0.0f, 1.0)); + break; + case MeterIEC2EBU: + points.insert (std::pair<float,float>(-30.0f, 1.0)); + points.insert (std::pair<float,float>(-28.0f, 0.5)); + points.insert (std::pair<float,float>(-26.0f, 1.0)); + points.insert (std::pair<float,float>(-24.0f, 0.5)); + points.insert (std::pair<float,float>(-22.0f, 1.0)); + points.insert (std::pair<float,float>(-20.0f, 0.5)); + points.insert (std::pair<float,float>(-18.0f, 1.0)); + points.insert (std::pair<float,float>(-16.0f, 0.5)); + points.insert (std::pair<float,float>(-14.0f, 1.0)); + points.insert (std::pair<float,float>(-12.0f, 0.5)); + points.insert (std::pair<float,float>(-10.0f, 1.0)); + points.insert (std::pair<float,float>( -9.0f, 0.5)); + points.insert (std::pair<float,float>( -8.0f, 0.5)); + points.insert (std::pair<float,float>( -6.0f, 1.0)); + break; + case MeterIEC2BBC: + points.insert (std::pair<float,float>(-30.0f, 1.0)); + points.insert (std::pair<float,float>(-26.0f, 1.0)); + points.insert (std::pair<float,float>(-22.0f, 1.0)); + points.insert (std::pair<float,float>(-18.0f, 1.0)); + points.insert (std::pair<float,float>(-14.0f, 1.0)); + points.insert (std::pair<float,float>(-10.0f, 1.0)); + points.insert (std::pair<float,float>( -6.0f, 1.0)); + break; + case MeterIEC1NOR: + points.insert (std::pair<float,float>(-60.0f, 1.0)); // -42 + points.insert (std::pair<float,float>(-57.0f, 0.5)); + points.insert (std::pair<float,float>(-54.0f, 1.0)); + points.insert (std::pair<float,float>(-51.0f, 0.5)); + points.insert (std::pair<float,float>(-48.0f, 1.0)); + points.insert (std::pair<float,float>(-45.0f, 0.5)); + points.insert (std::pair<float,float>(-42.0f, 1.0)); + points.insert (std::pair<float,float>(-39.0f, 0.5)); + points.insert (std::pair<float,float>(-36.0f, 1.0)); + + points.insert (std::pair<float,float>(-33.0f, 1.0)); + points.insert (std::pair<float,float>(-30.0f, 1.0)); + points.insert (std::pair<float,float>(-27.0f, 1.0)); + points.insert (std::pair<float,float>(-24.0f, 1.0)); + points.insert (std::pair<float,float>(-21.0f, 1.0)); + + points.insert (std::pair<float,float>(-18.0f, 1.0)); + points.insert (std::pair<float,float>(-15.0f, 1.0)); + points.insert (std::pair<float,float>(-12.0f, 1.0)); + points.insert (std::pair<float,float>( -9.0f, 1.0)); + points.insert (std::pair<float,float>( -6.0f, 1.0)); + break; + case MeterIEC1DIN: + points.insert (std::pair<float,float>( -3.0f, 0.5)); // "200%" + points.insert (std::pair<float,float>( -4.0f, 1.0)); // "100%" + points.insert (std::pair<float,float>( -9.0f, 1.0)); + points.insert (std::pair<float,float>(-14.0f, 1.0)); + points.insert (std::pair<float,float>(-15.0f, 0.5)); // "50%" + points.insert (std::pair<float,float>(-18.0f, 0.5)); // "-9" + points.insert (std::pair<float,float>(-19.0f, 1.0)); // "30%" + points.insert (std::pair<float,float>(-29.0f, 1.0)); // "10%" + points.insert (std::pair<float,float>(-35.0f, 0.5)); // "5%" " -20" + points.insert (std::pair<float,float>(-39.0f, 1.0)); // "3%" + points.insert (std::pair<float,float>(-49.0f, 0.5)); // "1%" + points.insert (std::pair<float,float>(-59.0f, 1.0)); + break; + case MeterVU: + points.insert (std::pair<float,float>(-17.0f, 1.0)); + points.insert (std::pair<float,float>(-18.0f, 1.0)); + points.insert (std::pair<float,float>(-19.0f, 1.0)); + points.insert (std::pair<float,float>(-20.0f, 1.0)); + points.insert (std::pair<float,float>(-21.0f, 1.0)); + points.insert (std::pair<float,float>(-22.0f, 1.0)); + points.insert (std::pair<float,float>(-23.0f, 1.0)); + points.insert (std::pair<float,float>(-25.0f, 1.0)); + points.insert (std::pair<float,float>(-27.0f, 1.0)); + points.insert (std::pair<float,float>(-30.0f, 1.0)); + points.insert (std::pair<float,float>(-40.0f, 1.0)); + break; + + default: + points.insert (std::pair<int,float>(-60, 0.5)); + points.insert (std::pair<int,float>(-50, 1.0)); + points.insert (std::pair<int,float>(-40, 1.0)); + points.insert (std::pair<int,float>(-30, 1.0)); + if (Config->get_meter_line_up_level() == MeteringLineUp24) { + points.insert (std::pair<int,float>(-24, 1.0)); + } else { + points.insert (std::pair<int,float>(-25, 1.0)); + } + points.insert (std::pair<int,float>(-20, 1.0)); + + points.insert (std::pair<int,float>(-19, 0.5)); + points.insert (std::pair<int,float>(-18, 1.0)); + points.insert (std::pair<int,float>(-17, 0.5)); + points.insert (std::pair<int,float>(-16, 0.5)); + points.insert (std::pair<int,float>(-15, 1.0)); + + points.insert (std::pair<int,float>(-14, 0.5)); + points.insert (std::pair<int,float>(-13, 0.5)); + points.insert (std::pair<int,float>(-12, 0.5)); + points.insert (std::pair<int,float>(-11, 0.5)); + points.insert (std::pair<int,float>(-10, 1.0)); + + points.insert (std::pair<int,float>( -9, 1.0)); + points.insert (std::pair<int,float>( -8, 0.5)); + points.insert (std::pair<int,float>( -7, 0.5)); + points.insert (std::pair<int,float>( -6, 0.5)); + points.insert (std::pair<int,float>( -5, 1.0)); + points.insert (std::pair<int,float>( -4, 0.5)); + points.insert (std::pair<int,float>( -3, 1.0)); + points.insert (std::pair<int,float>( -2, 0.5)); + points.insert (std::pair<int,float>( -1, 0.5)); + + points.insert (std::pair<int,float>( 0, 1.0)); + points.insert (std::pair<int,float>( 1, 0.5)); + points.insert (std::pair<int,float>( 2, 0.5)); + points.insert (std::pair<int,float>( 3, 1.0)); + points.insert (std::pair<int,float>( 4, 0.5)); + points.insert (std::pair<int,float>( 5, 0.5)); + break; + } break; case DataType::MIDI: @@ -194,16 +422,10 @@ meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> 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<ARDOUR::DataType> types) return pattern; } - static cairo_pattern_t* -meter_render_metrics (Gtk::Widget& w, vector<DataType> types) +meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types) { Glib::RefPtr<Gdk::Window> win (w.get_window()); @@ -286,16 +507,16 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> 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<DataType>::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<DataType> types) cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } - std::map<int,float> points; + + std::map<float,string> points; switch (*i) { case DataType::AUDIO: layout->set_attributes (audio_font_attributes); - points.insert (std::pair<int,float>(-50, 0.5)); - points.insert (std::pair<int,float>(-40, 0.5)); - points.insert (std::pair<int,float>(-30, 0.5)); - points.insert (std::pair<int,float>(-20, 1.0)); - if (types.size() == 1) { - if (Config->get_meter_line_up_level() == MeteringLineUp24) { - points.insert (std::pair<int,float>(-24, 0.5)); - } else { - points.insert (std::pair<int,float>(-25, 0.5)); - } - points.insert (std::pair<int,float>(-15, 1.0)); + switch (type) { + case MeterK14: + points.insert (std::pair<int,string>(-54.0f, "-40")); + points.insert (std::pair<int,string>(-44.0f, "-30")); + points.insert (std::pair<int,string>(-34.0f, "-20")); + points.insert (std::pair<int,string>(-24.0f, "-10")); + points.insert (std::pair<int,string>(-20.0f, "-6")); + points.insert (std::pair<int,string>(-17.0f, "-3")); + points.insert (std::pair<int,string>(-14.0f, "0")); + points.insert (std::pair<int,string>(-11.0f, "+3")); + points.insert (std::pair<int,string>( -8.0f, "+6")); + points.insert (std::pair<int,string>( -4.0f, "+10")); + points.insert (std::pair<int,string>( 0.0f, "+14")); + break; + case MeterK20: + points.insert (std::pair<int,string>(-60.0f, "-40")); + points.insert (std::pair<int,string>(-50.0f, "-30")); + points.insert (std::pair<int,string>(-40.0f, "-20")); + points.insert (std::pair<int,string>(-30.0f, "-10")); + points.insert (std::pair<int,string>(-26.0f, "-6")); + points.insert (std::pair<int,string>(-23.0f, "-3")); + points.insert (std::pair<int,string>(-20.0f, "0")); + points.insert (std::pair<int,string>(-17.0f, "+3")); + points.insert (std::pair<int,string>(-14.0f, "+6")); + points.insert (std::pair<int,string>(-10.0f, "+10")); + points.insert (std::pair<int,string>( -5.0f, "+15")); + points.insert (std::pair<int,string>( 0.0f, "+20")); + break; + default: + case MeterPeak: + case MeterRMS: + points.insert (std::pair<int,string>(-50.0f, "-50")); + points.insert (std::pair<int,string>(-40.0f, "-40")); + points.insert (std::pair<int,string>(-30.0f, "-30")); + points.insert (std::pair<int,string>(-20.0f, "-20")); + if (types.size() == 1) { + if (Config->get_meter_line_up_level() == MeteringLineUp24) { + points.insert (std::pair<int,string>(-24.0f, "-24")); + } else { + points.insert (std::pair<int,string>(-25.0f, "-25")); + } + points.insert (std::pair<int,string>(-15.0f, "-15")); + } + points.insert (std::pair<int,string>(-18.0f, "-18")); + points.insert (std::pair<int,string>(-10.0f, "-10")); + points.insert (std::pair<int,string>( -5.0f, "-5")); + points.insert (std::pair<int,string>( -3.0f, "-3")); + points.insert (std::pair<int,string>( 0.0f, "+0")); + points.insert (std::pair<int,string>( 3.0f, "+3")); + break; + + case MeterIEC2EBU: + points.insert (std::pair<float,string>(-30.0f, "-12")); + points.insert (std::pair<float,string>(-26.0f, "-8")); + points.insert (std::pair<float,string>(-22.0f, "-4")); + points.insert (std::pair<float,string>(-18.0f, "TST")); + points.insert (std::pair<float,string>(-14.0f, "+4")); + points.insert (std::pair<float,string>(-10.0f, "+8")); + points.insert (std::pair<float,string>( -6.0f, "+12")); + break; + + case MeterIEC2BBC: + points.insert (std::pair<float,string>(-30.0f, "1")); + points.insert (std::pair<float,string>(-26.0f, "2")); + points.insert (std::pair<float,string>(-22.0f, "3")); + points.insert (std::pair<float,string>(-18.0f, "4")); + points.insert (std::pair<float,string>(-14.0f, "5")); + points.insert (std::pair<float,string>(-10.0f, "6")); + points.insert (std::pair<float,string>( -6.0f, "7")); + break; + + case MeterIEC1NOR: + //points.insert (std::pair<float,string>(-60.0f, "-42")); + points.insert (std::pair<float,string>(-54.0f, "-36")); + points.insert (std::pair<float,string>(-48.0f, "-30")); + points.insert (std::pair<float,string>(-42.0f, "-24")); + points.insert (std::pair<float,string>(-36.0f, "-18")); + + points.insert (std::pair<float,string>(-33.0f, "-15")); + points.insert (std::pair<float,string>(-30.0f, "-12")); + points.insert (std::pair<float,string>(-27.0f, "-9")); + points.insert (std::pair<float,string>(-24.0f, "-6")); + points.insert (std::pair<float,string>(-21.0f, "-3")); + + points.insert (std::pair<float,string>(-18.0f, "TST")); + points.insert (std::pair<float,string>(-15.0f, "+3")); + points.insert (std::pair<float,string>(-12.0f, "+6")); + points.insert (std::pair<float,string>( -9.0f, "+9")); + points.insert (std::pair<float,string>( -6.0f, "+12")); + break; + + case MeterIEC1DIN: + //points.insert (std::pair<float,string>( -3.0f, "200%")); + points.insert (std::pair<float,string>( -4.0f, "+5")); // "100%" + points.insert (std::pair<float,string>( -9.0f, "0")); + points.insert (std::pair<float,string>(-14.0f, "-5")); + //points.insert (std::pair<float,string>(-15.0f, "50%")); + //points.insert (std::pair<float,string>(-18.0f, "-9")); + points.insert (std::pair<float,string>(-19.0f, "-10")); // "30%" + points.insert (std::pair<float,string>(-29.0f, "-20")); // "10%" + //points.insert (std::pair<float,string>(-35.0f, "-20")); // "5%" + points.insert (std::pair<float,string>(-39.0f, "-30")); // "3%" + //points.insert (std::pair<float,string>(-49.0f, "1%")); + points.insert (std::pair<float,string>(-59.0f, "-50")); + break; + + case MeterVU: + points.insert (std::pair<float,string>(-17.0f, "+3")); + points.insert (std::pair<float,string>(-18.0f, "+2")); + points.insert (std::pair<float,string>(-19.0f, "+1")); + points.insert (std::pair<float,string>(-20.0f, "0")); + points.insert (std::pair<float,string>(-21.0f, "-1")); + points.insert (std::pair<float,string>(-22.0f, "-2")); + points.insert (std::pair<float,string>(-23.0f, "-3")); + points.insert (std::pair<float,string>(-25.0f, "-5")); + points.insert (std::pair<float,string>(-27.0f, "-7")); + points.insert (std::pair<float,string>(-30.0f, "-10")); + points.insert (std::pair<float,string>(-40.0f, "-20")); + break; } - points.insert (std::pair<int,float>(-18, 1.0)); - points.insert (std::pair<int,float>(-10, 1.0)); - points.insert (std::pair<int,float>( -5, 1.0)); - points.insert (std::pair<int,float>( -3, 0.5)); - points.insert (std::pair<int,float>( 0, 1.0)); - points.insert (std::pair<int,float>( 3, 0.5)); break; - case DataType::MIDI: layout->set_attributes (midi_font_attributes); - points.insert (std::pair<int,float>( 0, 1.0)); + points.insert (std::pair<int,string>( 0, "0")); if (types.size() == 1) { - points.insert (std::pair<int,float>( 16, 0.5)); - points.insert (std::pair<int,float>( 32, 0.5)); - points.insert (std::pair<int,float>( 48, 0.5)); - points.insert (std::pair<int,float>( 64, 1.0)); - points.insert (std::pair<int,float>( 80, 0.5)); - points.insert (std::pair<int,float>( 96, 0.5)); - points.insert (std::pair<int,float>(100, 0.5)); - points.insert (std::pair<int,float>(112, 0.5)); + points.insert (std::pair<int,string>( 16, "16")); + points.insert (std::pair<int,string>( 32, "32")); + points.insert (std::pair<int,string>( 48, "48")); + points.insert (std::pair<int,string>( 64, "64")); + points.insert (std::pair<int,string>( 80, "80")); + points.insert (std::pair<int,string>( 96, "96")); + points.insert (std::pair<int,string>(100, "100")); + points.insert (std::pair<int,string>(112, "112")); } else { /* labels that don't overlay with dB */ - points.insert (std::pair<int,float>( 24, 0.5)); - points.insert (std::pair<int,float>( 48, 0.5)); - points.insert (std::pair<int,float>( 72, 0.5)); + points.insert (std::pair<int,string>( 24, "24")); + points.insert (std::pair<int,string>( 48, "48")); + points.insert (std::pair<int,string>( 72, "74")); } - points.insert (std::pair<int,float>(127, 1.0)); + points.insert (std::pair<int,string>(127, "127")); break; } - char buf[32]; gint pos; - for (std::map<int,float>::const_iterator j = points.begin(); j != points.end(); ++j) { - + for (std::map<float,string>::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<DataType> 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<DataType> types) return pattern; } - gint -ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta) +ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, MeterType type, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta) { Glib::RefPtr<Gdk::Window> win (mta->get_window()); cairo_t* cr; @@ -460,11 +799,12 @@ ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataTyp cairo_clip (cr); cairo_pattern_t* pattern; - TickPatterns::iterator i = ticks_patterns.find (mta->get_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<ARDOUR::DataTyp } gint -ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma) +ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, MeterType type, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma) { Glib::RefPtr<Gdk::Window> win (mma->get_window()); cairo_t* cr; @@ -497,11 +837,12 @@ ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataT cairo_clip (cr); cairo_pattern_t* pattern; - MetricPatterns::iterator i = metric_patterns.find (mma->get_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::vector<ARDOUR::DataT void ArdourMeter::meter_clear_pattern_cache(int which) { - MetricPatterns::iterator i = metric_patterns.begin(); - TickPatterns::iterator j = ticks_patterns.begin(); + MetricPatternMap::iterator i = metric_patterns.begin(); + MetricPatternMap::iterator j = ticks_patterns.begin(); while (i != metric_patterns.end()) { int m = 4; - std::string n = i->first; + 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) { |