Synchronize meter-reset #7465

Queue reset to be handled when the meter is updated.
Also only call set_name(), set_active_state() when the
state changes.
This commit is contained in:
Robin Gareus 2020-04-10 23:36:17 +02:00
parent 58672bcaa2
commit e1a9034a0e
No known key found for this signature in database
GPG key ID: A090BCE02CF57F04
7 changed files with 66 additions and 30 deletions

View file

@ -316,6 +316,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, error_alert_button ( ArdourButton::just_led_default_elements ) , error_alert_button ( ArdourButton::just_led_default_elements )
, editor_meter_peak_display() , editor_meter_peak_display()
, editor_meter(0) , editor_meter(0)
, _clear_editor_meter( true)
, _editor_meter_peaked (false)
, _numpad_locate_happening (false) , _numpad_locate_happening (false)
, _session_is_new (false) , _session_is_new (false)
, last_key_press_time (0) , last_key_press_time (0)
@ -1136,11 +1138,20 @@ ARDOUR_UI::every_point_zero_something_seconds ()
// august 2007: actual update frequency: 25Hz (40ms), not 100Hz // august 2007: actual update frequency: 25Hz (40ms), not 100Hz
if (editor_meter && UIConfiguration::instance().get_show_editor_meter() && editor_meter_peak_display.is_mapped ()) { if (editor_meter && UIConfiguration::instance().get_show_editor_meter() && editor_meter_peak_display.is_mapped ()) {
float mpeak = editor_meter->update_meters();
if (mpeak > editor_meter_max_peak) { if (_clear_editor_meter) {
if (mpeak >= UIConfiguration::instance().get_meter_peak()) { editor_meter->clear_meters();
editor_meter_peak_display.set_active_state ( Gtkmm2ext::ExplicitActive ); editor_meter_peak_display.set_active_state (Gtkmm2ext::Off);
} _clear_editor_meter = false;
_editor_meter_peaked = false;
}
const float mpeak = editor_meter->update_meters();
const bool peaking = mpeak > UIConfiguration::instance().get_meter_peak();
if (!_editor_meter_peaked && peaking) {
editor_meter_peak_display.set_active_state ( Gtkmm2ext::ExplicitActive );
_editor_meter_peaked = true;
} }
} }
} }
@ -2935,9 +2946,7 @@ void
ARDOUR_UI::reset_peak_display () ARDOUR_UI::reset_peak_display ()
{ {
if (!_session || !_session->master_out() || !editor_meter) return; if (!_session || !_session->master_out() || !editor_meter) return;
editor_meter->clear_meters(); _clear_editor_meter = true;
editor_meter_max_peak = -INFINITY;
editor_meter_peak_display.set_active_state ( Gtkmm2ext::Off );
} }
void void

View file

@ -545,11 +545,14 @@ private:
ArdourWidgets::ArdourButton action_script_call_btn[MAX_LUA_ACTION_BUTTONS]; ArdourWidgets::ArdourButton action_script_call_btn[MAX_LUA_ACTION_BUTTONS];
Gtk::VBox alert_box; Gtk::VBox alert_box;
Gtk::Table editor_meter_table; Gtk::Table editor_meter_table;
ArdourWidgets::ArdourButton editor_meter_peak_display; ArdourWidgets::ArdourButton editor_meter_peak_display;
LevelMeterHBox * editor_meter; LevelMeterHBox * editor_meter;
float editor_meter_max_peak;
bool editor_meter_peak_button_release (GdkEventButton*); bool _clear_editor_meter;
bool _editor_meter_peaked;
bool editor_meter_peak_button_release (GdkEventButton*);
void blink_handler (bool); void blink_handler (bool);
sigc::connection blink_connection; sigc::connection blink_connection;

View file

@ -275,7 +275,7 @@ ARDOUR_UI::set_session (Session *s)
editor_meter_peak_display.set_size_request (-1, std::max (5.f, std::min (12.f, rintf (8.f * UIConfiguration::instance().get_ui_scale()))) ); editor_meter_peak_display.set_size_request (-1, std::max (5.f, std::min (12.f, rintf (8.f * UIConfiguration::instance().get_ui_scale()))) );
editor_meter_peak_display.set_corner_radius (1.0); editor_meter_peak_display.set_corner_radius (1.0);
editor_meter_max_peak = -INFINITY; _clear_editor_meter = true;
editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false); editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
repack_transport_hbox (); repack_transport_hbox ();

View file

@ -106,6 +106,8 @@ GainMeterBase::GainMeterBase (Session* s, bool horizontal, int fader_length, int
, meter_point_button (_("pre")) , meter_point_button (_("pre"))
, gain_astate_propagate (false) , gain_astate_propagate (false)
, _data_type (DataType::AUDIO) , _data_type (DataType::AUDIO)
, _clear_meters (true)
, _meter_peaked (false)
{ {
using namespace Menu_Helpers; using namespace Menu_Helpers;
@ -456,10 +458,7 @@ GainMeterBase::reset_peak_display ()
return; return;
} }
_meter->reset_max(); _meter->reset_max();
level_meter->clear_meters(); _clear_meters = true;
max_peak = minus_infinity ();
peak_display.set_text (_("-inf"));
peak_display.set_name ("MixerStripPeakDisplay");
} }
void void
@ -842,7 +841,15 @@ GainMeterBase::meter_channels() const
void void
GainMeterBase::update_meters() GainMeterBase::update_meters()
{ {
char buf[32]; if (_clear_meters) {
max_peak = minus_infinity ();
level_meter->clear_meters ();
peak_display.set_text (_("-inf"));
peak_display.set_name ("MixerStripPeakDisplay");
_meter_peaked = false;
_clear_meters = false;
}
float mpeak = level_meter->update_meters(); float mpeak = level_meter->update_meters();
if (mpeak > max_peak) { if (mpeak > max_peak) {
@ -850,12 +857,17 @@ GainMeterBase::update_meters()
if (mpeak <= -200.0f) { if (mpeak <= -200.0f) {
peak_display.set_text (_("-inf")); peak_display.set_text (_("-inf"));
} else { } else {
char buf[32];
snprintf (buf, sizeof(buf), "%.1f", mpeak); snprintf (buf, sizeof(buf), "%.1f", mpeak);
peak_display.set_text (buf); peak_display.set_text (buf);
} }
} }
if (mpeak >= UIConfiguration::instance().get_meter_peak()) {
peak_display.set_name ("MixerStripPeakDisplayPeak"); bool peaking = mpeak >= UIConfiguration::instance().get_meter_peak();
if (!_meter_peaked && peaking) {
peak_display.set_name ("MixerStripPeakDisplayPeak");
_meter_peaked = true;
} }
} }

