]> git.sesse.net Git - nageru/blob - vumeter.h
Replace the R128 meters for each channel with a digital peak meter.
[nageru] / vumeter.h
1 #ifndef VUMETER_H
2 #define VUMETER_H
3
4 #include <math.h>
5 #include <QLabel>
6 #include <QPaintEvent>
7 #include <QWidget>
8 #include <mutex>
9
10 #include "vu_common.h"
11
12 class VUMeter : public QWidget
13 {
14         Q_OBJECT
15
16 public:
17         VUMeter(QWidget *parent);
18
19         void set_level(float level_lufs) {
20                 set_level(level_lufs, level_lufs);
21         }
22
23         void set_level(float level_lufs_left, float level_lufs_right) {
24                 std::unique_lock<std::mutex> lock(level_mutex);
25                 this->level_lufs[0] = level_lufs_left;
26                 this->level_lufs[1] = level_lufs_right;
27                 QMetaObject::invokeMethod(this, "update", Qt::AutoConnection);
28         }
29
30         void set_peak(float peak_lufs) {
31                 set_peak(peak_lufs, peak_lufs);
32         }
33
34         void set_peak(float peak_lufs_left, float peak_lufs_right) {
35                 std::unique_lock<std::mutex> lock(level_mutex);
36                 this->peak_lufs[0] = peak_lufs_left;
37                 this->peak_lufs[1] = peak_lufs_right;
38                 QMetaObject::invokeMethod(this, "update", Qt::AutoConnection);
39         }
40
41         double lufs_to_pos(float level_lu, int height)
42         {
43                 return ::lufs_to_pos(level_lu, height, min_level, max_level);
44         }
45
46         void set_min_level(float min_level)
47         {
48                 this->min_level = min_level;
49                 recalculate_pixmaps();
50         }
51
52         void set_max_level(float max_level)
53         {
54                 this->max_level = max_level;
55                 recalculate_pixmaps();
56         }
57
58         void set_ref_level(float ref_level_lufs)
59         {
60                 this->ref_level_lufs = ref_level_lufs;
61         }
62
63         void set_flip(bool flip)
64         {
65                 this->flip = flip;
66                 recalculate_pixmaps();
67         }
68
69 private:
70         void resizeEvent(QResizeEvent *event) override;
71         void paintEvent(QPaintEvent *event) override;
72         void recalculate_pixmaps();
73
74         std::mutex level_mutex;
75         float level_lufs[2] { -HUGE_VALF, -HUGE_VALF };
76         float peak_lufs[2] { -HUGE_VALF, -HUGE_VALF };
77         float min_level = -18.0f, max_level = 9.0f, ref_level_lufs = -23.0f;
78         bool flip = false;
79
80         QPixmap full_on_pixmap, on_pixmap, off_pixmap;
81 };
82
83 #endif