From 239da0efb58849e545ec44aeb839d41b8e4792cf Mon Sep 17 00:00:00 2001 From: Len Ovens Date: Mon, 28 Sep 2015 20:13:15 -0700 Subject: Fix Mackie control metering (fixes #6608). --- libs/ardour/ardour/meter.h | 1 + libs/ardour/ardour/types.h | 3 ++- libs/ardour/enums.cc | 1 + libs/ardour/meter.cc | 14 +++++++++++++- libs/surfaces/mackie/strip.cc | 2 +- 5 files changed, 18 insertions(+), 3 deletions(-) (limited to 'libs') diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h index 7539db2140..a3bd34e1b7 100644 --- a/libs/ardour/ardour/meter.h +++ b/libs/ardour/ardour/meter.h @@ -97,6 +97,7 @@ private: std::vector _peak_buffer; // internal, integrate std::vector _peak_power; // includes accurate falloff, hence dB std::vector _max_peak_signal; // dB calculation is done on demand + float _combined_peak; // Mackie surfaces expect the highest peak of all track channels std::vector _kmeter; std::vector _iec1meter; diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index f2facd340b..5bd7b87929 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -192,7 +192,8 @@ namespace ARDOUR { MeterIEC2EBU = 0x0200, MeterVU = 0x0400, MeterK12 = 0x0800, - MeterPeak0dB = 0x1000 + MeterPeak0dB = 0x1000, + MeterMCP = 0x2000 }; enum TrackMode { diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index f3972f346c..d436200222 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -192,6 +192,7 @@ setup_enum_writer () REGISTER_ENUM (MeterIEC2EBU); REGISTER_ENUM (MeterVU); REGISTER_ENUM (MeterPeak0dB); + REGISTER_ENUM (MeterMCP); REGISTER (_MeterType); REGISTER_ENUM (Normal); diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc index 8de4914096..fa9ee2fc6b 100644 --- a/libs/ardour/meter.cc +++ b/libs/ardour/meter.cc @@ -47,6 +47,7 @@ PeakMeter::PeakMeter (Session& s, const std::string& name) _reset_dpm = true; _reset_max = true; _bufcnt = 0; + _combined_peak = 0; } PeakMeter::~PeakMeter () @@ -102,7 +103,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr 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); if (ev.is_note_on()) { @@ -110,6 +111,11 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr 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) { @@ -134,6 +140,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr } else { _peak_buffer[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_buffer[n]); _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) { @@ -310,6 +317,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: @@ -354,6 +362,10 @@ PeakMeter::meter_level(uint32_t n, MeterType type) { return _peak_power[n]; } break; + case MeterMCP: + mcptmp = _combined_peak; + _combined_peak = 0; + return accurate_coefficient_to_dB(mcptmp); case MeterMaxSignal: assert(0); break; diff --git a/libs/surfaces/mackie/strip.cc b/libs/surfaces/mackie/strip.cc index 1545933673..9447b4121c 100644 --- a/libs/surfaces/mackie/strip.cc +++ b/libs/surfaces/mackie/strip.cc @@ -719,7 +719,7 @@ void Strip::update_meter () { if (_meter && _transport_is_rolling && _metering_active) { - float dB = const_cast (_route->peak_meter()).meter_level (0, MeterPeak); + float dB = const_cast (_route->peak_meter()).meter_level (0, MeterMCP); _meter->send_update (*_surface, dB); } } -- cgit v1.2.3