X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mainwindow.cpp;h=fec26f22fbf19544e4cf9dc921a3a002a696dbe6;hb=21bd3592c1a692463abd321047c2c612f91cc2ad;hp=4b8eb51482543b01549a36d02a19c286f14abcc4;hpb=b85c1986b7ea63534899e2eb589f9e0888d5ccda;p=nageru diff --git a/mainwindow.cpp b/mainwindow.cpp index 4b8eb51..fec26f2 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -30,6 +31,7 @@ class QResizeEvent; using namespace std; +using namespace std::chrono; using namespace std::placeholders; Q_DECLARE_METATYPE(std::string); @@ -49,6 +51,42 @@ void quit_signal(int ignored) global_mainwindow->close(); } +constexpr unsigned DB_NO_FLAGS = 0x0; +constexpr unsigned DB_WITH_SIGN = 0x1; +constexpr unsigned DB_BARE = 0x2; + +string format_db(double db, unsigned flags) +{ + string text; + if (flags & DB_WITH_SIGN) { + if (isfinite(db)) { + char buf[256]; + snprintf(buf, sizeof(buf), "%+.1f", db); + text = buf; + } else if (db < 0.0) { + text = "-∞"; + } else { + // Should never happen, really. + text = "+∞"; + } + } else { + if (isfinite(db)) { + char buf[256]; + snprintf(buf, sizeof(buf), "%.1f", db); + text = buf; + } else if (db < 0.0) { + text = "-∞"; + } else { + // Should never happen, really. + text = "∞"; + } + } + if (!(flags & DB_BARE)) { + text += " dB"; + } + return text; +} + } // namespace MainWindow::MainWindow() @@ -85,6 +123,8 @@ MainWindow::MainWindow() qRegisterMetaType>("std::vector"); connect(ui->me_live, &GLWidget::transition_names_updated, this, &MainWindow::set_transition_names); qRegisterMetaType("Mixer::Output"); + + last_audio_level_callback = steady_clock::now() - seconds(1); } void MainWindow::resizeEvent(QResizeEvent* event) @@ -129,17 +169,18 @@ void MainWindow::mixer_created(Mixer *mixer) } // TODO: Fetch all of the values these for completeness, - // not just the enable knobs implied by --flat-audio. + // not just the enable knobs implied by flags. ui->locut_enabled->setChecked(global_mixer->get_locut_enabled()); + ui->gainstaging_knob->setValue(global_mixer->get_gain_staging_db()); ui->gainstaging_auto_checkbox->setChecked(global_mixer->get_gain_staging_auto()); - ui->limiter_enabled->setChecked(global_mixer->get_limiter_enabled()); ui->compressor_enabled->setChecked(global_mixer->get_compressor_enabled()); + ui->limiter_enabled->setChecked(global_mixer->get_limiter_enabled()); + ui->makeup_gain_auto_checkbox->setChecked(global_mixer->get_final_makeup_gain_auto()); - char buf[256]; - snprintf(buf, sizeof(buf), "%.1f dB", mixer->get_limiter_threshold_dbfs()); - ui->limiter_threshold_db_display->setText(buf); - snprintf(buf, sizeof(buf), "%.1f dB", mixer->get_compressor_threshold_dbfs()); - ui->compressor_threshold_db_display->setText(buf); + ui->limiter_threshold_db_display->setText( + QString::fromStdString(format_db(mixer->get_limiter_threshold_dbfs(), DB_WITH_SIGN))); + ui->compressor_threshold_db_display->setText( + QString::fromStdString(format_db(mixer->get_compressor_threshold_dbfs(), DB_WITH_SIGN))); connect(ui->locut_cutoff_knob, &QDial::valueChanged, this, &MainWindow::cutoff_knob_changed); cutoff_knob_changed(ui->locut_cutoff_knob->value()); @@ -250,26 +291,22 @@ void MainWindow::limiter_threshold_knob_changed(int value) { float threshold_dbfs = value * 0.1f; global_mixer->set_limiter_threshold_dbfs(threshold_dbfs); - - char buf[256]; - snprintf(buf, sizeof(buf), "%.1f dB", threshold_dbfs); - ui->limiter_threshold_db_display->setText(buf); + ui->limiter_threshold_db_display->setText( + QString::fromStdString(format_db(threshold_dbfs, DB_WITH_SIGN))); } void MainWindow::compressor_threshold_knob_changed(int value) { float threshold_dbfs = value * 0.1f; global_mixer->set_compressor_threshold_dbfs(threshold_dbfs); - - char buf[256]; - snprintf(buf, sizeof(buf), "%.1f dB", threshold_dbfs); - ui->compressor_threshold_db_display->setText(buf); + ui->compressor_threshold_db_display->setText( + QString::fromStdString(format_db(threshold_dbfs, DB_WITH_SIGN))); } void MainWindow::reset_meters_button_clicked() { global_mixer->reset_meters(); - ui->peak_display->setText("-inf"); + ui->peak_display->setText(QString::fromStdString(format_db(-HUGE_VAL, DB_WITH_SIGN | DB_BARE))); ui->peak_display->setStyleSheet(""); } @@ -278,13 +315,11 @@ void MainWindow::audio_level_callback(float level_lufs, float peak_db, float glo float gain_staging_db, float final_makeup_gain_db, float correlation) { - timeval now; - gettimeofday(&now, nullptr); + steady_clock::time_point now = steady_clock::now(); // The meters are somewhat inefficient to update. Only update them // every 100 ms or so (we get updates every 5–20 ms). - double last_update_age = now.tv_sec - last_audio_level_callback.tv_sec + - 1e-6 * (now.tv_usec - last_audio_level_callback.tv_usec); + double last_update_age = duration(now - last_audio_level_callback).count(); if (last_update_age < 0.100) { return; } @@ -295,9 +330,7 @@ void MainWindow::audio_level_callback(float level_lufs, float peak_db, float glo ui->lra_meter->set_levels(global_level_lufs, range_low_lufs, range_high_lufs); ui->correlation_meter->set_correlation(correlation); - char buf[256]; - snprintf(buf, sizeof(buf), "%.1f", peak_db); - ui->peak_display->setText(buf); + ui->peak_display->setText(QString::fromStdString(format_db(peak_db, DB_BARE))); if (peak_db > -0.1f) { // -0.1 dBFS is EBU peak limit. ui->peak_display->setStyleSheet("QLabel { background-color: red; color: white; }"); } else { @@ -307,14 +340,14 @@ void MainWindow::audio_level_callback(float level_lufs, float peak_db, float glo ui->gainstaging_knob->blockSignals(true); ui->gainstaging_knob->setValue(lrintf(gain_staging_db * 10.0f)); ui->gainstaging_knob->blockSignals(false); - snprintf(buf, sizeof(buf), "%+.1f dB", gain_staging_db); - ui->gainstaging_db_display->setText(buf); + ui->gainstaging_db_display->setText( + QString::fromStdString(format_db(gain_staging_db, DB_WITH_SIGN))); ui->makeup_gain_knob->blockSignals(true); ui->makeup_gain_knob->setValue(lrintf(final_makeup_gain_db * 10.0f)); ui->makeup_gain_knob->blockSignals(false); - snprintf(buf, sizeof(buf), "%+.1f dB", final_makeup_gain_db); - ui->makeup_gain_db_display->setText(buf); + ui->makeup_gain_db_display->setText( + QString::fromStdString(format_db(final_makeup_gain_db, DB_WITH_SIGN))); }); }