summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/meter.h
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-05-02 02:36:53 +0200
committerRobin Gareus <robin@gareus.org>2015-05-02 03:46:49 +0200
commitce259edbcdd4c9a2cd8f2a5daa8b158dd9afc928 (patch)
tree03bfcd5b12a088b1ea941fadd1b4879699b81a07 /libs/ardour/ardour/meter.h
parent2f432c3be779eb2e8b1915703746853781e0e8a2 (diff)
professionalize peak-meters
The peak meter needs to withstand various test-signals without visual jitter (in particular 1kHz sine) regardless of settings (period-size, sample-rate, custom fall-off). This needs to be done in sync (and not by a random non-rt ‘smoothing’ thread). On the downside this voids the ‘visual smoothing’ particularly with large buffersizes - but then again exactly this “always fall-off no matter what [the next real data will be]” is the problem. One the upside, there’s one less high-frequency (100Hz) thread (Yay!) PS. it probably never worked on windows, anyway. Only peak-meters are affected by his change. K-meters, IEC I/II and VU were never visually smoothed.
Diffstat (limited to 'libs/ardour/ardour/meter.h')
-rw-r--r--libs/ardour/ardour/meter.h32
1 files changed, 8 insertions, 24 deletions
diff --git a/libs/ardour/ardour/meter.h b/libs/ardour/ardour/meter.h
index d34d5b3710..7539db2140 100644
--- a/libs/ardour/ardour/meter.h
+++ b/libs/ardour/ardour/meter.h
@@ -36,16 +36,6 @@ class BufferSet;
class ChanCount;
class Session;
-class LIBARDOUR_API Metering {
- public:
- static void update_meters ();
- static PBD::Signal0<void> Meter;
-
- private:
- /* this object is not meant to be instantiated */
- Metering();
-};
-
/** Meters peaks on the input and stores them for access.
*/
class LIBARDOUR_API PeakMeter : public Processor {
@@ -53,7 +43,6 @@ public:
PeakMeter(Session& s, const std::string& name);
~PeakMeter();
- void meter();
void reset ();
void reset_max ();
@@ -64,7 +53,7 @@ public:
number of streams in the route, no matter where we put it.
*/
- void reset_max_channels (const ChanCount&);
+ void set_max_channels (const ChanCount&);
/* tell the meter than no matter how many channels it can handle,
`in' is the number it is actually going be handling from
@@ -83,14 +72,6 @@ public:
ChanCount input_streams () const { return current_meters; }
ChanCount output_streams () const { return current_meters; }
- float peak_power (uint32_t n) {
- if (n < _visible_peak_power.size()) {
- return _visible_peak_power[n];
- } else {
- return minus_infinity();
- }
- }
-
float meter_level (uint32_t n, MeterType type);
void set_type(MeterType t);
@@ -109,10 +90,13 @@ private:
*/
ChanCount current_meters;
- std::vector<float> _peak_signal;
- std::vector<float> _visible_peak_power;
- std::vector<float> _max_peak_signal;
- std::vector<float> _max_peak_power;
+ bool _reset_dpm;
+ bool _reset_max;
+
+ uint32_t _bufcnt;
+ 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
std::vector<Kmeterdsp *> _kmeter;
std::vector<Iec1ppmdsp *> _iec1meter;