]> git.sesse.net Git - nageru/commitdiff
Make the compression meters work.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 23 Aug 2016 22:54:45 +0000 (00:54 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Wed, 19 Oct 2016 22:55:44 +0000 (00:55 +0200)
It's possible that the range here needs to be nonlinear,
but we'll deal with that later; for now it's only 0..10 dB
on a linear scale.

This required VU meters that grow downwards, so add that.

audio_mixer.cpp
audio_mixer.h
lrameter.cpp
mainwindow.cpp
vu_common.cpp
vu_common.h
vumeter.cpp
vumeter.h

index 40470f3a18e70c5d43e158303f89e84960d6018e..8d09ad3bfa9a279f5d74af38613503ce835311e8 100644 (file)
@@ -557,9 +557,17 @@ void AudioMixer::send_audio_level_callback()
 
        vector<BusLevel> bus_levels;
        bus_levels.resize(input_mapping.buses.size());
-       for (unsigned bus_index = 0; bus_index < bus_r128.size(); ++bus_index) {
-               bus_levels[bus_index].loudness_lufs = bus_r128[bus_index]->loudness_S();
-               bus_levels[bus_index].gain_staging_db = gain_staging_db[bus_index];
+       {
+               lock_guard<mutex> lock(compressor_mutex);
+               for (unsigned bus_index = 0; bus_index < bus_r128.size(); ++bus_index) {
+                       bus_levels[bus_index].loudness_lufs = bus_r128[bus_index]->loudness_S();
+                       bus_levels[bus_index].gain_staging_db = gain_staging_db[bus_index];
+                       if (compressor_enabled[bus_index]) {
+                               bus_levels[bus_index].compressor_attenuation_db = -to_db(compressor[bus_index]->get_attenuation());
+                       } else {
+                               bus_levels[bus_index].compressor_attenuation_db = 0.0;
+                       }
+               }
        }
 
        audio_level_callback(loudness_s, to_db(peak), bus_levels,
index dbc33093f2086fdcd0cf7ec87e6824ade5482ad8..5a3f2af1d6532ac09ded74c31937756415d91c5c 100644 (file)
@@ -204,6 +204,7 @@ public:
        struct BusLevel {
                float loudness_lufs;
                float gain_staging_db;
+               float compressor_attenuation_db;  // A positive number; 0.0 for no attenuation.
        };
 
        typedef std::function<void(float level_lufs, float peak_db,
index ab3c5c2b925dee19e3045a940eb61e500e6a8075..d7736e3a27cbd68c77397a4beeb3fd70925789ac 100644 (file)
@@ -99,10 +99,10 @@ void LRAMeter::recalculate_pixmaps()
        on_pixmap = QPixmap(width(), height());
        QPainter on_painter(&on_pixmap);
        on_painter.fillRect(0, 0, width(), height(), parentWidget()->palette().window());
-       draw_vu_meter(on_painter, width(), height(), margin, true, min_level, max_level);
+       draw_vu_meter(on_painter, width(), height(), margin, true, min_level, max_level, /*flip=*/false);
 
        off_pixmap = QPixmap(width(), height());
        QPainter off_painter(&off_pixmap);
        off_painter.fillRect(0, 0, width(), height(), parentWidget()->palette().window());
-       draw_vu_meter(off_painter, width(), height(), margin, false, min_level, max_level);
+       draw_vu_meter(off_painter, width(), height(), margin, false, min_level, max_level, /*flip=*/false);
 }
index 573cc0e4b55a8ce4d99d1dd6da82a8e864c9d4ab..09dcaba1cc5e53e1f26ac49fa3d03ea3e14fa7ad 100644 (file)
@@ -368,6 +368,13 @@ void MainWindow::setup_audio_expanded_view()
                });
 
                slave_fader(audio_miniviews[bus_index]->fader, ui_audio_expanded_view->fader);
+
+               // Set up the compression attenuation meter.
+               VUMeter *reduction_meter = ui_audio_expanded_view->reduction_meter;
+               reduction_meter->set_min_level(0.0f);
+               reduction_meter->set_max_level(10.0f);
+               reduction_meter->set_ref_level(0.0f);
+               reduction_meter->set_flip(true);
        }
 }
 
@@ -553,6 +560,7 @@ void MainWindow::audio_level_callback(float level_lufs, float peak_db, vector<Au
 
                                Ui::AudioExpandedView *view = audio_expanded_views[bus_index];
                                view->vu_meter_meter->set_level(level.loudness_lufs);
+                               view->reduction_meter->set_level(level.compressor_attenuation_db);
                                view->gainstaging_knob->blockSignals(true);
                                view->gainstaging_knob->setValue(lrintf(level.gain_staging_db * 10.0f));
                                view->gainstaging_knob->blockSignals(false);
index 38aba4c736d02945c95db5c34af7d83b46d2e8ab..87254dae16c764a9381ecadf168dee586df6733a 100644 (file)
@@ -32,7 +32,7 @@ double lufs_to_pos(float level_lu, int height, float min_level, float max_level)
        return y;
 }
 
