Fix Mackie control metering (fixes #6608).
This commit is contained in:
parent
7f86418340
commit
239da0efb5
|
@ -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;
|
||||
|
|
|
@ -192,7 +192,8 @@ namespace ARDOUR {
|
|||
MeterIEC2EBU = 0x0200,
|
||||
MeterVU = 0x0400,
|
||||
MeterK12 = 0x0800,
|
||||
MeterPeak0dB = 0x1000
|
||||
MeterPeak0dB = 0x1000,
|
||||
MeterMCP = 0x2000
|
||||
};
|
||||
|
||||
enum TrackMode {
|
||||
|
|
|
@ -192,6 +192,7 @@ setup_enum_writer ()
|
|||
REGISTER_ENUM (MeterIEC2EBU);
|
||||
REGISTER_ENUM (MeterVU);
|
||||
REGISTER_ENUM (MeterPeak0dB);
|
||||
REGISTER_ENUM (MeterMCP);
|
||||
REGISTER (_MeterType);
|
||||
|
||||
REGISTER_ENUM (Normal);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user