using namespace Gtk;
using namespace std;
-//sigc::signal<void> LevelMeter::ResetAllPeakDisplays;
-//sigc::signal<void,RouteGroup*> LevelMeter::ResetGroupPeakDisplays;
-
-
LevelMeter::LevelMeter (Session* s)
: _meter (0)
, meter_length (0)
LevelMeter::set_meter (PeakMeter* meter)
{
_configuration_connection.disconnect();
+ _meter_type_connection.disconnect();
+
_meter = meter;
if (_meter) {
_meter->ConfigurationChanged.connect (_configuration_connection, invalidator (*this), boost::bind (&LevelMeter::configuration_changed, this, _1, _2), gui_context());
+ _meter->TypeChanged.connect (_meter_type_connection, invalidator (*this), boost::bind (&LevelMeter::meter_type_changed, this, _1), gui_context());
}
}
{
vector<MeterInfo>::iterator i;
uint32_t n;
- float peak, mpeak;
if (!_meter) {
return 0.0f;
for (n = 0, i = meters.begin(); i != meters.end(); ++i, ++n) {
if ((*i).packed) {
- mpeak = _meter->meter_level(n, MeterMaxPeak);
+ const float mpeak = _meter->meter_level(n, MeterMaxPeak);
if (mpeak > (*i).max_peak) {
(*i).max_peak = mpeak;
(*i).meter->set_highlight(mpeak > Config->get_meter_peak());
max_peak = mpeak;
}
- peak = _meter->meter_level (n, meter_type);
if (n < nmidi) {
- (*i).meter->set (peak);
+ (*i).meter->set (_meter->meter_level (n, MeterPeak));
} else {
- (*i).meter->set (log_meter (peak));
+ const float peak = _meter->meter_level (n, meter_type);
+ if (meter_type == MeterPeak) {
+ (*i).meter->set (log_meter (peak));
+ } else {
+ (*i).meter->set (log_meter (peak), log_meter(_meter->meter_level(n, MeterPeak)));
+ }
}
}
}
setup_meters (meter_length, regular_meter_width, thin_meter_width);
}
+void
+LevelMeter::meter_type_changed (MeterType t)
+{
+ meter_type = t;
+ MeterTypeChanged(t);
+}
+
void
LevelMeter::hide_all_meters ()
{
LevelMeter::meter_button_release (GdkEventButton* ev)
{
if (ev->button == 1) {
- clear_meters ();
+ clear_meters (false);
}
return true;
}
-void LevelMeter::clear_meters ()
+void LevelMeter::clear_meters (bool reset_highlight)
{
for (vector<MeterInfo>::iterator i = meters.begin(); i < meters.end(); i++) {
(*i).meter->clear();
(*i).max_peak = minus_infinity();
- (*i).meter->set_highlight(false);
+ if (reset_highlight)
+ (*i).meter->set_highlight(false);
}
max_peak = minus_infinity();
}