summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2015-09-28 20:13:15 -0700
committerLen Ovens <len@ovenwerks.net>2015-09-28 20:13:15 -0700
commit239da0efb58849e545ec44aeb839d41b8e4792cf (patch)
tree7c0ac52d5a348e8f4690347ec27c32d402636566 /libs
parent7f86418340f80fa20edee0557fe008b4053a7728 (diff)
Fix Mackie control metering (fixes #6608).
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/meter.h1
-rw-r--r--libs/ardour/ardour/types.h3
-rw-r--r--libs/ardour/enums.cc1
-rw-r--r--libs/ardour/meter.cc14
-rw-r--r--libs/surfaces/mackie/strip.cc2
5 files changed, 18 insertions, 3 deletions
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<float> _peak_buffer; // internal, integrate
std::vector<float> _peak_power; // includes accurate falloff, hence dB
std::vector<float> _max_peak_signal; // dB calculation is done on demand
+ float _combined_peak; // Mackie surfaces expect the highest peak of all track channels
std::vector<Kmeterdsp *> _kmeter;
std::vector<Iec1ppmdsp *> _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<framepos_t> 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<PeakMeter&> (_route->peak_meter()).meter_level (0, MeterPeak);
+ float dB = const_cast<PeakMeter&> (_route->peak_meter()).meter_level (0, MeterMCP);
_meter->send_update (*_surface, dB);
}
}