X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmeter.cc;h=e49b69574e3e8bfbcc19e5deba9f235df4bda71a;hb=7720d0d109ca47c2a0a23883d5831de1ff32005d;hp=e5fcc16f292da752fe412d59c9797245d41299c1;hpb=57e1358fb2d8a8ab51b4996808e0eaa41492fb9e;p=ardour.git diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index e5fcc16f29..e49b69574e 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -31,38 +31,12 @@ using namespace std; using namespace ARDOUR; -sigc::signal Metering::Meter; -Glib::StaticMutex Metering::m_meter_signal_lock; +PBD::Signal0 Metering::Meter; -sigc::connection -Metering::connect (sigc::slot the_slot) -{ - // SignalProcessor::Meter is emitted from another thread so the - // Meter signal must be protected. - Glib::Mutex::Lock guard (m_meter_signal_lock); - return Meter.connect (the_slot); -} - -void -Metering::disconnect (sigc::connection& c) -{ - Glib::Mutex::Lock guard (m_meter_signal_lock); - c.disconnect (); -} - -/** - Update the meters. - - The meter signal lock is taken to prevent modification of the - Meter signal while updating the meters, taking the meter signal - lock prior to taking the io_lock ensures that all IO will remain - valid while metering. -*/ -void -Metering::update_meters() +PeakMeter::PeakMeter (Session& s, const XMLNode& node) + : Processor (s, node) { - Glib::Mutex::Lock guard (m_meter_signal_lock); - Meter(); /* EMIT SIGNAL */ + } /** Get peaks from @a bufs @@ -71,7 +45,7 @@ Metering::update_meters() * be set to 0. */ void -PeakMeter::run (BufferSet& bufs, sframes_t /*start_frame*/, sframes_t /*end_frame*/, nframes_t nframes) +PeakMeter::run (BufferSet& bufs, sframes_t /*start_frame*/, sframes_t /*end_frame*/, nframes_t nframes, bool) { if (!_active && !_pending_active) { return; @@ -115,11 +89,6 @@ PeakMeter::run (BufferSet& bufs, sframes_t /*start_frame*/, sframes_t /*end_fram _active = _pending_active; } -PeakMeter::PeakMeter (Session& s, const XMLNode& node) - : Processor (s, node) -{ -} - void PeakMeter::reset () { @@ -150,7 +119,21 @@ PeakMeter::configure_io (ChanCount in, ChanCount out) return false; } - uint32_t limit = in.n_total(); + current_meters = in; + + return Processor::configure_io (in, out); +} + +void +PeakMeter::reflect_inputs (const ChanCount& in) +{ + current_meters = in; +} + +void +PeakMeter::reset_max_channels (const ChanCount& chn) +{ + uint32_t limit = chn.n_total(); while (_peak_power.size() > limit) { _peak_power.pop_back(); @@ -167,8 +150,6 @@ PeakMeter::configure_io (ChanCount in, ChanCount out) assert(_peak_power.size() == limit); assert(_visible_peak_power.size() == limit); assert(_max_peak_power.size() == limit); - - return Processor::configure_io (in, out); } /** To be driven by the Meter signal from IO. @@ -185,7 +166,7 @@ PeakMeter::meter () assert(_visible_peak_power.size() == _peak_power.size()); - const size_t limit = _peak_power.size(); + const size_t limit = min (_peak_power.size(), (size_t) current_meters.n_total ()); for (size_t n = 0; n < limit; ++n) {