summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Chappell <jesse@essej.net>2007-01-03 20:49:03 +0000
committerJesse Chappell <jesse@essej.net>2007-01-03 20:49:03 +0000
commit239a5db49701e977db96854cdcef96646b4d8c4f (patch)
treeb669fa074f81966f4bc3d36276d2436d345ba98e
parentebbc8b3b6a6d77f705698aff36455c61ee07bb66 (diff)
* 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
-rw-r--r--gtk2_ardour/ardour_ui_options.cc4
-rw-r--r--gtk2_ardour/gain_meter.cc17
-rw-r--r--libs/ardour/ardour/configuration_vars.h2
-rw-r--r--libs/ardour/ardour/io.h14
-rw-r--r--libs/ardour/ardour/utils.h2
-rw-r--r--libs/ardour/io.cc28
-rw-r--r--libs/ardour/route.cc10
-rw-r--r--libs/ardour/utils.cc54
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<MeterInfo>::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<Route*> (_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<Port*> _inputs;
vector<float> _peak_power;
vector<float> _visible_peak_power;
+ vector<float> _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
@@ -2428,13 +2428,24 @@ 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 ()
{
uint32_t limit = max (_ninputs, _noutputs);
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> 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;
}
}