diff options
author | Robin Gareus <robin@gareus.org> | 2013-07-22 18:42:01 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2013-07-22 18:42:01 +0200 |
commit | 72aa1cd86cf04964f08e7ca0557f73afd1c96e83 (patch) | |
tree | c9f59e03d54bd2ca4f15fe6bc94a06e918df4e6e /libs/ardour/meter.cc | |
parent | e294e78fefe77897a9a014d7b84d436a9aff6f9b (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.cc | 93 |
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); } |