Fix Mackie control metering (fixes #6608).

This commit is contained in:
Len Ovens 2015-09-28 20:13:15 -07:00
parent 7f86418340
commit 239da0efb5
5 changed files with 18 additions and 3 deletions

View file

@ -97,6 +97,7 @@ private:
std::vector<float> _peak_buffer; // internal, integrate std::vector<float> _peak_buffer; // internal, integrate
std::vector<float> _peak_power; // includes accurate falloff, hence dB std::vector<float> _peak_power; // includes accurate falloff, hence dB
std::vector<float> _max_peak_signal; // dB calculation is done on demand 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<Kmeterdsp *> _kmeter;
std::vector<Iec1ppmdsp *> _iec1meter; std::vector<Iec1ppmdsp *> _iec1meter;

View file

@ -192,7 +192,8 @@ namespace ARDOUR {
MeterIEC2EBU = 0x0200, MeterIEC2EBU = 0x0200,
MeterVU = 0x0400, MeterVU = 0x0400,
MeterK12 = 0x0800, MeterK12 = 0x0800,
MeterPeak0dB = 0x1000 MeterPeak0dB = 0x1000,
MeterMCP = 0x2000
}; };
enum TrackMode { enum TrackMode {

View file

@ -192,6 +192,7 @@ setup_enum_writer ()
REGISTER_ENUM (MeterIEC2EBU); REGISTER_ENUM (MeterIEC2EBU);
REGISTER_ENUM (MeterVU); REGISTER_ENUM (MeterVU);
REGISTER_ENUM (MeterPeak0dB); REGISTER_ENUM (MeterPeak0dB);
REGISTER_ENUM (MeterMCP);
REGISTER (_MeterType); REGISTER (_MeterType);
REGISTER_ENUM (Normal); REGISTER_ENUM (Normal);

View file

@ -47,6 +47,7 @@ PeakMeter::PeakMeter (Session& s, const std::string& name)
_reset_dpm = true; _reset_dpm = true;
_reset_max = true; _reset_max = true;
_bufcnt = 0; _bufcnt = 0;
_combined_peak = 0;
} }
PeakMeter::~PeakMeter () PeakMeter::~PeakMeter ()
@ -110,6 +111,11 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
if (this_vel > val) { if (this_vel > val) {
val = this_vel; val = this_vel;
} }
if (val > 0.01) {
if (_combined_peak < 0.01) {
_combined_peak = 0.01;
}
}
} else { } else {
val += 1.0 / bufs.get_midi(n).capacity(); val += 1.0 / bufs.get_midi(n).capacity();
if (val > 1.0) { if (val > 1.0) {
@ -134,6 +140,7 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
} else { } else {
_peak_buffer[n] = compute_peak (bufs.get_audio(i).data(), nframes, _peak_buffer[n]); _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 _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) { if (do_reset_max) {
@ -310,6 +317,7 @@ PeakMeter::set_max_channels (const ChanCount& chn)
float float
PeakMeter::meter_level(uint32_t n, MeterType type) { PeakMeter::meter_level(uint32_t n, MeterType type) {
float mcptmp;
switch (type) { switch (type) {
case MeterKrms: case MeterKrms:
case MeterK20: case MeterK20:
@ -354,6 +362,10 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
return _peak_power[n]; return _peak_power[n];
} }
break; break;
case MeterMCP:
mcptmp = _combined_peak;
_combined_peak = 0;
return accurate_coefficient_to_dB(mcptmp);
case MeterMaxSignal: case MeterMaxSignal:
assert(0); assert(0);
break; break;

View file

@ -719,7 +719,7 @@ void
Strip::update_meter () Strip::update_meter ()
{ {
if (_meter && _transport_is_rolling && _metering_active) { 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); _meter->send_update (*_surface, dB);
} }
} }