fix merge conflict from master
[ardour.git] / libs / ardour / ardour / meter.h
1 /*
2     Copyright (C) 2006 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify it
5     under the terms of the GNU General Public License as published by the Free
6     Software Foundation; either version 2 of the License, or (at your option)
7     any later version.
8
9     This program is distributed in the hope that it will be useful, but WITHOUT
10     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12     for more details.
13
14     You should have received a copy of the GNU General Public License along
15     with this program; if not, write to the Free Software Foundation, Inc.,
16     675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #ifndef __ardour_meter_h__
20 #define __ardour_meter_h__
21
22 #include <vector>
23 #include "ardour/types.h"
24 #include "ardour/processor.h"
25 #include "pbd/fastlog.h"
26
27 #include "ardour/kmeterdsp.h"
28 #include "ardour/iec1ppmdsp.h"
29 #include "ardour/iec2ppmdsp.h"
30 #include "ardour/vumeterdsp.h"
31
32 namespace ARDOUR {
33
34 class BufferSet;
35 class ChanCount;
36 class Session;
37
38 class Metering {
39   public:
40         static void               update_meters ();
41         static PBD::Signal0<void> Meter;
42
43   private:
44         /* this object is not meant to be instantiated */
45         Metering();
46 };
47
48 /** Meters peaks on the input and stores them for access.
49  */
50 class PeakMeter : public Processor {
51 public:
52         PeakMeter(Session& s, const std::string& name);
53         ~PeakMeter();
54
55         void meter();
56         void reset ();
57         void reset_max ();
58
59         bool can_support_io_configuration (const ChanCount& in, ChanCount& out) const;
60         bool configure_io (ChanCount in, ChanCount out);
61
62         /* special method for meter, to ensure that it can always handle the maximum
63            number of streams in the route, no matter where we put it.
64         */
65
66         void reset_max_channels (const ChanCount&);
67
68         /* tell the meter than no matter how many channels it can handle,
69            `in' is the number it is actually going be handling from
70            now on.
71         */
72
73         void reflect_inputs (const ChanCount& in);
74
75         /** Compute peaks */
76         void run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool);
77
78         void activate ()   { }
79         void deactivate () { }
80
81         ChanCount input_streams () const { return current_meters; }
82         ChanCount output_streams () const { return current_meters; }
83
84         float peak_power (uint32_t n) {
85                 if (n < _visible_peak_power.size()) {
86                         return _visible_peak_power[n];
87                 } else {
88                         return minus_infinity();
89                 }
90         }
91
92         float meter_level (uint32_t n, MeterType type);
93
94         void set_type(MeterType t);
95         MeterType get_type() { return _meter_type; }
96
97         XMLNode& state (bool full);
98
99         PBD::Signal1<void, MeterType> TypeChanged;
100
101 private:
102         friend class IO;
103
104         /** The number of meters that we are currently handling;
105          *  may be different to _configured_input and _configured_output
106          *  as it can be altered outside a ::configure_io by ::reflect_inputs.
107          */
108         ChanCount current_meters;
109
110         std::vector<float> _peak_signal;
111         std::vector<float> _visible_peak_power;
112         std::vector<float> _max_peak_signal;
113         std::vector<float> _max_peak_power;
114
115         std::vector<Kmeterdsp *> _kmeter;
116         std::vector<Iec1ppmdsp *> _iec1meter;
117         std::vector<Iec2ppmdsp *> _iec2meter;
118         std::vector<Vumeterdsp *> _vumeter;
119
120         MeterType _meter_type;
121 };
122
123 } // namespace ARDOUR
124
125 #endif // __ardour_meter_h__