summaryrefslogtreecommitdiff
path: root/libs/ardour/meter.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2013-07-15 15:00:22 +0200
committerRobin Gareus <robin@gareus.org>2013-07-15 15:04:36 +0200
commit80aa2574819e947668092c660d767e25a661c6f1 (patch)
tree04267e2361d995787f0ccdd0e544264788517fff /libs/ardour/meter.cc
parent9b1d7fd2f7c9167d9d7b7aa3115497ab65747877 (diff)
add VU and IEC meter DSP (from jmeters)
Diffstat (limited to 'libs/ardour/meter.cc')
-rw-r--r--libs/ardour/meter.cc93
1 files changed, 82 insertions, 11 deletions
diff --git a/libs/ardour/meter.cc b/libs/ardour/meter.cc
index f239a1c4b7..383a5bdfad 100644
--- a/libs/ardour/meter.cc
+++ b/libs/ardour/meter.cc
@@ -40,13 +40,22 @@ PeakMeter::PeakMeter (Session& s, const std::string& name)
: Processor (s, string_compose ("meter-%1", name))
{
Kmeterdsp::init(s.nominal_frame_rate());
+ Iec1ppmdsp::init(s.nominal_frame_rate());
+ Iec2ppmdsp::init(s.nominal_frame_rate());
+ Vumeterdsp::init(s.nominal_frame_rate());
}
PeakMeter::~PeakMeter ()
{
while (_kmeter.size() > 0) {
delete (_kmeter.back());
+ delete (_iec1meter.back());
+ delete (_iec2meter.back());
+ delete (_vumeter.back());
_kmeter.pop_back();
+ _iec1meter.pop_back();
+ _iec2meter.pop_back();
+ _vumeter.pop_back();
}
}
@@ -100,6 +109,15 @@ PeakMeter::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_fr
if (_meter_type & MeterKrms) {
_kmeter[i]->process(bufs.get_audio(i).data(), nframes);
}
+ if (_meter_type & MeterIEC1) {
+ _iec1meter[i]->process(bufs.get_audio(i).data(), nframes);
+ }
+ if (_meter_type & MeterIEC2) {
+ _iec2meter[i]->process(bufs.get_audio(i).data(), nframes);
+ }
+ if (_meter_type & MeterVU) {
+ _vumeter[i]->process(bufs.get_audio(i).data(), nframes);
+ }
}
// Zero any excess peaks
@@ -167,6 +185,9 @@ PeakMeter::reflect_inputs (const ChanCount& in)
for (size_t n = 0; n < n_audio; ++n) {
_kmeter[n]->reset();
+ _iec1meter[n]->reset();
+ _iec2meter[n]->reset();
+ _vumeter[n]->reset();
}
reset_max();
@@ -202,12 +223,24 @@ PeakMeter::reset_max_channels (const ChanCount& chn)
/* alloc/free other audio-only meter types. */
while (_kmeter.size() > n_audio) {
delete (_kmeter.back());
+ delete (_iec1meter.back());
+ delete (_iec2meter.back());
+ delete (_vumeter.back());
_kmeter.pop_back();
+ _iec1meter.pop_back();
+ _iec2meter.pop_back();
+ _vumeter.pop_back();
}
while (_kmeter.size() < n_audio) {
_kmeter.push_back(new Kmeterdsp());
+ _iec1meter.push_back(new Iec1ppmdsp());
+ _iec2meter.push_back(new Iec2ppmdsp());
+ _vumeter.push_back(new Vumeterdsp());
}
assert(_kmeter.size() == n_audio);
+ assert(_iec1meter.size() == n_audio);
+ assert(_iec2meter.size() == n_audio);
+ assert(_vumeter.size() == n_audio);
}
/** To be driven by the Meter signal from IO.
@@ -279,32 +312,51 @@ PeakMeter::meter_level(uint32_t n, MeterType type) {
switch (type) {
case MeterKrms:
{
- const uint32_t n_midi = current_meters.n_midi();
+ const uint32_t n_midi = current_meters.n_midi();
if ((n - n_midi) < _kmeter.size() && (n - n_midi) >= 0) {
-#if 0
- return fast_coefficient_to_dB (_kmeter[n-n_midi]->read());
-#else
- return accurate_coefficient_to_dB (_kmeter[n-n_midi]->read());
-#endif
+ return accurate_coefficient_to_dB (_kmeter[n - n_midi]->read());
+ }
+ }
+ break;
+ case MeterIEC1:
+ {
+ const uint32_t n_midi = current_meters.n_midi();
+ if ((n - n_midi) < _iec1meter.size() && (n - n_midi) >= 0) {
+ return accurate_coefficient_to_dB (_iec1meter[n - n_midi]->read());
+ }
+ }
+ break;
+ case MeterIEC2:
+ {
+ const uint32_t n_midi = current_meters.n_midi();
+ if ((n - n_midi) < _iec2meter.size() && (n - n_midi) >= 0) {
+ return accurate_coefficient_to_dB (_iec2meter[n - n_midi]->read());
}
- return minus_infinity();
}
+ break;
+ case MeterVU:
+ {
+ const uint32_t n_midi = current_meters.n_midi();
+ if ((n - n_midi) < _vumeter.size() && (n - n_midi) >= 0) {
+ return accurate_coefficient_to_dB (_vumeter[n - n_midi]->read());
+ }
+ }
+ break;
case MeterPeak:
return peak_power(n);
case MeterMaxSignal:
if (n < _max_peak_signal.size()) {
return _max_peak_signal[n];
- } else {
- return minus_infinity();
}
+ break;
default:
case MeterMaxPeak:
if (n < _max_peak_power.size()) {
return _max_peak_power[n];
- } else {
- return minus_infinity();
}
+ break;
}
+ return minus_infinity();
}
void
@@ -322,6 +374,25 @@ PeakMeter::set_type(MeterType t)
_kmeter[n]->reset();
}
}
+ if (t & MeterIEC1) {
+ const size_t n_audio = current_meters.n_audio();
+ for (size_t n = 0; n < n_audio; ++n) {
+ _iec1meter[n]->reset();
+ }
+ }
+ if (t & MeterIEC2) {
+ const size_t n_audio = current_meters.n_audio();
+ for (size_t n = 0; n < n_audio; ++n) {
+ _iec2meter[n]->reset();
+ }
+ }
+ if (t & MeterVU) {
+ const size_t n_audio = current_meters.n_audio();
+ for (size_t n = 0; n < n_audio; ++n) {
+ _vumeter[n]->reset();
+ }
+ }
+
TypeChanged(t);
}