-void draw_vu_meter(QPainter &painter, int width, int height, int margin, bool is_on, float min_level, float max_level)
+void draw_vu_meter(QPainter &painter, int width, int height, int margin, bool is_on, float min_level, float max_level, bool flip)
 {
        painter.fillRect(margin, 0, width - 2 * margin, height, Qt::black);
 
@@ -69,6 +69,7 @@ void draw_vu_meter(QPainter &painter, int width, int height, int margin, bool is
                int r = lrintf(255 * pow(on_r * coverage, 1.0 / 2.2));
                int g = lrintf(255 * pow(on_g * coverage, 1.0 / 2.2));
                int b = lrintf(255 * pow(on_b * coverage, 1.0 / 2.2));
-               painter.fillRect(margin, y, width - 2 * margin, 1, QColor(r, g, b));
+               int draw_y = flip ? (height - y - 1) : y;
+               painter.fillRect(margin, draw_y, width - 2 * margin, 1, QColor(r, g, b));
        }
 }
index f065fcfb2b20302cfdb610223ce8c8580bb601c8..c5b1ac0d37cc51f0d48a34c8cd0f869c38d60ae0 100644 (file)
@@ -5,6 +5,6 @@
 
 double lufs_to_pos(float level_lu, int height, float min_level, float max_level);
 
-void draw_vu_meter(QPainter &painter, int width, int height, int margin, bool is_on, float min_level, float max_level);
+void draw_vu_meter(QPainter &painter, int width, int height, int margin, bool is_on, float min_level, float max_level, bool flip);
 
 #endif // !defined(_VU_COMMON_H)
index c7f8df467ab3681900205d35fdedbfe115846fbc..08ac1da684c3c479b5c58a4759fdb25e8602d51a 100644 (file)
@@ -27,20 +27,29 @@ void VUMeter::paintEvent(QPaintEvent *event)
 
        float level_lu = level_lufs - ref_level_lufs;
        int on_pos = lrint(lufs_to_pos(level_lu, height()));
-       QRect off_rect(0, 0, width(), on_pos);
-       QRect on_rect(0, on_pos, width(), height() - on_pos);
 
-       painter.drawPixmap(off_rect, off_pixmap, off_rect);
-       painter.drawPixmap(on_rect, on_pixmap, on_rect);
+       if (flip) {
+               QRect on_rect(0, 0, width(), height() - on_pos);
+               QRect off_rect(0, height() - on_pos, width(), height());
+
+               painter.drawPixmap(on_rect, on_pixmap, on_rect);
+               painter.drawPixmap(off_rect, off_pixmap, off_rect);
+       } else {
+               QRect off_rect(0, 0, width(), on_pos);
+               QRect on_rect(0, on_pos, width(), height() - on_pos);
+
+               painter.drawPixmap(off_rect, off_pixmap, off_rect);
+               painter.drawPixmap(on_rect, on_pixmap, on_rect);
+       }
 }
 
 void VUMeter::recalculate_pixmaps()
 {
        on_pixmap = QPixmap(width(), height());
        QPainter on_painter(&on_pixmap);
-       draw_vu_meter(on_painter, width(), height(), 0, true, min_level, max_level);
+       draw_vu_meter(on_painter, width(), height(), 0, true, min_level, max_level, flip);
 
        off_pixmap = QPixmap(width(), height());
        QPainter off_painter(&off_pixmap);
-       draw_vu_meter(off_painter, width(), height(), 0, false, min_level, max_level);
+       draw_vu_meter(off_painter, width(), height(), 0, false, min_level, max_level, flip);
 }
index 341f60fb3d8c4a49716f3a6c388fdccb27e58961..9322997d7435571131646145d623af5e31d6de81 100644 (file)
--- a/vumeter.h
+++ b/vumeter.h
@@ -44,6 +44,12 @@ public:
                this->ref_level_lufs = ref_level_lufs;
        }
 
+       void set_flip(bool flip)
+       {
+               this->flip = flip;
+               recalculate_pixmaps();
+       }
+
 private:
        void resizeEvent(QResizeEvent *event) override;
        void paintEvent(QPaintEvent *event) override;
@@ -52,6 +58,7 @@ private:
        std::mutex level_mutex;
        float level_lufs = -HUGE_VAL;
        float min_level = -18.0f, max_level = 9.0f, ref_level_lufs = -23.0f;
+       bool flip = false;
 
        QPixmap on_pixmap, off_pixmap;
 };