X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmeter.cc;h=da97041657f4380171fe49cc22540ef571a288eb;hb=8cf323c15df3af076a7e69a4b24c5cb6329477c6;hp=f065fb1c93d4ba94a065a650ff706a83441f5d1e;hpb=9d4c93aca7a7d6900c2b4f6c138057a8006321b3;p=ardour.git diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index f065fb1c93..da97041657 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -38,14 +38,16 @@ using namespace ARDOUR; PeakMeter::PeakMeter (Session& s, const std::string& name) : Processor (s, string_compose ("meter-%1", name)) { - Kmeterdsp::init(s.nominal_frame_rate()); - Iec1ppmdsp::init(s.nominal_frame_rate()); - Iec2ppmdsp::init(s.nominal_frame_rate()); - Vumeterdsp::init(s.nominal_frame_rate()); + Kmeterdsp::init(s.nominal_sample_rate()); + Iec1ppmdsp::init(s.nominal_sample_rate()); + Iec2ppmdsp::init(s.nominal_sample_rate()); + Vumeterdsp::init(s.nominal_sample_rate()); _pending_active = true; _meter_type = MeterPeak; _reset_dpm = true; _reset_max = true; + _bufcnt = 0; + _combined_peak = 0; } PeakMeter::~PeakMeter () @@ -76,7 +78,7 @@ PeakMeter::~PeakMeter () * (runs in jack realtime context) */ void -PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool) +PeakMeter::run (BufferSet& bufs, samplepos_t /*start_sample*/, samplepos_t /*end_sample*/, double /*speed*/, pframes_t nframes, bool) { if (!_active && !_pending_active) { return; @@ -85,6 +87,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr const bool do_reset_dpm = _reset_dpm; _reset_max = false; _reset_dpm = false; + _combined_peak = 0; // cerr << "meter " << name() << " runs with " << bufs.available() << " inputs\n"; @@ -93,22 +96,27 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr uint32_t n = 0; - const float falloff_dB = Config->get_meter_falloff() * nframes / _session.nominal_frame_rate(); - const uint32_t zoh = _session.nominal_frame_rate() * .021; + const float falloff_dB = Config->get_meter_falloff() * nframes / _session.nominal_sample_rate(); + const uint32_t zoh = _session.nominal_sample_rate() * .021; _bufcnt += nframes; // Meter MIDI in to the first n_midi peaks for (uint32_t i = 0; i < n_midi; ++i, ++n) { float val = 0.0f; const MidiBuffer& buf (bufs.get_midi(i)); - + for (MidiBuffer::const_iterator e = buf.begin(); e != buf.end(); ++e) { - const Evoral::MIDIEvent ev(*e, false); + const Evoral::Event ev(*e, false); if (ev.is_note_on()) { const float this_vel = ev.buffer()[2] / 127.0; if (this_vel > val) { val = this_vel; } + if (val > 0.01) { + if (_combined_peak < 0.01) { + _combined_peak = 0.01; + } + } } else { val += 1.0 / bufs.get_midi(n).capacity(); if (val > 1.0) { @@ -129,10 +137,12 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr // Meter audio in to the rest of the peaks for (uint32_t i = 0; i < n_audio; ++i, ++n) { if (bufs.get_audio(i).silent()) { - ; + _peak_buffer[n] = 0; } else { _peak_buffer[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_buffer[n]); + _peak_buffer[n] = std::min (_peak_buffer[n], 100.f); // cut off at +40dBFS for falloff. _max_peak_signal[n] = std::max(_peak_buffer[n], _max_peak_signal[n]); // todo sync reset + _combined_peak = std::max(_peak_buffer[n], _combined_peak); } if (do_reset_max) { @@ -227,14 +237,23 @@ PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out) bool PeakMeter::configure_io (ChanCount in, ChanCount out) { + bool changed = false; if (out != in) { // always 1:1 return false; } + if (current_meters != in) { + changed = true; + } + current_meters = in; set_max_channels (in); + if (changed) { + reset_max(); + } + return Processor::configure_io (in, out); } @@ -309,6 +328,7 @@ PeakMeter::set_max_channels (const ChanCount& chn) float PeakMeter::meter_level(uint32_t n, MeterType type) { + float mcptmp; switch (type) { case MeterKrms: case MeterK20: @@ -353,6 +373,9 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { return _peak_power[n]; } break; + case MeterMCP: + mcptmp = _combined_peak; + return accurate_coefficient_to_dB(mcptmp); case MeterMaxSignal: assert(0); break; @@ -404,9 +427,9 @@ PeakMeter::set_type(MeterType t) } XMLNode& -PeakMeter::state (bool full_state) +PeakMeter::state () { - XMLNode& node (Processor::state (full_state)); - node.add_property("type", "meter"); + XMLNode& node (Processor::state ()); + node.set_property("type", "meter"); return node; }