From 239a5db49701e977db96854cdcef96646b4d8c4f Mon Sep 17 00:00:00 2001 From: Jesse Chappell Date: Wed, 3 Jan 2007 20:49:03 +0000 Subject: * added max peak hold state to IO so that the true held peaks can be displayed in the numeric field in the gui. * returned meter falloff to proper slower speeds git-svn-id: svn://localhost/ardour2/trunk@1265 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour_ui_options.cc | 4 +-- gtk2_ardour/gain_meter.cc | 17 ++++++++--- libs/ardour/ardour/configuration_vars.h | 2 +- libs/ardour/ardour/io.h | 14 +++++++++ libs/ardour/ardour/utils.h | 2 ++ libs/ardour/io.cc | 28 +++++++++++++---- libs/ardour/route.cc | 10 ++++-- libs/ardour/utils.cc | 54 ++++++++++++++++++++++++++++----- 8 files changed, 107 insertions(+), 24 deletions(-) diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc index b69a24e95b..d0f523481f 100644 --- a/gtk2_ardour/ardour_ui_options.cc +++ b/gtk2_ardour/ardour_ui_options.cc @@ -587,10 +587,8 @@ ARDOUR_UI::map_meter_falloff () { const char* action = X_("MeterFalloffMedium"); - /* XXX hack alert. Fix this. Please */ - float val = Config->get_meter_falloff (); - MeterFalloff code = (MeterFalloff) (int) (floor (val)); + MeterFalloff code = meter_falloff_from_float(val); switch (code) { case MeterFalloffOff: diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 9c222b62c8..06b1195a18 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -312,7 +312,7 @@ GainMeter::update_meters () { vector::iterator i; uint32_t n; - float peak; + float peak, mpeak; char buf[32]; for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) { @@ -320,9 +320,11 @@ GainMeter::update_meters () peak = _io->peak_input_power (n); (*i).meter->set (log_meter (peak), peak); - - if (peak > max_peak) { - max_peak = peak; + + mpeak = _io->max_peak_power(n); + + if (mpeak > max_peak) { + max_peak = mpeak; /* set peak display */ if (max_peak <= -200.0f) { peak_display.set_text (_("-inf")); @@ -478,7 +480,12 @@ GainMeter::peak_button_release (GdkEventButton* ev) void GainMeter::reset_peak_display () { - max_peak = minus_infinity(); + Route * r; + if ((r = dynamic_cast (_io.get())) != 0) { + r->reset_max_peak_meters(); + } + + max_peak = -INFINITY; peak_display.set_text (_("-Inf")); peak_display.set_name ("MixerStripPeakDisplay"); } diff --git a/libs/ardour/ardour/configuration_vars.h b/libs/ardour/ardour/configuration_vars.h index ad7e44d332..c520477c55 100644 --- a/libs/ardour/ardour/configuration_vars.h +++ b/libs/ardour/ardour/configuration_vars.h @@ -103,7 +103,7 @@ CONFIG_VARIABLE (float, video_pullup, "video-pullup", 0.0f) /* metering */ CONFIG_VARIABLE (float, meter_hold, "meter-hold", 100.0f) -CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 0.375f) +CONFIG_VARIABLE (float, meter_falloff, "meter-falloff", 27.0f) CONFIG_VARIABLE (nframes_t, over_length_short, "over-length-short", 2) CONFIG_VARIABLE (nframes_t, over_length_long, "over-length-long", 10) diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index 7c198bb72a..3dc2c84b4f 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -197,6 +197,19 @@ class IO : public PBD::StatefulDestructible } } + float max_peak_power (uint32_t n) { + if (_ninputs == 0) { + return minus_infinity(); + } else if (n < std::max (_ninputs, _noutputs)) { + return _max_peak_power[n]; + } else { + return minus_infinity(); + } + } + + void reset_max_peak_meters (); + + static void update_meters(); private: @@ -272,6 +285,7 @@ class IO : public PBD::StatefulDestructible vector _inputs; vector _peak_power; vector _visible_peak_power; + vector _max_peak_power; string _name; Connection* _input_connection; Connection* _output_connection; diff --git a/libs/ardour/ardour/utils.h b/libs/ardour/ardour/utils.h index 2babfd6bd7..de97a5c150 100644 --- a/libs/ardour/ardour/utils.h +++ b/libs/ardour/ardour/utils.h @@ -66,6 +66,8 @@ const char* edit_mode_to_string (ARDOUR::EditMode); ARDOUR::EditMode string_to_edit_mode (std::string); float meter_falloff_to_float (ARDOUR::MeterFalloff); +ARDOUR::MeterFalloff meter_falloff_from_float (float); +float meter_falloff_to_db_per_sec (float); float meter_hold_to_float (ARDOUR::MeterHold); #if defined(HAVE_COREAUDIO) || defined(HAVE_AUDIOUNITS) diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index 64b917c6e9..b4d9db97eb 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -2427,6 +2427,16 @@ IO::reset_peak_meters () } } +void +IO::reset_max_peak_meters () +{ + uint32_t limit = max (_ninputs, _noutputs); + + for (uint32_t i = 0; i < limit; ++i) { + _max_peak_power[i] = -INFINITY; + } +} + void IO::setup_peak_meters () { @@ -2434,7 +2444,8 @@ IO::setup_peak_meters () while (_peak_power.size() < limit) { _peak_power.push_back (0); - _visible_peak_power.push_back (0); + _visible_peak_power.push_back (-INFINITY); + _max_peak_power.push_back (-INFINITY); } } @@ -2468,20 +2479,25 @@ IO::meter () float new_peak = _peak_power[n]; _peak_power[n] = 0; - + /* compute new visible value using falloff */ - if (new_peak > 0.0) { + if (new_peak > 0.0f) { new_peak = coefficient_to_dB (new_peak); } else { - new_peak = minus_infinity(); + new_peak = -INFINITY; } + + /* update max peak */ + + _max_peak_power[n] = max (new_peak, _max_peak_power[n]); + if (Config->get_meter_falloff() == 0.0f || new_peak > _visible_peak_power[n]) { _visible_peak_power[n] = new_peak; } else { - // do falloff - new_peak = _visible_peak_power[n] - Config->get_meter_falloff(); + // do falloff, the config value is in dB/sec, we get updated at 100/sec currently (should be a var somewhere) + new_peak = _visible_peak_power[n] - (Config->get_meter_falloff() * 0.01f); _visible_peak_power[n] = max (new_peak, -INFINITY); } } diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index f32757c169..4e82e89b3e 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -845,7 +845,10 @@ Route::add_redirect (boost::shared_ptr redirect, void *src, uint32_t* _peak_power.push_back(0); } while (_visible_peak_power.size() < potential_max_streams) { - _visible_peak_power.push_back(0); + _visible_peak_power.push_back(-INFINITY); + } + while (_max_peak_power.size() < potential_max_streams) { + _max_peak_power.push_back(-INFINITY); } _redirects.push_back (redirect); @@ -903,7 +906,10 @@ Route::add_redirects (const RedirectList& others, void *src, uint32_t* err_strea _peak_power.push_back(0); } while (_visible_peak_power.size() < potential_max_streams) { - _visible_peak_power.push_back(0); + _visible_peak_power.push_back(-INFINITY); + } + while (_max_peak_power.size() < potential_max_streams) { + _max_peak_power.push_back(-INFINITY); } _redirects.push_back (*i); diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index ec5cb4e757..a02016201a 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -394,25 +394,65 @@ slave_source_to_string (SlaveSource src) } } +/* I don't really like hard-coding these falloff rates here + * Probably should use a map of some kind that could be configured + * These rates are db/sec. +*/ + +#define METER_FALLOFF_OFF 0.0f +#define METER_FALLOFF_SLOWEST 6.6f // BBC standard +#define METER_FALLOFF_SLOW 8.6f // BBC standard +#define METER_FALLOFF_MEDIUM 20.0f +#define METER_FALLOFF_FAST 32.0f +#define METER_FALLOFF_FASTER 46.0f +#define METER_FALLOFF_FASTEST 70.0f + float meter_falloff_to_float (MeterFalloff falloff) { switch (falloff) { case MeterFalloffOff: - return 0.0f; + return METER_FALLOFF_OFF; case MeterFalloffSlowest: - return 1.0f; + return METER_FALLOFF_SLOWEST; case MeterFalloffSlow: - return 2.0f; + return METER_FALLOFF_SLOW; case MeterFalloffMedium: - return 3.0f; + return METER_FALLOFF_MEDIUM; case MeterFalloffFast: - return 4.0f; + return METER_FALLOFF_FAST; case MeterFalloffFaster: - return 5.0f; + return METER_FALLOFF_FASTER; case MeterFalloffFastest: + return METER_FALLOFF_FASTEST; default: - return 6.0f; + return METER_FALLOFF_FAST; + } +} + +MeterFalloff +meter_falloff_from_float (float val) +{ + if (val == METER_FALLOFF_OFF) { + return MeterFalloffOff; + } + else if (val <= METER_FALLOFF_SLOWEST) { + return MeterFalloffSlowest; + } + else if (val <= METER_FALLOFF_SLOW) { + return MeterFalloffSlow; + } + else if (val <= METER_FALLOFF_MEDIUM) { + return MeterFalloffMedium; + } + else if (val <= METER_FALLOFF_FAST) { + return MeterFalloffFast; + } + else if (val <= METER_FALLOFF_FASTER) { + return MeterFalloffFaster; + } + else { + return MeterFalloffFastest; } } -- cgit v1.2.3