From c945fee527462bde9add00a267c0af4f0b6c2d5e Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 1 May 2018 10:36:14 +0200 Subject: [PATCH] If the channel is mono anyway (same source for left and right), don't bother applying stereo width, and don't enable it in the UI. --- audio_mixer.cpp | 19 ++++++++++++++++++- audio_mixer.h | 2 ++ mainwindow.cpp | 29 ++++++++++++++++++++++++----- mainwindow.h | 1 + 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/audio_mixer.cpp b/audio_mixer.cpp index 6f6190a..9e7dd59 100644 --- a/audio_mixer.cpp +++ b/audio_mixer.cpp @@ -453,7 +453,10 @@ void AudioMixer::fill_audio_bus(const map> &samples_ca // L' = R - D // R' = L + D float w = 0.5f * stereo_width + 0.5f; - if (fabs(w) < 1e-3) { + if (bus.source_channel[0] == bus.source_channel[1]) { + // Mono anyway, so no need to bother. + w = 1.0f; + } else if (fabs(w) < 1e-3) { // Perfect inverse. swap(lsrc, rsrc); swap(lstride, rstride); @@ -1175,4 +1178,18 @@ void AudioMixer::reset_peak(unsigned bus_index) } } +bool AudioMixer::is_mono(unsigned bus_index) +{ + lock_guard lock(audio_mutex); + const InputMapping::Bus &bus = input_mapping.buses[bus_index]; + if (bus.device.type == InputSourceType::SILENCE) { + return true; + } else { + assert(bus.device.type == InputSourceType::CAPTURE_CARD || + bus.device.type == InputSourceType::ALSA_INPUT || + bus.device.type == InputSourceType::FFMPEG_VIDEO_INPUT); + return bus.source_channel[0] == bus.source_channel[1]; + } +} + AudioMixer *global_audio_mixer = nullptr; diff --git a/audio_mixer.h b/audio_mixer.h index 919cef0..9793646 100644 --- a/audio_mixer.h +++ b/audio_mixer.h @@ -142,6 +142,8 @@ public: return locut_enabled[bus]; } + bool is_mono(unsigned bus_index); + void set_stereo_width(unsigned bus_index, float width) { stereo_width[bus_index] = width; diff --git a/mainwindow.cpp b/mainwindow.cpp index ead7a87..b20e322 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -557,7 +557,7 @@ void MainWindow::setup_audio_expanded_view() ui_audio_expanded_view->bus_desc_label->setFullText( QString::fromStdString(get_bus_desc_label(mapping.buses[bus_index]))); audio_expanded_views[bus_index] = ui_audio_expanded_view; - update_stereo_label(bus_index, lrintf(100.0f * global_audio_mixer->get_stereo_width(bus_index))); + update_stereo_knob_and_label(bus_index, lrintf(100.0f * global_audio_mixer->get_stereo_width(bus_index))); update_eq_label(bus_index, EQ_BAND_TREBLE, global_audio_mixer->get_eq(bus_index, EQ_BAND_TREBLE)); 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)); @@ -825,13 +825,32 @@ void MainWindow::eq_knob_changed(unsigned bus_index, EQBand band, int value) update_eq_label(bus_index, band, gain_db); } -void MainWindow::update_stereo_label(unsigned bus_index, int stereo_width_percent) +void MainWindow::update_stereo_knob_and_label(unsigned bus_index, int stereo_width_percent) { - char buf[256]; - snprintf(buf, sizeof(buf), "Stereo: %d%%", stereo_width_percent); + Ui::AudioExpandedView *view = audio_expanded_views[bus_index]; + + if (global_audio_mixer->is_mono(bus_index)) { + view->stereo_width_knob->setEnabled(false); + view->stereo_width_label->setEnabled(false); + } else { + view->stereo_width_knob->setEnabled(true); + view->stereo_width_label->setEnabled(true); + } + view->stereo_width_knob->setValue(stereo_width_percent); + update_stereo_label(bus_index, stereo_width_percent); +} +void MainWindow::update_stereo_label(unsigned bus_index, int stereo_width_percent) +{ Ui::AudioExpandedView *view = audio_expanded_views[bus_index]; - view->stereo_width_label->setText(buf); + + if (global_audio_mixer->is_mono(bus_index)) { + view->stereo_width_label->setText("Mono"); + } else { + char buf[256]; + snprintf(buf, sizeof(buf), "Stereo: %d%%", stereo_width_percent); + view->stereo_width_label->setText(buf); + } } void MainWindow::update_eq_label(unsigned bus_index, EQBand band, float gain_db) diff --git a/mainwindow.h b/mainwindow.h index ea0fcdf..36be4b8 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -129,6 +129,7 @@ private: bool eventFilter(QObject *watched, QEvent *event) override; void closeEvent(QCloseEvent *event) override; void update_cutoff_labels(float cutoff_hz); + void update_stereo_knob_and_label(unsigned bus_index, int stereo_width_percent); void update_stereo_label(unsigned bus_index, int stereo_width_percent); void update_eq_label(unsigned bus_index, EQBand band, float gain_db); void setup_theme_menu(); -- 2.39.2