View file

@ -208,6 +208,9 @@ private:
bool level_meter_button_press (GdkEventButton *); bool level_meter_button_press (GdkEventButton *);
PBD::ScopedConnection _level_meter_connection; PBD::ScopedConnection _level_meter_connection;
bool _clear_meters;
bool _meter_peaked;
}; };
class GainMeter : public GainMeterBase, public Gtk::VBox class GainMeter : public GainMeterBase, public Gtk::VBox

View file

@ -70,6 +70,8 @@ PBD::Signal0<void> MeterStrip::ConfigurationChanged;
MeterStrip::MeterStrip (int metricmode, MeterType mt) MeterStrip::MeterStrip (int metricmode, MeterType mt)
: RouteUI ((Session*) 0) : RouteUI ((Session*) 0)
, metric_type (MeterPeak) , metric_type (MeterPeak)
, _clear_meters (true)
, _meter_peaked (false)
, _has_midi (false) , _has_midi (false)
, _tick_bar (0) , _tick_bar (0)
, _strip_type (0) , _strip_type (0)
@ -127,6 +129,8 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
, RouteUI ((Session*) 0) , RouteUI ((Session*) 0)
, _route (rt) , _route (rt)
, metric_type (MeterPeak) , metric_type (MeterPeak)
, _clear_meters (true)
, _meter_peaked (false)
, _has_midi (false) , _has_midi (false)
, _tick_bar (0) , _tick_bar (0)
, _strip_type (0) , _strip_type (0)
@ -165,7 +169,6 @@ MeterStrip::MeterStrip (Session* sess, boost::shared_ptr<ARDOUR::Route> rt)
peak_display.set_name ("meterbridge peakindicator"); peak_display.set_name ("meterbridge peakindicator");
peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body)); peak_display.set_elements((ArdourButton::Element) (ArdourButton::Edge|ArdourButton::Body));
set_tooltip (peak_display, _("Reset Peak")); set_tooltip (peak_display, _("Reset Peak"));
max_peak = minus_infinity();
peak_display.unset_flags (Gtk::CAN_FOCUS); peak_display.unset_flags (Gtk::CAN_FOCUS);
peak_display.set_size_request(PX_SCALE(12, 12), PX_SCALE(8, 8)); peak_display.set_size_request(PX_SCALE(12, 12), PX_SCALE(8, 8));
peak_display.set_corner_radius(2); // ardour-button scales this peak_display.set_corner_radius(2); // ardour-button scales this
@ -417,12 +420,19 @@ MeterStrip::route_color_changed ()
void void
MeterStrip::fast_update () MeterStrip::fast_update ()
{ {
float mpeak = level_meter->update_meters(); if (_clear_meters) {
if (mpeak > max_peak) { level_meter->clear_meters();
max_peak = mpeak; peak_display.set_active_state (Gtkmm2ext::Off);
if (mpeak >= UIConfiguration::instance().get_meter_peak()) { _clear_meters = false;
peak_display.set_active_state ( Gtkmm2ext::ExplicitActive ); _meter_peaked = false;
} }
const float mpeak = level_meter->update_meters();
const bool peaking = mpeak > UIConfiguration::instance().get_meter_peak();
if (!_meter_peaked && peaking) {
peak_display.set_active_state ( Gtkmm2ext::ExplicitActive );
_meter_peaked = true;
} }
} }
@ -697,9 +707,7 @@ void
MeterStrip::reset_peak_display () MeterStrip::reset_peak_display ()
{ {
_route->shared_peak_meter()->reset_max(); _route->shared_peak_meter()->reset_max();
level_meter->clear_meters(); _clear_meters = true;
max_peak = -INFINITY;
peak_display.set_active_state ( Gtkmm2ext::Off );
} }
bool bool
@ -776,7 +784,7 @@ void
MeterStrip::parameter_changed (std::string const & p) MeterStrip::parameter_changed (std::string const & p)
{ {
if (p == "meter-peak") { if (p == "meter-peak") {
max_peak = -INFINITY; _clear_meters = true;
} }
else if (p == "show-rec-on-meterbridge") { else if (p == "show-rec-on-meterbridge") {
update_button_box(); update_button_box();

View file

@ -131,7 +131,8 @@ private:
std::vector<ARDOUR::DataType> _types; std::vector<ARDOUR::DataType> _types;
ARDOUR::MeterType metric_type; ARDOUR::MeterType metric_type;
float max_peak; bool _clear_meters;
bool _meter_peaked;
bool _has_midi; bool _has_midi;
int _tick_bar; int _tick_bar;
int _strip_type; int _strip_type;