projects
/
ardour.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Oh boy!
[ardour.git]
/
libs
/
ardour
/
meter.cc
diff --git
a/libs/ardour/meter.cc
b/libs/ardour/meter.cc
index 8de49140962f3b9de99e54b665cd6530d4c84e76..289ce579db00e368d1c99403a61d4b80a7b0d281 100644
(file)
--- 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;
_reset_dpm = true;
_reset_max = true;
_bufcnt = 0;
+ _combined_peak = 0;
}
PeakMeter::~PeakMeter ()
}
PeakMeter::~PeakMeter ()
@@
-77,7
+78,7
@@
PeakMeter::~PeakMeter ()
* (runs in jack realtime context)
*/
void
* (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, framepos_t /*start_frame*/, framepos_t /*end_frame*/,
double /*speed*/,
pframes_t nframes, bool)
{
if (!_active && !_pending_active) {
return;
{
if (!_active && !_pending_active) {
return;
@@
-86,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;
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";
// cerr << "meter " << name() << " runs with " << bufs.available() << " inputs\n";
@@
-102,14
+104,19
@@
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 (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) {
for (MidiBuffer::const_iterator e = buf.begin(); e != buf.end(); ++e) {
- const Evoral::
MIDI
Event<framepos_t> ev(*e, false);
+ const Evoral::Event<framepos_t> 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 (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) {
} else {
val += 1.0 / bufs.get_midi(n).capacity();
if (val > 1.0) {
@@
-130,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()) {
// 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]);
} 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
_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) {
@@
-228,14
+237,23
@@
PeakMeter::can_support_io_configuration (const ChanCount& in, ChanCount& out)
bool
PeakMeter::configure_io (ChanCount in, ChanCount out)
{
bool
PeakMeter::configure_io (ChanCount in, ChanCount out)
{
+ bool changed = false;
if (out != in) { // always 1:1
return false;
}
if (out != in) { // always 1:1
return false;
}
+ if (current_meters != in) {
+ changed = true;
+ }
+
current_meters = in;
set_max_channels (in);
current_meters = in;
set_max_channels (in);
+ if (changed) {
+ reset_max();
+ }
+
return Processor::configure_io (in, out);
}
return Processor::configure_io (in, out);
}
@@
-310,6
+328,7
@@
PeakMeter::set_max_channels (const ChanCount& chn)
float
PeakMeter::meter_level(uint32_t n, MeterType type) {
float
PeakMeter::meter_level(uint32_t n, MeterType type) {
+ float mcptmp;
switch (type) {
case MeterKrms:
case MeterK20:
switch (type) {
case MeterKrms:
case MeterK20:
@@
-354,6
+373,9
@@
PeakMeter::meter_level(uint32_t n, MeterType type) {
return _peak_power[n];
}
break;
return _peak_power[n];
}
break;
+ case MeterMCP:
+ mcptmp = _combined_peak;
+ return accurate_coefficient_to_dB(mcptmp);
case MeterMaxSignal:
assert(0);
break;
case MeterMaxSignal:
assert(0);
break;