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)
This commit is contained in:
parent
06e7ad67ae
commit
8013160eb3
|
@ -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<ARDOUR::DataType> types)
|
||||
{
|
||||
|
@ -247,38 +245,39 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
|
|||
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
|
||||
}
|
||||
|
||||
std::map<int,float> points;
|
||||
// tick-maker position in dBFS, line-thickness
|
||||
std::map<float,float> points;
|
||||
|
||||
switch (*i) {
|
||||
case DataType::AUDIO:
|
||||
|
||||
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));
|
||||
points.insert (std::pair<float,float>(-54.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-44.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-34.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-24.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-20.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-17.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-14.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-11.0f, 1.0));
|
||||
points.insert (std::pair<float,float>( -8.0f, 1.0));
|
||||
points.insert (std::pair<float,float>( -4.0f, 1.0));
|
||||
points.insert (std::pair<float,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));
|
||||
points.insert (std::pair<float,float>(-60.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-50.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-40.0f, 1.0));
|
||||
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>(-23.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-20.0f, 1.0));
|
||||
points.insert (std::pair<float,float>(-17.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>( -5.0f, 1.0));
|
||||
points.insert (std::pair<float,float>( 0.0f, 1.0));
|
||||
break;
|
||||
case MeterIEC2EBU:
|
||||
points.insert (std::pair<float,float>(-30.0f, 1.0));
|
||||
|
@ -357,64 +356,64 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
|
|||
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));
|
||||
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));
|
||||
points.insert (std::pair<float,float>(-30, 1.0));
|
||||
if (Config->get_meter_line_up_level() == MeteringLineUp24) {
|
||||
points.insert (std::pair<int,float>(-24, 1.0));
|
||||
points.insert (std::pair<float,float>(-24, 1.0));
|
||||
} else {
|
||||
points.insert (std::pair<int,float>(-25, 1.0));
|
||||
points.insert (std::pair<float,float>(-25, 1.0));
|
||||
}
|
||||
points.insert (std::pair<int,float>(-20, 1.0));
|
||||
points.insert (std::pair<float,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<float,float>(-19, 0.5));
|
||||
points.insert (std::pair<float,float>(-18, 1.0));
|
||||
points.insert (std::pair<float,float>(-17, 0.5));
|
||||
points.insert (std::pair<float,float>(-16, 0.5));
|
||||
points.insert (std::pair<float,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<float,float>(-14, 0.5));
|
||||
points.insert (std::pair<float,float>(-13, 0.5));
|
||||
points.insert (std::pair<float,float>(-12, 0.5));
|
||||
points.insert (std::pair<float,float>(-11, 0.5));
|
||||
points.insert (std::pair<float,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<float,float>( -9, 1.0));
|
||||
points.insert (std::pair<float,float>( -8, 0.5));
|
||||
points.insert (std::pair<float,float>( -7, 0.5));
|
||||
points.insert (std::pair<float,float>( -6, 0.5));
|
||||
points.insert (std::pair<float,float>( -5, 1.0));
|
||||
points.insert (std::pair<float,float>( -4, 0.5));
|
||||
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<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));
|
||||
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;
|
||||
|
||||
case DataType::MIDI:
|
||||
points.insert (std::pair<int,float>( 0, 1.0));
|
||||
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, 1.0));
|
||||
points.insert (std::pair<int,float>(112, 0.5));
|
||||
points.insert (std::pair<int,float>(127, 1.0));
|
||||
points.insert (std::pair<float,float>( 0, 1.0));
|
||||
points.insert (std::pair<float,float>( 16, 0.5));
|
||||
points.insert (std::pair<float,float>( 32, 0.5));
|
||||
points.insert (std::pair<float,float>( 48, 0.5));
|
||||
points.insert (std::pair<float,float>( 64, 1.0));
|
||||
points.insert (std::pair<float,float>( 80, 0.5));
|
||||
points.insert (std::pair<float,float>( 96, 0.5));
|
||||
points.insert (std::pair<float,float>(100, 1.0));
|
||||
points.insert (std::pair<float,float>(112, 0.5));
|
||||
points.insert (std::pair<float,float>(127, 1.0));
|
||||
break;
|
||||
}
|
||||
|
||||
for (std::map<int,float>::const_iterator j = points.begin(); j != points.end(); ++j) {
|
||||
for (std::map<float,float>::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<DataType> types)
|
|||
}
|
||||
|
||||
|
||||
// label-pos in dBFS, label-text
|
||||
std::map<float,string> points;
|
||||
|
||||
switch (*i) {
|
||||
|
@ -540,53 +540,53 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
|
|||
layout->set_attributes (audio_font_attributes);
|
||||
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"));
|
||||
points.insert (std::pair<float,string>(-54.0f, "-40"));
|
||||
points.insert (std::pair<float,string>(-44.0f, "-30"));
|
||||
points.insert (std::pair<float,string>(-34.0f, "-20"));
|
||||
points.insert (std::pair<float,string>(-24.0f, "-10"));
|
||||
points.insert (std::pair<float,string>(-20.0f, "-6"));
|
||||
points.insert (std::pair<float,string>(-17.0f, "-3"));
|
||||
points.insert (std::pair<float,string>(-14.0f, "0"));
|
||||
points.insert (std::pair<float,string>(-11.0f, "+3"));
|
||||
points.insert (std::pair<float,string>( -8.0f, "+6"));
|
||||
points.insert (std::pair<float,string>( -4.0f, "+10"));
|
||||
points.insert (std::pair<float,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"));
|
||||
points.insert (std::pair<float,string>(-60.0f, "-40"));
|
||||
points.insert (std::pair<float,string>(-50.0f, "-30"));
|
||||
points.insert (std::pair<float,string>(-40.0f, "-20"));
|
||||
points.insert (std::pair<float,string>(-30.0f, "-10"));
|
||||
points.insert (std::pair<float,string>(-26.0f, "-6"));
|
||||
points.insert (std::pair<float,string>(-23.0f, "-3"));
|
||||
points.insert (std::pair<float,string>(-20.0f, "0"));
|
||||
points.insert (std::pair<float,string>(-17.0f, "+3"));
|
||||
points.insert (std::pair<float,string>(-14.0f, "+6"));
|
||||
points.insert (std::pair<float,string>(-10.0f, "+10"));
|
||||
points.insert (std::pair<float,string>( -5.0f, "+15"));
|
||||
points.insert (std::pair<float,string>( 0.0f, "+20"));
|
||||
break;
|
||||
default:
|
||||
case MeterPeak:
|
||||
case MeterKrms:
|
||||
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"));
|
||||
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"));
|
||||
points.insert (std::pair<float,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"));
|
||||
points.insert (std::pair<float,string>(-24.0f, "-24"));
|
||||
} else {
|
||||
points.insert (std::pair<int,string>(-25.0f, "-25"));
|
||||
points.insert (std::pair<float,string>(-25.0f, "-25"));
|
||||
}
|
||||
points.insert (std::pair<int,string>(-15.0f, "-15"));
|
||||
points.insert (std::pair<float,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"));
|
||||
points.insert (std::pair<float,string>(-18.0f, "-18"));
|
||||
points.insert (std::pair<float,string>(-10.0f, "-10"));
|
||||
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:
|
||||
|
@ -600,13 +600,13 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
|
|||
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"));
|
||||
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:
|
||||
|
@ -661,23 +661,23 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
|
|||
break;
|
||||
case DataType::MIDI:
|
||||
layout->set_attributes (midi_font_attributes);
|
||||
points.insert (std::pair<int,string>( 0, "0"));
|
||||
points.insert (std::pair<float,string>( 0, "0"));
|
||||
if (types.size() == 1) {
|
||||
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"));
|
||||
points.insert (std::pair<float,string>( 16, "16"));
|
||||
points.insert (std::pair<float,string>( 32, "32"));
|
||||
points.insert (std::pair<float,string>( 48, "48"));
|
||||
points.insert (std::pair<float,string>( 64, "64"));
|
||||
points.insert (std::pair<float,string>( 80, "80"));
|
||||
points.insert (std::pair<float,string>( 96, "96"));
|
||||
points.insert (std::pair<float,string>(100, "100"));
|
||||
points.insert (std::pair<float,string>(112, "112"));
|
||||
} else {
|
||||
/* labels that don't overlay with dB */
|
||||
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<float,string>( 24, "24"));
|
||||
points.insert (std::pair<float,string>( 48, "48"));
|
||||
points.insert (std::pair<float,string>( 72, "74"));
|
||||
}
|
||||
points.insert (std::pair<int,string>(127, "127"));
|
||||
points.insert (std::pair<float,string>(127, "127"));
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -685,6 +685,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
|
|||
|
||||
for (std::map<float,string>::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<DataType> 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<DataType> 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<DataType> 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());
|
||||
}
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ using namespace ArdourMeter;
|
|||
PBD::Signal1<void,MeterStrip*> MeterStrip::CatchDeletion;
|
||||
PBD::Signal0<void> 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
|
||||
|
|
|
@ -47,7 +47,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI
|
|||
{
|
||||
public:
|
||||
MeterStrip (ARDOUR::Session*, boost::shared_ptr<ARDOUR::Route>);
|
||||
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<ARDOUR::Route> _route;
|
||||
|
@ -106,6 +107,7 @@ class MeterStrip : public Gtk::VBox, public RouteUI
|
|||
ArdourButton peak_display;
|
||||
|
||||
std::vector<ARDOUR::DataType> _types;
|
||||
ARDOUR::MeterType metric_type;
|
||||
|
||||
float max_peak;
|
||||
bool _has_midi;
|
||||
|
|
|
@ -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<MeterBridgeStrip>::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<MeterBridgeStrip>::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();
|
||||
|
|
|
@ -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<MeterStrip *> _metrics;
|
||||
|
||||
Gtk::VBox metrics_vpacker_left;
|
||||
Gtk::VBox metrics_vpacker_right;
|
||||
|
|
|
@ -66,6 +66,11 @@ boost::weak_ptr<Route> 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 ();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue