]> git.sesse.net Git - nageru/blobdiff - mainwindow.cpp
Write 1.4.0 changelog.
[nageru] / mainwindow.cpp
index ec13cd741c4730ee82cf983ec7ed74d9df8ee00a..36ea55ee3f8883fbe4e97fa484570bc26e70e8ee 100644 (file)
@@ -1,42 +1,70 @@
 #include "mainwindow.h"
 
-#include <math.h>
-#include <stdio.h>
+#include <assert.h>
 #include <signal.h>
-#include <algorithm>
-#include <chrono>
-#include <string>
-#include <vector>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <QAbstractButton>
+#include <QAbstractSlider>
+#include <QAction>
+#include <QActionGroup>
+#include <QApplication>
 #include <QBoxLayout>
+#include <QCheckBox>
+#include <QDial>
+#include <QDialog>
+#include <QEvent>
+#include <QFlags>
+#include <QFrame>
+#include <QImage>
 #include <QInputDialog>
 #include <QKeySequence>
 #include <QLabel>
+#include <QLayoutItem>
+#include <QMenuBar>
 #include <QMessageBox>
-#include <QMetaType>
+#include <QMouseEvent>
+#include <QObject>
 #include <QPushButton>
-#include <QResizeEvent>
+#include <QRect>
+#include <QRgb>
 #include <QShortcut>
-#include <QSize>
-#include <QString>
+#include <QStackedWidget>
+#include <QToolButton>
+#include <QWidget>
+#include <algorithm>
+#include <chrono>
+#include <cmath>
+#include <functional>
+#include <limits>
+#include <memory>
+#include <ratio>
+#include <string>
+#include <vector>
 
 #include "aboutdialog.h"
+#include "alsa_pool.h"
+#include "clickable_label.h"
+#include "correlation_meter.h"
 #include "disk_space_estimator.h"
+#include "ellipsis_label.h"
 #include "flags.h"
 #include "glwidget.h"
+#include "input_mapping.h"
 #include "input_mapping_dialog.h"
 #include "lrameter.h"
 #include "midi_mapping.pb.h"
 #include "midi_mapping_dialog.h"
 #include "mixer.h"
+#include "nonlinear_fader.h"
 #include "post_to_main_thread.h"
-#include "ui_audio_miniview.h"
 #include "ui_audio_expanded_view.h"
+#include "ui_audio_miniview.h"
 #include "ui_display.h"
 #include "ui_mainwindow.h"
 #include "vumeter.h"
 
-class QResizeEvent;
-
 using namespace std;
 using namespace std::chrono;
 using namespace std::placeholders;
@@ -221,6 +249,8 @@ MainWindow::MainWindow()
                }
                midi_mapper.set_midi_mapping(midi_mapping);
        }
+       midi_mapper.refresh_highlights();
+       midi_mapper.refresh_lights();
        midi_mapper.start_thread();
 }
 
@@ -328,6 +358,10 @@ void MainWindow::mixer_created(Mixer *mixer)
                midi_mapper.refresh_lights();
        });
        connect(ui->reset_meters_button, &QPushButton::clicked, this, &MainWindow::reset_meters_button_clicked);
+       // Even though we have a reset button right next to it, the fact that
+       // the expanded audio view labels are clickable makes it natural to
+       // click this one as well.
+       connect(ui->peak_display, &ClickableLabel::clicked, this, &MainWindow::reset_meters_button_clicked);
        mixer->get_audio_mixer()->set_audio_level_callback(bind(&MainWindow::audio_level_callback, this, _1, _2, _3, _4, _5, _6, _7, _8));
 
        midi_mapper.refresh_highlights();
@@ -448,6 +482,9 @@ void MainWindow::setup_audio_expanded_view()
                update_eq_label(bus_index, EQ_BAND_MID, global_audio_mixer->get_eq(bus_index, EQ_BAND_MID));
                update_eq_label(bus_index, EQ_BAND_BASS, global_audio_mixer->get_eq(bus_index, EQ_BAND_BASS));
                ui_audio_expanded_view->fader->setDbValue(global_audio_mixer->get_fader_volume(bus_index));
+               ui_audio_expanded_view->mute_button->setChecked(global_audio_mixer->get_mute(bus_index) ? Qt::Checked : Qt::Unchecked);
+               connect(ui_audio_expanded_view->mute_button, &QPushButton::toggled,
+                       bind(&MainWindow::mute_button_toggled, this, bus_index, _1));
                ui->buses->addWidget(channel);
 
                ui_audio_expanded_view->locut_enabled->setChecked(global_audio_mixer->get_locut_enabled(bus_index));
@@ -492,13 +529,6 @@ void MainWindow::setup_audio_expanded_view()
                                global_audio_mixer->reset_peak(bus_index);
                                midi_mapper.refresh_lights();
                        });
-
-               // 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);
        }
 
        update_cutoff_labels(global_audio_mixer->get_locut_cutoff());
@@ -729,6 +759,12 @@ void MainWindow::mini_fader_changed(int bus, double volume_db)
        global_audio_mixer->set_fader_volume(bus, volume_db);
 }
 
+void MainWindow::mute_button_toggled(int bus, bool checked)
+{
+       global_audio_mixer->set_mute(bus, checked);
+       midi_mapper.refresh_lights();
+}
+
 void MainWindow::reset_meters_button_clicked()
 {
        global_audio_mixer->reset_meters();
@@ -774,7 +810,7 @@ void MainWindow::audio_level_callback(float level_lufs, float peak_db, vector<Au
                                        level.current_level_dbfs[0], level.current_level_dbfs[1]);
                                view->peak_meter->set_peak(
                                        level.peak_level_dbfs[0], level.peak_level_dbfs[1]);
-                               view->reduction_meter->set_level(level.compressor_attenuation_db);
+                               view->reduction_meter->set_reduction_db(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);
@@ -910,6 +946,11 @@ void MainWindow::set_fader(unsigned bus_idx, float value)
        set_relative_value_if_exists(bus_idx, &Ui::AudioExpandedView::fader, value);
 }
 
+void MainWindow::toggle_mute(unsigned bus_idx)
+{
+       click_button_if_exists(bus_idx, &Ui::AudioExpandedView::mute_button);
+}
+
 void MainWindow::toggle_locut(unsigned bus_idx)
 {
        click_button_if_exists(bus_idx, &Ui::AudioExpandedView::locut_enabled);
@@ -951,6 +992,7 @@ void MainWindow::clear_all_highlights()
                        highlight_gain(bus_idx, false);
                        highlight_compressor_threshold(bus_idx, false);
                        highlight_fader(bus_idx, false);
+                       highlight_mute(bus_idx, false);
                        highlight_toggle_locut(bus_idx, false);
                        highlight_toggle_auto_gain_staging(bus_idx, false);
                        highlight_toggle_compressor(bus_idx, false);
@@ -1026,6 +1068,11 @@ void MainWindow::highlight_fader(unsigned bus_idx, bool highlight)
        highlight_control_if_exists(bus_idx, &Ui::AudioExpandedView::fader, highlight);
 }
 
+void MainWindow::highlight_mute(unsigned bus_idx, bool highlight)
+{
+       highlight_control_if_exists(bus_idx, &Ui::AudioExpandedView::mute_button, highlight, /*is_mute_btton=*/true);
+}
+
 void MainWindow::highlight_toggle_locut(unsigned bus_idx, bool highlight)
 {
        highlight_control_if_exists(bus_idx, &Ui::AudioExpandedView::locut_enabled, highlight);
@@ -1105,11 +1152,32 @@ void MainWindow::highlight_control(T *control, bool highlight)
 }
 
 template<class T>
-void MainWindow::highlight_control_if_exists(unsigned bus_idx, T *(Ui_AudioExpandedView::*control), bool highlight)
+void MainWindow::highlight_mute_control(T *control, bool highlight)
+{
+       if (control == nullptr) {
+               return;
+       }
+       if (global_audio_mixer == nullptr ||
+           global_audio_mixer->get_mapping_mode() != AudioMixer::MappingMode::MULTICHANNEL) {
+               highlight = false;
+       }
+       if (highlight) {
+               control->setStyleSheet("QPushButton { background: rgb(0,255,0,80); } QPushButton:checked { background: rgba(255,80,0,140); }");
+       } else {
+               control->setStyleSheet("QPushButton:checked { background: rgba(255,0,0,80); }");
+       }
+}
+
+template<class T>
+void MainWindow::highlight_control_if_exists(unsigned bus_idx, T *(Ui_AudioExpandedView::*control), bool highlight, bool is_mute_button)
 {
-       post_to_main_thread([this, bus_idx, control, highlight]{
+       post_to_main_thread([this, bus_idx, control, highlight, is_mute_button]{
                if (bus_idx < audio_expanded_views.size()) {
-                       highlight_control(audio_expanded_views[bus_idx]->*control, highlight);
+                       if (is_mute_button) {
+                               highlight_mute_control(audio_expanded_views[bus_idx]->*control, highlight);
+                       } else {
+                               highlight_control(audio_expanded_views[bus_idx]->*control, highlight);
+                       }
                }
        });
 }