13
0

* 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
This commit is contained in:
Jesse Chappell 2007-01-03 20:49:03 +00:00
parent ebbc8b3b6a
commit 239a5db497
8 changed files with 107 additions and 24 deletions

View File

@ -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:

View File

@ -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");
}

View File

@ -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)

View File

@ -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;

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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;
}
}