From b90b0d462921973c88952ca82f8d3dbc53e046df Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 24 Aug 2016 00:54:45 +0200 Subject: [PATCH] Make the compression meters work. 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 | 14 +++++++++++--- audio_mixer.h | 1 + lrameter.cpp | 4 ++-- mainwindow.cpp | 8 ++++++++ vu_common.cpp | 5 +++-- vu_common.h | 2 +- vumeter.cpp | 21 +++++++++++++++------ vumeter.h | 7 +++++++ 8 files changed, 48 insertions(+), 14 deletions(-) diff --git a/audio_mixer.cpp b/audio_mixer.cpp index 40470f3..8d09ad3 100644 --- a/audio_mixer.cpp +++ b/audio_mixer.cpp @@ -557,9 +557,17 @@ void AudioMixer::send_audio_level_callback() vector 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 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, diff --git a/audio_mixer.h b/audio_mixer.h index dbc3309..5a3f2af 100644 --- a/audio_mixer.h +++ b/audio_mixer.h @@ -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::functionpalette().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); } diff --git a/mainwindow.cpp b/mainwindow.cpp index 573cc0e..09dcaba 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -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, vectorvu_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); diff --git a/vu_common.cpp b/vu_common.cpp index 38aba4c..87254da 100644 --- a/vu_common.cpp +++ b/vu_common.cpp @@ -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)); } } diff --git a/vu_common.h b/vu_common.h index f065fcf..c5b1ac0 100644 --- a/vu_common.h +++ b/vu_common.h @@ -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) diff --git a/vumeter.cpp b/vumeter.cpp index c7f8df4..08ac1da 100644 --- a/vumeter.cpp +++ b/vumeter.cpp @@ -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); } diff --git a/vumeter.h b/vumeter.h index 341f60f..9322997 100644 --- 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; }; -- 2.39.2