summaryrefslogtreecommitdiff
path: root/libs/ardour/meter.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2013-07-22 18:42:01 +0200
committerRobin Gareus <robin@gareus.org>2013-07-22 18:42:01 +0200
commit72aa1cd86cf04964f08e7ca0557f73afd1c96e83 (patch)
treec9f59e03d54bd2ca4f15fe6bc94a06e918df4e6e /libs/ardour/meter.cc
parente294e78fefe77897a9a014d7b84d436a9aff6f9b (diff)
Revert "Revert new meter types (postponed until after 3.3 release)"
This reverts commit d80f672e8487f459d76ab291958bffcded08f0fd.
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 961a489a63..3ca19afe76 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
@@ -119,6 +137,9 @@ PeakMeter::reset ()
for (size_t n = 0; n < _kmeter.size(); ++n) {
_kmeter[n]->reset();
+ _iec1meter[n]->reset();
+ _iec2meter[n]->reset();
+ _vumeter[n]->reset();
}
}
@@ -212,12 +233,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);
reset();
reset_max();
@@ -292,32 +325,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
@@ -335,6 +387,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);
}