From 4908bfe1a646ce1b9687c83dd05b4a9d30471ac3 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sun, 16 Jul 2023 14:11:24 +0200 Subject: [PATCH 01/56] Scalable Setup Dialog Make the setup dialog resizable and use widgets that dynamically adjust to the font size set by the user. Current status of the tabs: * General: Done * Performance: Plugins group needs adjustments * Audio: Individual settings dialogs need adjustments * MIDI: Not started yet * Paths: Done The "Autosave" and "Buffer size" tabs have been slightly redesigned so that the revert/reset button is next to the slider. Technical details ------------------ Setting a fixed size has been removed from the setup dialog so that it can be resized. The settings widget (`settings_w`) now has a layout to which the sub dialogs are added. This is done so that the layout sizes are propagated upwards, i.e. all widgets along the chain now have a layout so that size hints are determined correctly. Instances of `TabWidget` are replaced with instances of `QGroupBox`. Each group box has a layout to which its children, e.g. check boxes, are added. These group boxes are then added to the layouts of their parents. Doing so also removes the need to count how many instances have been added and calculations on where to put the children. Instances of `LedCheckBox` are replaced with instances of `QCheckBox`. This is done in the new helper lambda `addCheckBox`. It's very similar to the previously used `addLedCheckBox` but creates a `QCheckBox` instead of a `LedCheckBox`. It returns the created `QCheckBox` as a result. If a layout is provided the created check box is also added to the layout before it is returned. The helper lambda `addPathEntry` has been adjusted to create a `QGroupBox` and to put all its children in a layout. The helper method `labelWidget` has been adjusted to not set the font size of the label. The method `TabBar::addTab` had to be extended with a new default parameter which controls if the added widget is fixed to the size of it's parent or not. In the case of the setup dialog we do not want this. So far the method is only used by the setup dialog and the `LadspaBrowser` class. So once the `LadspaBrowser` has been made resizable the default parameter can be removed again and treated as always being set to false. Add `QCheckBox` to the `style.css` so that it does not get a green font due to the palette magic that's done. --- data/themes/default/style.css | 2 +- include/SetupDialog.h | 5 +- include/TabBar.h | 7 +- src/gui/modals/SetupDialog.cpp | 250 ++++++++++++++++++--------------- src/gui/widgets/TabBar.cpp | 12 +- 5 files changed, 151 insertions(+), 125 deletions(-) diff --git a/data/themes/default/style.css b/data/themes/default/style.css index a9646cfe49a..ee5681f433b 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -3,7 +3,7 @@ ********************/ /* most foreground text items */ -QLabel, QTreeWidget, QListWidget, QGroupBox, QMenuBar { +QLabel, QTreeWidget, QListWidget, QGroupBox, QMenuBar, QCheckBox { color: #d1d8e4; } diff --git a/include/SetupDialog.h b/include/SetupDialog.h index 27a4ce4f9f8..7fa59d244c6 100644 --- a/include/SetupDialog.h +++ b/include/SetupDialog.h @@ -40,6 +40,7 @@ class QComboBox; class QLabel; class QLineEdit; class QSlider; +class QCheckBox; namespace lmms::gui @@ -155,8 +156,8 @@ private slots: bool m_enableRunningAutoSave; QSlider * m_saveIntervalSlider; QLabel * m_saveIntervalLbl; - LedCheckBox * m_autoSave; - LedCheckBox * m_runningAutoSave; + QCheckBox * m_autoSave; + QCheckBox * m_runningAutoSave; bool m_smoothScroll; bool m_animateAFP; QLabel * m_vstEmbedLbl; diff --git a/include/TabBar.h b/include/TabBar.h index fa27032873c..29c100e0c7a 100644 --- a/include/TabBar.h +++ b/include/TabBar.h @@ -49,7 +49,12 @@ class LMMS_EXPORT TabBar : public QWidget TabButton * addTab( QWidget * _w, const QString & _text, int _id, bool _add_stretch = false, - bool _text_is_tooltip = false ); + bool _text_is_tooltip = false, + // TODO Remove fixWidgetToParentSize once it is used + // with false everywhere. + // At the time of writing it is only used in + // LadspaBrowser with default parameters. + bool fixWidgetToParentSize = true ); void removeTab( int _id ); inline void setExclusive( bool _on ) diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 33505c3997d..97de349c408 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include "AudioDeviceSetupWidget.h" #include "AudioEngine.h" @@ -79,13 +81,12 @@ inline void labelWidget(QWidget * w, const QString & txt) auto title = new QLabel(txt, w); QFont f = title->font(); f.setBold(true); - title->setFont(pointSize<12>(f)); + title->setFont(f); + QBoxLayout * boxLayout = dynamic_cast(w->layout()); + assert(boxLayout); - assert(dynamic_cast(w->layout()) != nullptr); - - dynamic_cast(w->layout())->addSpacing(5); - dynamic_cast(w->layout())->addWidget(title); + boxLayout->addWidget(title); } @@ -162,7 +163,6 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : // TODO: Equivalent to the new setWindowFlag(Qt::WindowContextHelpButtonHint, false) setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setModal(true); - setFixedSize(454, 400); Engine::projectJournal()->setJournalling(false); @@ -191,7 +191,8 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : // Settings widget. auto settings_w = new QWidget(main_w); - settings_w->setFixedSize(360, 360); + + QVBoxLayout * settingsLayout = new QVBoxLayout(settings_w); // General widget. auto general_w = new QWidget(settings_w); @@ -212,6 +213,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : auto generalControlsLayout = new QVBoxLayout; generalControlsLayout->setSpacing(10); + // TODO Remove once it is not used anymore auto addLedCheckBox = [&XDelta, &YDelta, this](const QString& ledText, TabWidget* tw, int& counter, bool initialState, const char* toggledSlot, bool showRestartWarning) { auto checkBox = new LedCheckBox(ledText, tw); @@ -225,63 +227,77 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : } }; - int counter = 0; + auto addCheckBox = [this](const QString& ledText, QWidget* parent, QBoxLayout * layout, + bool initialState, const char* toggledSlot, bool showRestartWarning) -> QCheckBox * { + auto checkBox = new QCheckBox(ledText, parent); + checkBox->setChecked(initialState); + connect(checkBox, SIGNAL(toggled(bool)), this, toggledSlot); + + if (showRestartWarning) + { + connect(checkBox, SIGNAL(toggled(bool)), this, SLOT(showRestartWarning())); + } + + if (layout) + { + layout->addWidget(checkBox); + } + + return checkBox; + }; // GUI tab. - auto gui_tw = new TabWidget(tr("Graphical user interface (GUI)"), generalControls); + QGroupBox * guiGroupBox = new QGroupBox(tr("Graphical user interface (GUI)"), generalControls); + QVBoxLayout * guiGroupLayout = new QVBoxLayout(guiGroupBox); - addLedCheckBox(tr("Display volume as dBFS "), gui_tw, counter, + addCheckBox(tr("Display volume as dBFS "), guiGroupBox, guiGroupLayout, m_displaydBFS, SLOT(toggleDisplaydBFS(bool)), true); - addLedCheckBox(tr("Enable tooltips"), gui_tw, counter, + addCheckBox(tr("Enable tooltips"), guiGroupBox, guiGroupLayout, m_tooltips, SLOT(toggleTooltips(bool)), true); - addLedCheckBox(tr("Enable master oscilloscope by default"), gui_tw, counter, + addCheckBox(tr("Enable master oscilloscope by default"), guiGroupBox, guiGroupLayout, m_displayWaveform, SLOT(toggleDisplayWaveform(bool)), true); - addLedCheckBox(tr("Enable all note labels in piano roll"), gui_tw, counter, + addCheckBox(tr("Enable all note labels in piano roll"), guiGroupBox, guiGroupLayout, m_printNoteLabels, SLOT(toggleNoteLabels(bool)), false); - addLedCheckBox(tr("Enable compact track buttons"), gui_tw, counter, + addCheckBox(tr("Enable compact track buttons"), guiGroupBox, guiGroupLayout, m_compactTrackButtons, SLOT(toggleCompactTrackButtons(bool)), true); - addLedCheckBox(tr("Enable one instrument-track-window mode"), gui_tw, counter, + addCheckBox(tr("Enable one instrument-track-window mode"), guiGroupBox, guiGroupLayout, m_oneInstrumentTrackWindow, SLOT(toggleOneInstrumentTrackWindow(bool)), true); - addLedCheckBox(tr("Show sidebar on the right-hand side"), gui_tw, counter, + addCheckBox(tr("Show sidebar on the right-hand side"), guiGroupBox, guiGroupLayout, m_sideBarOnRight, SLOT(toggleSideBarOnRight(bool)), true); - addLedCheckBox(tr("Let sample previews continue when mouse is released"), gui_tw, counter, + addCheckBox(tr("Let sample previews continue when mouse is released"), guiGroupBox, guiGroupLayout, m_letPreviewsFinish, SLOT(toggleLetPreviewsFinish(bool)), false); - addLedCheckBox(tr("Mute automation tracks during solo"), gui_tw, counter, + addCheckBox(tr("Mute automation tracks during solo"), guiGroupBox, guiGroupLayout, m_soloLegacyBehavior, SLOT(toggleSoloLegacyBehavior(bool)), false); - addLedCheckBox(tr("Show warning when deleting tracks"), gui_tw, counter, + addCheckBox(tr("Show warning when deleting tracks"), guiGroupBox, guiGroupLayout, m_trackDeletionWarning, SLOT(toggleTrackDeletionWarning(bool)), false); - addLedCheckBox(tr("Show warning when deleting a mixer channel that is in use"), gui_tw, counter, + addCheckBox(tr("Show warning when deleting a mixer channel that is in use"), guiGroupBox, guiGroupLayout, m_mixerChannelDeletionWarning, SLOT(toggleMixerChannelDeletionWarning(bool)), false); - gui_tw->setFixedHeight(YDelta + YDelta * counter); + generalControlsLayout->addWidget(guiGroupBox); - generalControlsLayout->addWidget(gui_tw); generalControlsLayout->addSpacing(10); - - counter = 0; - // Projects tab. - auto projects_tw = new TabWidget(tr("Projects"), generalControls); + QGroupBox * projectsGroupBox = new QGroupBox(tr("Projects"), generalControls); + QVBoxLayout * projectsGroupLayout = new QVBoxLayout(projectsGroupBox); - addLedCheckBox(tr("Compress project files by default"), projects_tw, counter, + addCheckBox(tr("Compress project files by default"), projectsGroupBox, projectsGroupLayout, m_MMPZ, SLOT(toggleMMPZ(bool)), true); - addLedCheckBox(tr("Create a backup file when saving a project"), projects_tw, counter, + addCheckBox(tr("Create a backup file when saving a project"), projectsGroupBox, projectsGroupLayout, m_disableBackup, SLOT(toggleDisableBackup(bool)), false); - addLedCheckBox(tr("Reopen last project on startup"), projects_tw, counter, + addCheckBox(tr("Reopen last project on startup"), projectsGroupBox, projectsGroupLayout, m_openLastProject, SLOT(toggleOpenLastProject(bool)), false); - projects_tw->setFixedHeight(YDelta + YDelta * counter); + generalControlsLayout->addWidget(projectsGroupBox); - generalControlsLayout->addWidget(projects_tw); generalControlsLayout->addSpacing(10); - // Language tab. - auto lang_tw = new TabWidget(tr("Language"), generalControls); - lang_tw->setFixedHeight(48); - auto changeLang = new QComboBox(lang_tw); - changeLang->move(XDelta, 20); + QGroupBox * languageGroupBox = new QGroupBox(tr("Language"), generalControls); + QVBoxLayout * languageGroupLayout = new QVBoxLayout(languageGroupBox); + + auto changeLang = new QComboBox(languageGroupBox); + languageGroupLayout->addWidget(changeLang); QDir dir(ConfigManager::inst()->localeDir()); QStringList fileNames = dir.entryList(QStringList("*.qm")); @@ -333,7 +349,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : connect(changeLang, SIGNAL(currentIndexChanged(int)), this, SLOT(showRestartWarning())); - generalControlsLayout->addWidget(lang_tw); + generalControlsLayout->addWidget(languageGroupBox); generalControlsLayout->addSpacing(10); // General layout ordering. @@ -341,7 +357,9 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : generalControls->setLayout(generalControlsLayout); generalScroll->setWidget(generalControls); generalScroll->setWidgetResizable(true); - general_layout->addWidget(generalScroll); + general_layout->addWidget(generalScroll, 1); + + // TODO Does not really seem to be needed general_layout->addStretch(); @@ -357,61 +375,54 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : // Autosave tab. - auto auto_save_tw = new TabWidget(tr("Autosave"), performance_w); - auto_save_tw->setFixedHeight(106); + QGroupBox * autoSaveBox = new QGroupBox(tr("Autosave"), performance_w); + QVBoxLayout * autoSaveLayout = new QVBoxLayout(autoSaveBox); + QHBoxLayout * autoSaveSubLayout = new QHBoxLayout(); - m_saveIntervalSlider = new QSlider(Qt::Horizontal, auto_save_tw); + m_saveIntervalSlider = new QSlider(Qt::Horizontal, autoSaveBox); m_saveIntervalSlider->setValue(m_saveInterval); m_saveIntervalSlider->setRange(1, 20); m_saveIntervalSlider->setTickInterval(1); m_saveIntervalSlider->setPageStep(1); - m_saveIntervalSlider->setGeometry(10, 18, 340, 18); m_saveIntervalSlider->setTickPosition(QSlider::TicksBelow); connect(m_saveIntervalSlider, SIGNAL(valueChanged(int)), this, SLOT(setAutoSaveInterval(int))); - m_saveIntervalLbl = new QLabel(auto_save_tw); - m_saveIntervalLbl->setGeometry(10, 40, 200, 24); + auto autoSaveResetBtn = new QPushButton(embed::getIconPixmap("reload"), "", autoSaveBox); + connect(autoSaveResetBtn, SIGNAL(clicked()), + this, SLOT(resetAutoSave())); + + autoSaveSubLayout->addWidget(m_saveIntervalSlider); + autoSaveSubLayout->addWidget(autoSaveResetBtn); + + autoSaveLayout->addLayout(autoSaveSubLayout); + + m_saveIntervalLbl = new QLabel(autoSaveBox); setAutoSaveInterval(m_saveIntervalSlider->value()); + autoSaveLayout->addWidget(m_saveIntervalLbl); - m_autoSave = new LedCheckBox( - tr("Enable autosave"), auto_save_tw); - m_autoSave->move(10, 70); - m_autoSave->setChecked(m_enableAutoSave); - connect(m_autoSave, SIGNAL(toggled(bool)), - this, SLOT(toggleAutoSave(bool))); - - m_runningAutoSave = new LedCheckBox( - tr("Allow autosave while playing"), auto_save_tw); - m_runningAutoSave->move(20, 88); - m_runningAutoSave->setChecked(m_enableRunningAutoSave); - connect(m_runningAutoSave, SIGNAL(toggled(bool)), - this, SLOT(toggleRunningAutoSave(bool))); - - auto autoSaveResetBtn = new QPushButton(embed::getIconPixmap("reload"), "", auto_save_tw); - autoSaveResetBtn->setGeometry(320, 70, 28, 28); - connect(autoSaveResetBtn, SIGNAL(clicked()), - this, SLOT(resetAutoSave())); + m_autoSave = addCheckBox(tr("Enable autosave"), autoSaveBox, autoSaveLayout, + m_enableAutoSave, SLOT(toggleAutoSave(bool)), false); + + m_runningAutoSave = addCheckBox(tr("Allow autosave while playing"), autoSaveBox, autoSaveLayout, + m_enableRunningAutoSave, SLOT(toggleRunningAutoSave(bool)), false); m_saveIntervalSlider->setEnabled(m_enableAutoSave); m_runningAutoSave->setVisible(m_enableAutoSave); - counter = 0; - // UI effect vs. performance tab. - auto ui_fx_tw = new TabWidget(tr("User interface (UI) effects vs. performance"), performance_w); + QGroupBox * uiFxBox = new QGroupBox(tr("User interface (UI) effects vs. performance"), performance_w); + QVBoxLayout * uiFxLayout = new QVBoxLayout(uiFxBox); - addLedCheckBox(tr("Smooth scroll in song editor"), ui_fx_tw, counter, + addCheckBox(tr("Smooth scroll in song editor"), uiFxBox, uiFxLayout, m_smoothScroll, SLOT(toggleSmoothScroll(bool)), false); - addLedCheckBox(tr("Display playback cursor in AudioFileProcessor"), ui_fx_tw, counter, + addCheckBox(tr("Display playback cursor in AudioFileProcessor"), uiFxBox, uiFxLayout, m_animateAFP, SLOT(toggleAnimateAFP(bool)), false); - ui_fx_tw->setFixedHeight(YDelta + YDelta * counter); - - counter = 0; + int counter = 0; // Plugins tab. auto plugins_tw = new TabWidget(tr("Plugins"), performance_w); @@ -458,8 +469,8 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : // Performance layout ordering. - performance_layout->addWidget(auto_save_tw); - performance_layout->addWidget(ui_fx_tw); + performance_layout->addWidget(autoSaveBox); + performance_layout->addWidget(uiFxBox); performance_layout->addWidget(plugins_tw); performance_layout->addStretch(); @@ -473,13 +484,12 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : labelWidget(audio_w, tr("Audio")); - // Audio interface tab. - auto audioiface_tw = new TabWidget(tr("Audio interface"), audio_w); - audioiface_tw->setFixedHeight(56); - - m_audioInterfaces = new QComboBox(audioiface_tw); - m_audioInterfaces->setGeometry(10, 20, 240, 28); + // Audio interface group + QGroupBox * audioInterfaceBox = new QGroupBox(tr("Audio interface"), audio_w); + QVBoxLayout * audioInterfaceLayout = new QVBoxLayout(audioInterfaceBox); + m_audioInterfaces = new QComboBox(audioInterfaceBox); + audioInterfaceLayout->addWidget(m_audioInterfaces); // Ifaces-settings-widget. auto as_w = new QWidget(audio_w); @@ -569,24 +579,20 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : useNaNHandler->setChecked(m_NaNHandler); } - // HQ mode LED. - auto hqaudio = new LedCheckBox(tr("HQ mode for output audio device"), audio_w); - hqaudio->move(10, 0); - hqaudio->setChecked(m_hqAudioDev); - connect(hqaudio, SIGNAL(toggled(bool)), - this, SLOT(toggleHQAudioDev(bool))); + // HQ mode checkbox + auto hqaudio = addCheckBox(tr("HQ mode for output audio device"), audioInterfaceBox, nullptr, + m_hqAudioDev, SLOT(toggleHQAudioDev(bool)), false); + // Buffer size group + QGroupBox * bufferSizeBox = new QGroupBox(tr("Buffer size"), audio_w); + QVBoxLayout * bufferSizeLayout = new QVBoxLayout(bufferSizeBox); + QHBoxLayout * bufferSizeSubLayout = new QHBoxLayout(); - // Buffer size tab. - auto bufferSize_tw = new TabWidget(tr("Buffer size"), audio_w); - bufferSize_tw->setFixedHeight(76); - - m_bufferSizeSlider = new QSlider(Qt::Horizontal, bufferSize_tw); + m_bufferSizeSlider = new QSlider(Qt::Horizontal, bufferSizeBox); m_bufferSizeSlider->setRange(1, 128); m_bufferSizeSlider->setTickInterval(8); m_bufferSizeSlider->setPageStep(8); m_bufferSizeSlider->setValue(m_bufferSize / BUFFERSIZE_RESOLUTION); - m_bufferSizeSlider->setGeometry(10, 18, 340, 18); m_bufferSizeSlider->setTickPosition(QSlider::TicksBelow); connect(m_bufferSizeSlider, SIGNAL(valueChanged(int)), @@ -594,23 +600,28 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : connect(m_bufferSizeSlider, SIGNAL(valueChanged(int)), this, SLOT(showRestartWarning())); - m_bufferSizeLbl = new QLabel(bufferSize_tw); - m_bufferSizeLbl->setGeometry(10, 40, 200, 24); - setBufferSize(m_bufferSizeSlider->value()); + bufferSizeSubLayout->addWidget(m_bufferSizeSlider, 1); - auto bufferSize_reset_btn = new QPushButton(embed::getIconPixmap("reload"), "", bufferSize_tw); - bufferSize_reset_btn->setGeometry(320, 40, 28, 28); + auto bufferSize_reset_btn = new QPushButton(embed::getIconPixmap("reload"), "", bufferSizeBox); connect(bufferSize_reset_btn, SIGNAL(clicked()), - this, SLOT(resetBufferSize())); + this, SLOT(resetBufferSize())); bufferSize_reset_btn->setToolTip( - tr("Reset to default value")); + tr("Reset to default value")); + + bufferSizeSubLayout->addWidget(bufferSize_reset_btn); + bufferSizeLayout->addLayout(bufferSizeSubLayout); + + m_bufferSizeLbl = new QLabel(bufferSizeBox); + setBufferSize(m_bufferSizeSlider->value()); + + bufferSizeLayout->addWidget(m_bufferSizeLbl); // Audio layout ordering. - audio_layout->addWidget(audioiface_tw); + audio_layout->addWidget(audioInterfaceBox); audio_layout->addWidget(as_w); audio_layout->addWidget(hqaudio); - audio_layout->addWidget(bufferSize_tw); + audio_layout->addWidget(bufferSizeBox); audio_layout->addStretch(); @@ -749,29 +760,28 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : // Path selectors widget. auto pathSelectors = new QWidget(paths_w); - const int txtLength = 284; - const int btnStart = 300; - // Path selectors layout. auto pathSelectorsLayout = new QVBoxLayout; pathSelectorsLayout->setSpacing(10); auto addPathEntry = [&](const QString& caption, const QString& content, const char* setSlot, const char* openSlot, QLineEdit*& lineEdit, const char* pixmap = "project_open") { - auto newTw = new TabWidget(caption, pathSelectors); - newTw->setFixedHeight(48); + auto pathEntryGroupBox = new QGroupBox(caption, pathSelectors); + QHBoxLayout * pathEntryLayout = new QHBoxLayout(pathEntryGroupBox); - lineEdit = new QLineEdit(content, newTw); - lineEdit->setGeometry(10, 20, txtLength, 16); + lineEdit = new QLineEdit(content, pathEntryGroupBox); connect(lineEdit, SIGNAL(textChanged(const QString&)), this, setSlot); - auto selectBtn = new QPushButton(embed::getIconPixmap(pixmap, 16, 16), "", newTw); + pathEntryLayout->addWidget(lineEdit, 1); + + auto selectBtn = new QPushButton(embed::getIconPixmap(pixmap, 16, 16), "", pathEntryGroupBox); selectBtn->setFixedSize(24, 24); - selectBtn->move(btnStart, 16); connect(selectBtn, SIGNAL(clicked()), this, openSlot); - pathSelectorsLayout->addWidget(newTw); + pathEntryLayout->addWidget(selectBtn, 0); + + pathSelectorsLayout->addWidget(pathEntryGroupBox); pathSelectorsLayout->addSpacing(10); }; @@ -820,21 +830,29 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : paths_layout->addWidget(pathsScroll); paths_layout->addStretch(); + // Add all main widgets to the layout of the settings widget + // This is needed so that we automatically get the correct sizes. + settingsLayout->addWidget(general_w); + settingsLayout->addWidget(performance_w); + settingsLayout->addWidget(audio_w); + settingsLayout->addWidget(midi_w); + settingsLayout->addWidget(paths_w); + // Major tabs ordering. m_tabBar->addTab(general_w, - tr("General"), 0, false, true)->setIcon( + tr("General"), 0, false, true, false)->setIcon( embed::getIconPixmap("setup_general")); m_tabBar->addTab(performance_w, - tr("Performance"), 1, false, true)->setIcon( + tr("Performance"), 1, false, true, false)->setIcon( embed::getIconPixmap("setup_performance")); m_tabBar->addTab(audio_w, - tr("Audio"), 2, false, true)->setIcon( + tr("Audio"), 2, false, true, false)->setIcon( embed::getIconPixmap("setup_audio")); m_tabBar->addTab(midi_w, - tr("MIDI"), 3, false, true)->setIcon( + tr("MIDI"), 3, false, true, false)->setIcon( embed::getIconPixmap("setup_midi")); m_tabBar->addTab(paths_w, - tr("Paths"), 4, true, true)->setIcon( + tr("Paths"), 4, true, true, false)->setIcon( embed::getIconPixmap("setup_directories")); m_tabBar->setActiveTab(tab_to_open); @@ -877,9 +895,9 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : extras_layout->addSpacing(10); // Vertical layout ordering. - vlayout->addWidget(main_w); + vlayout->addWidget(main_w, 0); vlayout->addSpacing(10); - vlayout->addWidget(extras_w); + vlayout->addWidget(extras_w), 1; vlayout->addSpacing(10); show(); diff --git a/src/gui/widgets/TabBar.cpp b/src/gui/widgets/TabBar.cpp index 806a932528c..e2949455138 100644 --- a/src/gui/widgets/TabBar.cpp +++ b/src/gui/widgets/TabBar.cpp @@ -44,7 +44,7 @@ TabBar::TabBar( QWidget * _parent, QBoxLayout::Direction _dir ) : } TabButton * TabBar::addTab( QWidget * _w, const QString & _text, int _id, - bool _add_stretch, bool _text_is_tooltip ) + bool _add_stretch, bool _text_is_tooltip, bool fixWidgetToParentSize ) { // already tab with id? if( m_tabs.contains( _id ) ) @@ -83,10 +83,12 @@ TabButton * TabBar::addTab( QWidget * _w, const QString & _text, int _id, m_layout->addStretch(); } - - // we assume, parent-widget is a widget acting as widget-stack so all - // widgets have the same size and only the one on the top is visible - _w->setFixedSize( _w->parentWidget()->size() ); + if (fixWidgetToParentSize) + { + // we assume, parent-widget is a widget acting as widget-stack so all + // widgets have the same size and only the one on the top is visible + _w->setFixedSize( _w->parentWidget()->size() ); + } b->setFont( pointSize<8>( b->font() ) ); From c5c459f54f576d99a5c80094b1f36a5a13c29424 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sun, 16 Jul 2023 20:02:11 +0200 Subject: [PATCH 02/56] Adjust Plugins group/tab Adjust the plugins group to also use a QGroupBox and QCheckBoxes. This finishes the "Performance" page and also finally enables the removal of the local variables `XDelta` and `YDelta` as well as the lambda `addLedCheckBox`. Other changes -------------- Add a TODO to some unused code for some advanced setting. Fix layout of the main widget and the buttons widget. Remove an erroneous ",1" after a statement. --- include/SetupDialog.h | 3 +- src/gui/modals/SetupDialog.cpp | 56 +++++++++------------------------- 2 files changed, 16 insertions(+), 43 deletions(-) diff --git a/include/SetupDialog.h b/include/SetupDialog.h index 7fa59d244c6..a68fe89cf4b 100644 --- a/include/SetupDialog.h +++ b/include/SetupDialog.h @@ -30,7 +30,6 @@ #include "AudioDevice.h" #include "AudioDeviceSetupWidget.h" -#include "LedCheckBox.h" #include "lmmsconfig.h" #include "MidiClient.h" #include "MidiSetupWidget.h" @@ -163,7 +162,7 @@ private slots: QLabel * m_vstEmbedLbl; QComboBox* m_vstEmbedComboBox; QString m_vstEmbedMethod; - LedCheckBox * m_vstAlwaysOnTopCheckBox; + QCheckBox * m_vstAlwaysOnTopCheckBox; bool m_vstAlwaysOnTop; bool m_disableAutoQuit; diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 97de349c408..b9a92ab78dc 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -39,6 +39,7 @@ #include "Engine.h" #include "FileDialog.h" #include "gui_templates.h" +#include "LedCheckBox.h" #include "MainWindow.h" #include "MidiSetupWidget.h" #include "ProjectJournal.h" @@ -167,10 +168,6 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : Engine::projectJournal()->setJournalling(false); - // Constants for positioning LED check boxes. - const int XDelta = 10; - const int YDelta = 18; - // Main widget. auto main_w = new QWidget(this); @@ -213,20 +210,6 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : auto generalControlsLayout = new QVBoxLayout; generalControlsLayout->setSpacing(10); - // TODO Remove once it is not used anymore - auto addLedCheckBox = [&XDelta, &YDelta, this](const QString& ledText, TabWidget* tw, int& counter, - bool initialState, const char* toggledSlot, bool showRestartWarning) { - auto checkBox = new LedCheckBox(ledText, tw); - counter++; - checkBox->move(XDelta, YDelta * counter); - checkBox->setChecked(initialState); - connect(checkBox, SIGNAL(toggled(bool)), this, toggledSlot); - if (showRestartWarning) - { - connect(checkBox, SIGNAL(toggled(bool)), this, SLOT(showRestartWarning())); - } - }; - auto addCheckBox = [this](const QString& ledText, QWidget* parent, QBoxLayout * layout, bool initialState, const char* toggledSlot, bool showRestartWarning) -> QCheckBox * { auto checkBox = new QCheckBox(ledText, parent); @@ -422,17 +405,15 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : m_animateAFP, SLOT(toggleAnimateAFP(bool)), false); - int counter = 0; - - // Plugins tab. - auto plugins_tw = new TabWidget(tr("Plugins"), performance_w); + // Plugins group + QGroupBox * pluginsBox = new QGroupBox(tr("Plugins"), performance_w); + QVBoxLayout * pluginsLayout = new QVBoxLayout(pluginsBox); - m_vstEmbedLbl = new QLabel(plugins_tw); - m_vstEmbedLbl->move(XDelta, YDelta * ++counter); + m_vstEmbedLbl = new QLabel(pluginsBox); m_vstEmbedLbl->setText(tr("VST plugins embedding:")); + pluginsLayout->addWidget(m_vstEmbedLbl); - m_vstEmbedComboBox = new QComboBox(plugins_tw); - m_vstEmbedComboBox->move(XDelta, YDelta * ++counter); + m_vstEmbedComboBox = new QComboBox(pluginsBox); QStringList embedMethods = ConfigManager::availableVstEmbedMethods(); m_vstEmbedComboBox->addItem(tr("No embedding"), "none"); @@ -451,27 +432,19 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : m_vstEmbedComboBox->setCurrentIndex(m_vstEmbedComboBox->findData(m_vstEmbedMethod)); connect(m_vstEmbedComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(vstEmbedMethodChanged())); + pluginsLayout->addWidget(m_vstEmbedComboBox); - counter += 2; + m_vstAlwaysOnTopCheckBox = addCheckBox(tr("Keep plugin windows on top when not embedded"), pluginsBox, pluginsLayout, + m_vstAlwaysOnTop, SLOT(toggleVSTAlwaysOnTop(bool)), false); - m_vstAlwaysOnTopCheckBox = new LedCheckBox( - tr("Keep plugin windows on top when not embedded"), plugins_tw); - m_vstAlwaysOnTopCheckBox->move(20, 66); - m_vstAlwaysOnTopCheckBox->setChecked(m_vstAlwaysOnTop); - m_vstAlwaysOnTopCheckBox->setVisible(m_vstEmbedMethod == "none"); - connect(m_vstAlwaysOnTopCheckBox, SIGNAL(toggled(bool)), - this, SLOT(toggleVSTAlwaysOnTop(bool))); - - addLedCheckBox(tr("Keep effects running even without input"), plugins_tw, counter, + addCheckBox(tr("Keep effects running even without input"), pluginsBox, pluginsLayout, m_disableAutoQuit, SLOT(toggleDisableAutoQuit(bool)), false); - plugins_tw->setFixedHeight(YDelta + YDelta * counter); - // Performance layout ordering. performance_layout->addWidget(autoSaveBox); performance_layout->addWidget(uiFxBox); - performance_layout->addWidget(plugins_tw); + performance_layout->addWidget(pluginsBox); performance_layout->addStretch(); @@ -575,6 +548,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : // Advanced setting, hidden for now if(false) { + // TODO Handle or remove. auto useNaNHandler = new LedCheckBox(tr("Use built-in NaN handler"), audio_w); useNaNHandler->setChecked(m_NaNHandler); } @@ -895,9 +869,9 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : extras_layout->addSpacing(10); // Vertical layout ordering. - vlayout->addWidget(main_w, 0); + vlayout->addWidget(main_w, 1); vlayout->addSpacing(10); - vlayout->addWidget(extras_w), 1; + vlayout->addWidget(extras_w); vlayout->addSpacing(10); show(); From cbea8f30fc4d1a821e99f67b78ab2d124431fbea Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sun, 16 Jul 2023 20:04:55 +0200 Subject: [PATCH 03/56] Make "Paths" scroll area expandable Make the "Paths" scroll area take as much space as there is. --- src/gui/modals/SetupDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index b9a92ab78dc..37c5db74825 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -801,7 +801,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : pathsScroll->setWidget(pathSelectors); pathsScroll->setWidgetResizable(true); - paths_layout->addWidget(pathsScroll); + paths_layout->addWidget(pathsScroll, 1); paths_layout->addStretch(); // Add all main widgets to the layout of the settings widget From c06d9d488319f88eaa698a33f61495f77722235f Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sun, 16 Jul 2023 23:04:09 +0200 Subject: [PATCH 04/56] First adjustments to MIDI page Use group boxes and layouts for the "MIDI interface" and automatic assignment tabs. The configuration/information dialogs for the different drivers still need adjustments. --- src/gui/modals/SetupDialog.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 37c5db74825..0565b8238e2 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -605,15 +605,14 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : auto midi_layout = new QVBoxLayout(midi_w); midi_layout->setSpacing(10); midi_layout->setContentsMargins(0, 0, 0, 0); - labelWidget(midi_w, - tr("MIDI")); + labelWidget(midi_w, tr("MIDI")); - // MIDI interface tab. - auto midiiface_tw = new TabWidget(tr("MIDI interface"), midi_w); - midiiface_tw->setFixedHeight(56); + // MIDI interface group + QGroupBox * midiInterfaceBox = new QGroupBox(tr("MIDI interface"), midi_w); + QVBoxLayout * midiInterfaceLayout = new QVBoxLayout(midiInterfaceBox); - m_midiInterfaces = new QComboBox(midiiface_tw); - m_midiInterfaces->setGeometry(10, 20, 240, 28); + m_midiInterfaces = new QComboBox(midiInterfaceBox); + midiInterfaceLayout->addWidget(m_midiInterfaces); // Ifaces-settings-widget. auto ms_w = new QWidget(midi_w); @@ -687,12 +686,12 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : this, SLOT(midiInterfaceChanged(const QString&))); - // MIDI autoassign tab. - auto midiAutoAssign_tw = new TabWidget(tr("Automatically assign MIDI controller to selected track"), midi_w); - midiAutoAssign_tw->setFixedHeight(56); + // MIDI autoassign group + QGroupBox * midiAutoAssignBox = new QGroupBox(tr("Automatically assign MIDI controller to selected track"), midi_w); + QVBoxLayout * midiAutoAssignLayout = new QVBoxLayout(midiAutoAssignBox); - m_assignableMidiDevices = new QComboBox(midiAutoAssign_tw); - m_assignableMidiDevices->setGeometry(10, 20, 240, 28); + m_assignableMidiDevices = new QComboBox(midiAutoAssignBox); + midiAutoAssignLayout->addWidget(m_assignableMidiDevices); m_assignableMidiDevices->addItem("none"); if ( !Engine::audioEngine()->midiClient()->isRaw() ) { @@ -709,9 +708,9 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : } // MIDI layout ordering. - midi_layout->addWidget(midiiface_tw); + midi_layout->addWidget(midiInterfaceBox); midi_layout->addWidget(ms_w); - midi_layout->addWidget(midiAutoAssign_tw); + midi_layout->addWidget(midiAutoAssignBox); midi_layout->addStretch(); From b53290344b358380b40d273f3c9dc0f31fdf13ef Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sat, 22 Jul 2023 22:55:02 +0200 Subject: [PATCH 05/56] Adjust most audio driver settings dialogs Adjust the dialogs of most audio driver settings dialogs by showing them in a QGroupBox and adjusting their layouts. All dialogs now use `QFormLayout` to layout their labels and input widgets. Technical details ------------------ Introduce `AudioDeviceSetupGroupWidget` which is intended to functionally replace `AudioDeviceSetupWidget` in the long run. This is likely a temporary replacement in the sense that `AudioDeviceSetupGroupWidget` will be renamed to `AudioDeviceSetupWidget` once the latter has been replaced everywhere. Both classes are very similar and the only difference is that the former inherits from `QGroupBox` instead of `TabWidget`. Adjust the using of AswMap so that it is now defined as a map from `QString` to `AudioDeviceSetupGroupWidget`. Use `QFormLayout` to layout the widgets of the setup dialogs instead of hard coding geometries and placement. TODOs ------ Adjust the widgets for the SoundIO and SndIo cases. These will be a bit more effort as they are not compiled on my machine. --- include/AudioAlsaSetupWidget.h | 4 +- include/AudioDeviceSetupGroupWidget.h | 49 +++++++++++++++++++++++++ include/AudioDummy.h | 6 +-- include/AudioJack.h | 4 +- include/AudioOss.h | 4 +- include/AudioPortAudio.h | 4 +- include/AudioPulseAudio.h | 4 +- include/AudioSdl.h | 4 +- include/SetupDialog.h | 4 +- src/core/audio/AudioJack.cpp | 15 ++++---- src/core/audio/AudioOss.cpp | 14 +++---- src/core/audio/AudioPortAudio.cpp | 20 ++++------ src/core/audio/AudioPulseAudio.cpp | 19 ++++------ src/core/audio/AudioSdl.cpp | 12 +++--- src/gui/AudioAlsaSetupWidget.cpp | 14 +++---- src/gui/AudioDeviceSetupGroupWidget.cpp | 42 +++++++++++++++++++++ src/gui/CMakeLists.txt | 1 + src/gui/modals/SetupDialog.cpp | 5 ++- 18 files changed, 151 insertions(+), 74 deletions(-) create mode 100644 include/AudioDeviceSetupGroupWidget.h create mode 100644 src/gui/AudioDeviceSetupGroupWidget.cpp diff --git a/include/AudioAlsaSetupWidget.h b/include/AudioAlsaSetupWidget.h index cbe99ba0148..9795a35880a 100644 --- a/include/AudioAlsaSetupWidget.h +++ b/include/AudioAlsaSetupWidget.h @@ -29,7 +29,7 @@ #ifdef LMMS_HAVE_ALSA -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" #include "AudioAlsa.h" @@ -41,7 +41,7 @@ namespace lmms::gui class LcdSpinBox; -class AudioAlsaSetupWidget : public AudioDeviceSetupWidget +class AudioAlsaSetupWidget : public AudioDeviceSetupGroupWidget { Q_OBJECT diff --git a/include/AudioDeviceSetupGroupWidget.h b/include/AudioDeviceSetupGroupWidget.h new file mode 100644 index 00000000000..8980d0a65c9 --- /dev/null +++ b/include/AudioDeviceSetupGroupWidget.h @@ -0,0 +1,49 @@ +/* + * AudioDeviceSetupGroupWidget.h - Base class for audio device setup widgets using group box + * + * Copyright (c) 2004-2015 Tobias Doerffel + * Copyright (c) 2004-2015 Michael Gregorius + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef LMMS_GUI_AUDIO_DEVICE_SETUP_GROUP_WIDGET_H +#define LMMS_GUI_AUDIO_DEVICE_SETUP_GROUP_WIDGET_H + +#include + +namespace lmms::gui +{ + +class AudioDeviceSetupGroupWidget : public QGroupBox +{ + Q_OBJECT +public: + AudioDeviceSetupGroupWidget( const QString & _caption, QWidget * _parent ); + + ~AudioDeviceSetupGroupWidget() override = default; + + virtual void saveSettings() = 0; + + virtual void show(); +}; + +} // namespace lmms::gui + +#endif // LMMS_GUI_AUDIO_DEVICE_SETUP_GROUP_WIDGET_H diff --git a/include/AudioDummy.h b/include/AudioDummy.h index e342601717d..c7ac3d67f9f 100644 --- a/include/AudioDummy.h +++ b/include/AudioDummy.h @@ -26,7 +26,7 @@ #define LMMS_AUDIO_DUMMY_H #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" #include "AudioEngine.h" #include "MicroTimer.h" @@ -54,11 +54,11 @@ class AudioDummy : public QThread, public AudioDevice } - class setupWidget : public gui::AudioDeviceSetupWidget + class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ) : - gui::AudioDeviceSetupWidget( AudioDummy::name(), _parent ) + gui::AudioDeviceSetupGroupWidget( AudioDummy::name(), _parent ) { } diff --git a/include/AudioJack.h b/include/AudioJack.h index 2ef0f665cbe..4135dc5e0f7 100644 --- a/include/AudioJack.h +++ b/include/AudioJack.h @@ -38,7 +38,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" class QLineEdit; @@ -74,7 +74,7 @@ class AudioJack : public QObject, public AudioDevice } -class setupWidget : public gui::AudioDeviceSetupWidget +class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioOss.h b/include/AudioOss.h index 55f64de851e..953c72a4fa8 100644 --- a/include/AudioOss.h +++ b/include/AudioOss.h @@ -32,7 +32,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" class QLineEdit; @@ -61,7 +61,7 @@ class AudioOss : public QThread, public AudioDevice static QString probeDevice(); -class setupWidget : public gui::AudioDeviceSetupWidget +class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioPortAudio.h b/include/AudioPortAudio.h index 01b8f3fd7e8..a926b1bf0ed 100644 --- a/include/AudioPortAudio.h +++ b/include/AudioPortAudio.h @@ -35,7 +35,7 @@ # include # include "AudioDevice.h" -# include "AudioDeviceSetupWidget.h" +# include "AudioDeviceSetupGroupWidget.h" # if defined paNeverDropInput || defined paNonInterleaved # define PORTAUDIO_V19 @@ -90,7 +90,7 @@ class AudioPortAudio : public AudioDevice unsigned long _framesPerBuffer ); - class setupWidget : public gui::AudioDeviceSetupWidget + class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioPulseAudio.h b/include/AudioPulseAudio.h index b6a99827479..22e47896d79 100644 --- a/include/AudioPulseAudio.h +++ b/include/AudioPulseAudio.h @@ -34,7 +34,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" class QLineEdit; @@ -62,7 +62,7 @@ class AudioPulseAudio : public QThread, public AudioDevice static QString probeDevice(); - class setupWidget : public gui::AudioDeviceSetupWidget + class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioSdl.h b/include/AudioSdl.h index 62db8b68ace..5f29596a50e 100644 --- a/include/AudioSdl.h +++ b/include/AudioSdl.h @@ -37,7 +37,7 @@ #endif #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" class QLineEdit; @@ -57,7 +57,7 @@ class AudioSdl : public AudioDevice } - class setupWidget : public gui::AudioDeviceSetupWidget + class setupWidget : public gui::AudioDeviceSetupGroupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/SetupDialog.h b/include/SetupDialog.h index a68fe89cf4b..7097b320699 100644 --- a/include/SetupDialog.h +++ b/include/SetupDialog.h @@ -29,7 +29,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupWidget.h" +#include "AudioDeviceSetupGroupWidget.h" #include "lmmsconfig.h" #include "MidiClient.h" #include "MidiSetupWidget.h" @@ -166,7 +166,7 @@ private slots: bool m_vstAlwaysOnTop; bool m_disableAutoQuit; - using AswMap = QMap; + using AswMap = QMap; using MswMap = QMap; using trMap = QMap; diff --git a/src/core/audio/AudioJack.cpp b/src/core/audio/AudioJack.cpp index 222ebf10d59..00024de6336 100644 --- a/src/core/audio/AudioJack.cpp +++ b/src/core/audio/AudioJack.cpp @@ -27,8 +27,8 @@ #ifdef LMMS_HAVE_JACK #include -#include #include +#include #include "Engine.h" #include "GuiApplication.h" @@ -452,19 +452,18 @@ void AudioJack::shutdownCallback( void * _udata ) AudioJack::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioJack::name(), _parent ) + AudioDeviceSetupGroupWidget( AudioJack::name(), _parent ) { + QFormLayout * form = new QFormLayout(this); + QString cn = ConfigManager::inst()->value( "audiojack", "clientname" ); if( cn.isEmpty() ) { cn = "lmms"; } m_clientName = new QLineEdit( cn, this ); - m_clientName->setGeometry( 10, 20, 160, 20 ); - auto cn_lbl = new QLabel(tr("Client name"), this); - cn_lbl->setFont( pointSize<7>( cn_lbl->font() ) ); - cn_lbl->setGeometry( 10, 40, 160, 10 ); + form->addRow(tr("Client name"), m_clientName); auto m = new gui::LcdSpinBoxModel(/* this */); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); @@ -474,8 +473,8 @@ AudioJack::setupWidget::setupWidget( QWidget * _parent ) : m_channels = new gui::LcdSpinBox( 1, this ); m_channels->setModel( m ); - m_channels->setLabel( tr( "Channels" ) ); - m_channels->move( 180, 20 ); + + form->addRow(tr("Channels"), m_channels); } diff --git a/src/core/audio/AudioOss.cpp b/src/core/audio/AudioOss.cpp index 5166bad798b..5e0a8fc8984 100644 --- a/src/core/audio/AudioOss.cpp +++ b/src/core/audio/AudioOss.cpp @@ -27,7 +27,7 @@ #ifdef LMMS_HAVE_OSS #include -#include +#include > #include #include "endian_handling.h" @@ -318,14 +318,13 @@ void AudioOss::run() AudioOss::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioOss::name(), _parent ) + AudioDeviceSetupGroupWidget( AudioOss::name(), _parent ) { + QFormLayout * form = new QFormLayout(this); + m_device = new QLineEdit( probeDevice(), this ); - m_device->setGeometry( 10, 20, 160, 20 ); - auto dev_lbl = new QLabel(tr("Device"), this); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->setGeometry( 10, 40, 160, 10 ); + form->addRow(tr("Device"), m_device); auto m = new gui::LcdSpinBoxModel(/* this */); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); @@ -335,9 +334,8 @@ AudioOss::setupWidget::setupWidget( QWidget * _parent ) : m_channels = new gui::LcdSpinBox( 1, this ); m_channels->setModel( m ); - m_channels->setLabel( tr( "Channels" ) ); - m_channels->move( 180, 20 ); + form->addRow(tr("Channels"), m_channels); } diff --git a/src/core/audio/AudioPortAudio.cpp b/src/core/audio/AudioPortAudio.cpp index 0f5a4122f92..cb0e4616ce3 100644 --- a/src/core/audio/AudioPortAudio.cpp +++ b/src/core/audio/AudioPortAudio.cpp @@ -49,7 +49,7 @@ void AudioPortAudioSetupUtil::updateChannels() #ifdef LMMS_HAVE_PORTAUDIO -#include +#include #include "Engine.h" #include "ConfigManager.h" @@ -415,23 +415,17 @@ void AudioPortAudioSetupUtil::updateChannels() AudioPortAudio::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioPortAudio::name(), _parent ) + AudioDeviceSetupGroupWidget( AudioPortAudio::name(), _parent ) { using gui::ComboBox; - m_backend = new ComboBox( this, "BACKEND" ); - m_backend->setGeometry( 64, 15, 260, ComboBox::DEFAULT_HEIGHT ); + QFormLayout * form = new QFormLayout(this); - auto backend_lbl = new QLabel(tr("Backend"), this); - backend_lbl->setFont( pointSize<7>( backend_lbl->font() ) ); - backend_lbl->move( 8, 18 ); + m_backend = new ComboBox( this, "BACKEND" ); + form->addRow(tr("Backend"), m_backend); m_device = new ComboBox( this, "DEVICE" ); - m_device->setGeometry( 64, 35, 260, ComboBox::DEFAULT_HEIGHT ); - - auto dev_lbl = new QLabel(tr("Device"), this); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->move( 8, 38 ); + form->addRow(tr("Device"), m_device); /* LcdSpinBoxModel * m = new LcdSpinBoxModel( ); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); @@ -505,7 +499,7 @@ void AudioPortAudio::setupWidget::show() m_setupUtil.m_deviceModel.setValue( i ); } - AudioDeviceSetupWidget::show(); + AudioDeviceSetupGroupWidget::show(); } } // namespace lmms diff --git a/src/core/audio/AudioPulseAudio.cpp b/src/core/audio/AudioPulseAudio.cpp index bac9970756a..24913c60f5f 100644 --- a/src/core/audio/AudioPulseAudio.cpp +++ b/src/core/audio/AudioPulseAudio.cpp @@ -23,7 +23,7 @@ */ #include -#include +#include #include "AudioPulseAudio.h" @@ -310,26 +310,23 @@ void AudioPulseAudio::signalConnected( bool connected ) AudioPulseAudio::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioPulseAudio::name(), _parent ) + AudioDeviceSetupGroupWidget( AudioPulseAudio::name(), _parent ) { - m_device = new QLineEdit( AudioPulseAudio::probeDevice(), this ); - m_device->setGeometry( 10, 20, 160, 20 ); + QFormLayout * form = new QFormLayout(this); - auto dev_lbl = new QLabel(tr("Device"), this); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->setGeometry( 10, 40, 160, 10 ); + m_device = new QLineEdit( AudioPulseAudio::probeDevice(), this ); + form->addRow(tr("Device"), m_device); - auto m = new gui::LcdSpinBoxModel(/* this */); + auto m = new gui::LcdSpinBoxModel(); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); m->setStep( 2 ); m->setValue( ConfigManager::inst()->value( "audiopa", - "channels" ).toInt() ); + "channels" ).toInt() ); m_channels = new gui::LcdSpinBox( 1, this ); m_channels->setModel( m ); - m_channels->setLabel( tr( "Channels" ) ); - m_channels->move( 180, 20 ); + form->addRow(tr("Channels"), m_channels); } diff --git a/src/core/audio/AudioSdl.cpp b/src/core/audio/AudioSdl.cpp index e73ccadc1b6..071877f0d2b 100644 --- a/src/core/audio/AudioSdl.cpp +++ b/src/core/audio/AudioSdl.cpp @@ -26,7 +26,7 @@ #ifdef LMMS_HAVE_SDL -#include +#include > #include #include @@ -325,16 +325,14 @@ void AudioSdl::sdlInputAudioCallback(Uint8 *_buf, int _len) { #endif AudioSdl::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioSdl::name(), _parent ) + AudioDeviceSetupGroupWidget( AudioSdl::name(), _parent ) { + QFormLayout * form = new QFormLayout(this); + QString dev = ConfigManager::inst()->value( "audiosdl", "device" ); m_device = new QLineEdit( dev, this ); - m_device->setGeometry( 10, 20, 160, 20 ); - - auto dev_lbl = new QLabel(tr("Device"), this); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->setGeometry( 10, 40, 160, 10 ); + form->addRow(tr("Device"), m_device); } diff --git a/src/gui/AudioAlsaSetupWidget.cpp b/src/gui/AudioAlsaSetupWidget.cpp index 4ea6d4c5855..015f4e8ad43 100644 --- a/src/gui/AudioAlsaSetupWidget.cpp +++ b/src/gui/AudioAlsaSetupWidget.cpp @@ -23,7 +23,7 @@ */ #include -#include +#include #include "AudioAlsaSetupWidget.h" @@ -37,9 +37,11 @@ namespace lmms::gui { AudioAlsaSetupWidget::AudioAlsaSetupWidget( QWidget * _parent ) : - AudioDeviceSetupWidget( AudioAlsa::name(), _parent ), + AudioDeviceSetupGroupWidget( AudioAlsa::name(), _parent ), m_selectedDevice(-1) { + QFormLayout * form = new QFormLayout(this); + m_deviceInfos = AudioAlsa::getAvailableDevices(); QString deviceText = ConfigManager::inst()->value( "audioalsa", "device" ); @@ -62,14 +64,11 @@ AudioAlsaSetupWidget::AudioAlsaSetupWidget( QWidget * _parent ) : m_selectedDevice = m_deviceComboBox->currentIndex(); - m_deviceComboBox->setGeometry( 10, 20, 160, 20 ); connect(m_deviceComboBox, SIGNAL(currentIndexChanged(int)), SLOT(onCurrentIndexChanged(int))); - auto dev_lbl = new QLabel(tr("DEVICE"), this); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->setGeometry( 10, 40, 160, 10 ); + form->addRow(tr("Device"), m_deviceComboBox); auto m = new LcdSpinBoxModel(/* this */); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); @@ -79,9 +78,8 @@ AudioAlsaSetupWidget::AudioAlsaSetupWidget( QWidget * _parent ) : m_channels = new LcdSpinBox( 1, this ); m_channels->setModel( m ); - m_channels->setLabel( tr( "CHANNELS" ) ); - m_channels->move( 180, 20 ); + form->addRow(tr("Channels"), m_channels); } diff --git a/src/gui/AudioDeviceSetupGroupWidget.cpp b/src/gui/AudioDeviceSetupGroupWidget.cpp new file mode 100644 index 00000000000..f84c8bb8bbf --- /dev/null +++ b/src/gui/AudioDeviceSetupGroupWidget.cpp @@ -0,0 +1,42 @@ +/* + * AudioDeviceSetupGroupWidget.cpp - Base class for audio device setup widgets using group box + * + * Copyright (c) 2004-2015 Tobias Doerffel + * Copyright (c) 2004-2015 Michael Gregorius + * + * This file is part of LMMS - https://lmms.io + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#include "AudioDeviceSetupGroupWidget.h" + +namespace lmms::gui +{ + +AudioDeviceSetupGroupWidget::AudioDeviceSetupGroupWidget(const QString & caption, QWidget * parent) : + QGroupBox(QGroupBox::tr("Settings for %1").arg(tr(caption.toUtf8())), parent) +{ +} + +void AudioDeviceSetupGroupWidget::show() +{ + parentWidget()->show(); + QWidget::show(); +} + +} // namespace lmms::gui diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 9f940c0354b..3ae16c57347 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -3,6 +3,7 @@ SET(LMMS_SRCS gui/ActionGroup.cpp gui/AudioAlsaSetupWidget.cpp gui/AudioDeviceSetupWidget.cpp + gui/AudioDeviceSetupGroupWidget.cpp gui/AutomatableModelView.cpp gui/ControlLayout.cpp gui/ControllerDialog.cpp diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 0565b8238e2..d1375c0332f 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -466,7 +466,6 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : // Ifaces-settings-widget. auto as_w = new QWidget(audio_w); - as_w->setFixedHeight(60); auto as_w_layout = new QHBoxLayout(as_w); as_w_layout->setSpacing(0); @@ -492,6 +491,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : new AudioPortAudio::setupWidget(as_w); #endif +// TODO !!! #ifdef LMMS_HAVE_SOUNDIO m_audioIfaceSetupWidgets[AudioSoundIo::name()] = new AudioSoundIo::setupWidget(as_w); @@ -507,6 +507,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : new AudioOss::setupWidget(as_w); #endif +// TODO !!! #ifdef LMMS_HAVE_SNDIO m_audioIfaceSetupWidgets[AudioSndio::name()] = new AudioSndio::setupWidget(as_w); @@ -520,7 +521,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : it != m_audioIfaceSetupWidgets.end(); ++it) { m_audioIfaceNames[ - AudioDeviceSetupWidget::tr(it.key().toUtf8())] = it.key(); + AudioDeviceSetupGroupWidget::tr(it.key().toUtf8())] = it.key(); } for(trMap::iterator it = m_audioIfaceNames.begin(); it != m_audioIfaceNames.end(); ++it) From 345886954ecd2e1639cf46af9b9b747237d66b3a Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sat, 22 Jul 2023 23:03:31 +0200 Subject: [PATCH 06/56] Adjust the MIDI setup dialog Adjust the MIDI setup dialog: * Show it in a QGroupBox * Make it use a `QFormLayout` to layout the label and line edit. Remove the hard coded height. --- include/MidiSetupWidget.h | 4 ++-- src/gui/MidiSetupWidget.cpp | 11 +++++------ src/gui/modals/SetupDialog.cpp | 1 - 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/include/MidiSetupWidget.h b/include/MidiSetupWidget.h index a61b606ac21..7b660601771 100644 --- a/include/MidiSetupWidget.h +++ b/include/MidiSetupWidget.h @@ -25,7 +25,7 @@ #ifndef LMMS_GUI_MIDI_SETUP_WIDGET_H #define LMMS_GUI_MIDI_SETUP_WIDGET_H -#include "TabWidget.h" +#include class QLineEdit; @@ -33,7 +33,7 @@ namespace lmms::gui { -class MidiSetupWidget : public TabWidget +class MidiSetupWidget : public QGroupBox { Q_OBJECT MidiSetupWidget( const QString & caption, const QString & configSection, diff --git a/src/gui/MidiSetupWidget.cpp b/src/gui/MidiSetupWidget.cpp index 4f620fb0ed1..d18c19babfb 100644 --- a/src/gui/MidiSetupWidget.cpp +++ b/src/gui/MidiSetupWidget.cpp @@ -24,7 +24,7 @@ #include "MidiSetupWidget.h" -#include +#include > #include #include "ConfigManager.h" @@ -37,7 +37,7 @@ namespace lmms::gui MidiSetupWidget::MidiSetupWidget(const QString & caption, const QString & configSection, const QString & devName, QWidget * parent) : - TabWidget(TabWidget::tr("Settings for %1").arg(tr(caption.toUtf8())), parent), + QGroupBox(QGroupBox::tr("Settings for %1").arg(tr(caption.toUtf8())), parent), m_configSection(configSection), m_device(nullptr) { @@ -45,12 +45,11 @@ MidiSetupWidget::MidiSetupWidget(const QString & caption, const QString & config // to indicate that there is no editable device field if (!devName.isNull()) { + QFormLayout * form = new QFormLayout(this); + m_device = new QLineEdit(devName, this); - m_device->setGeometry(10, 20, 160, 20); - auto dev_lbl = new QLabel(tr("Device"), this); - dev_lbl->setFont(pointSize<7>(dev_lbl->font())); - dev_lbl->setGeometry(10, 40, 160, 10); + form->addRow(tr("Device"), m_device); } } diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index d1375c0332f..2b6c199badd 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -617,7 +617,6 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : // Ifaces-settings-widget. auto ms_w = new QWidget(midi_w); - ms_w->setFixedHeight(60); auto ms_w_layout = new QHBoxLayout(ms_w); ms_w_layout->setSpacing(0); From 095b2066352171909b7810e05062c0d08f3cbabe Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Tue, 25 Jul 2023 17:36:48 +0200 Subject: [PATCH 07/56] Remove unused include Remove an unused include of "AudioDeviceSetupWidget.h". --- src/gui/modals/SetupDialog.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 2b6c199badd..87a54a9933a 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -32,7 +32,6 @@ #include #include -#include "AudioDeviceSetupWidget.h" #include "AudioEngine.h" #include "debug.h" #include "embed.h" From 9282e6c91bd212bd9cbcfd0618e97164f1b80786 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Tue, 25 Jul 2023 18:03:18 +0200 Subject: [PATCH 08/56] Remove temporary AudioDeviceSetupGroupWidget Remove the temporary class `AudioDeviceSetupGroupWidget` and move its functionality into `AudioDeviceSetupWidget`. This means to let `AudioDeviceSetupWidget` inherit from `QGroupBox` instead of `TabWidget`. Adjust all inheriting classes accordingly. Adjust usages in SetupDialog. The result should be that even the cases for `LMMS_HAVE_SOUNDIO` and `LMMS_HAVE_SNDIO` should compile again. Although their layout might look weird. --- include/AudioAlsaSetupWidget.h | 4 +- include/AudioDeviceSetupGroupWidget.h | 49 ------------------------- include/AudioDeviceSetupWidget.h | 5 ++- include/AudioDummy.h | 6 +-- include/AudioJack.h | 4 +- include/AudioOss.h | 4 +- include/AudioPortAudio.h | 4 +- include/AudioPulseAudio.h | 4 +- include/AudioSdl.h | 4 +- include/SetupDialog.h | 4 +- src/core/audio/AudioJack.cpp | 2 +- src/core/audio/AudioOss.cpp | 2 +- src/core/audio/AudioPortAudio.cpp | 4 +- src/core/audio/AudioPulseAudio.cpp | 2 +- src/core/audio/AudioSdl.cpp | 2 +- src/gui/AudioAlsaSetupWidget.cpp | 2 +- src/gui/AudioDeviceSetupGroupWidget.cpp | 42 --------------------- src/gui/AudioDeviceSetupWidget.cpp | 4 +- src/gui/CMakeLists.txt | 1 - src/gui/modals/SetupDialog.cpp | 2 +- 20 files changed, 30 insertions(+), 121 deletions(-) delete mode 100644 include/AudioDeviceSetupGroupWidget.h delete mode 100644 src/gui/AudioDeviceSetupGroupWidget.cpp diff --git a/include/AudioAlsaSetupWidget.h b/include/AudioAlsaSetupWidget.h index 9795a35880a..cbe99ba0148 100644 --- a/include/AudioAlsaSetupWidget.h +++ b/include/AudioAlsaSetupWidget.h @@ -29,7 +29,7 @@ #ifdef LMMS_HAVE_ALSA -#include "AudioDeviceSetupGroupWidget.h" +#include "AudioDeviceSetupWidget.h" #include "AudioAlsa.h" @@ -41,7 +41,7 @@ namespace lmms::gui class LcdSpinBox; -class AudioAlsaSetupWidget : public AudioDeviceSetupGroupWidget +class AudioAlsaSetupWidget : public AudioDeviceSetupWidget { Q_OBJECT diff --git a/include/AudioDeviceSetupGroupWidget.h b/include/AudioDeviceSetupGroupWidget.h deleted file mode 100644 index 8980d0a65c9..00000000000 --- a/include/AudioDeviceSetupGroupWidget.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * AudioDeviceSetupGroupWidget.h - Base class for audio device setup widgets using group box - * - * Copyright (c) 2004-2015 Tobias Doerffel - * Copyright (c) 2004-2015 Michael Gregorius - * - * This file is part of LMMS - https://lmms.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - */ - -#ifndef LMMS_GUI_AUDIO_DEVICE_SETUP_GROUP_WIDGET_H -#define LMMS_GUI_AUDIO_DEVICE_SETUP_GROUP_WIDGET_H - -#include - -namespace lmms::gui -{ - -class AudioDeviceSetupGroupWidget : public QGroupBox -{ - Q_OBJECT -public: - AudioDeviceSetupGroupWidget( const QString & _caption, QWidget * _parent ); - - ~AudioDeviceSetupGroupWidget() override = default; - - virtual void saveSettings() = 0; - - virtual void show(); -}; - -} // namespace lmms::gui - -#endif // LMMS_GUI_AUDIO_DEVICE_SETUP_GROUP_WIDGET_H diff --git a/include/AudioDeviceSetupWidget.h b/include/AudioDeviceSetupWidget.h index f56fa07a6ee..acc99602dba 100644 --- a/include/AudioDeviceSetupWidget.h +++ b/include/AudioDeviceSetupWidget.h @@ -2,6 +2,7 @@ * AudioDeviceSetupWidget.h - Base class for audio device setup widgets * * Copyright (c) 2004-2015 Tobias Doerffel + * Copyright (c) 2023- Michael Gregorius * * This file is part of LMMS - https://lmms.io * @@ -25,12 +26,12 @@ #ifndef LMMS_GUI_AUDIO_DEVICE_SETUP_WIDGET_H #define LMMS_GUI_AUDIO_DEVICE_SETUP_WIDGET_H -#include "TabWidget.h" +#include namespace lmms::gui { -class AudioDeviceSetupWidget : public TabWidget +class AudioDeviceSetupWidget : public QGroupBox { Q_OBJECT public: diff --git a/include/AudioDummy.h b/include/AudioDummy.h index c7ac3d67f9f..e342601717d 100644 --- a/include/AudioDummy.h +++ b/include/AudioDummy.h @@ -26,7 +26,7 @@ #define LMMS_AUDIO_DUMMY_H #include "AudioDevice.h" -#include "AudioDeviceSetupGroupWidget.h" +#include "AudioDeviceSetupWidget.h" #include "AudioEngine.h" #include "MicroTimer.h" @@ -54,11 +54,11 @@ class AudioDummy : public QThread, public AudioDevice } - class setupWidget : public gui::AudioDeviceSetupGroupWidget + class setupWidget : public gui::AudioDeviceSetupWidget { public: setupWidget( QWidget * _parent ) : - gui::AudioDeviceSetupGroupWidget( AudioDummy::name(), _parent ) + gui::AudioDeviceSetupWidget( AudioDummy::name(), _parent ) { } diff --git a/include/AudioJack.h b/include/AudioJack.h index 4135dc5e0f7..2ef0f665cbe 100644 --- a/include/AudioJack.h +++ b/include/AudioJack.h @@ -38,7 +38,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupGroupWidget.h" +#include "AudioDeviceSetupWidget.h" class QLineEdit; @@ -74,7 +74,7 @@ class AudioJack : public QObject, public AudioDevice } -class setupWidget : public gui::AudioDeviceSetupGroupWidget +class setupWidget : public gui::AudioDeviceSetupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioOss.h b/include/AudioOss.h index 953c72a4fa8..55f64de851e 100644 --- a/include/AudioOss.h +++ b/include/AudioOss.h @@ -32,7 +32,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupGroupWidget.h" +#include "AudioDeviceSetupWidget.h" class QLineEdit; @@ -61,7 +61,7 @@ class AudioOss : public QThread, public AudioDevice static QString probeDevice(); -class setupWidget : public gui::AudioDeviceSetupGroupWidget +class setupWidget : public gui::AudioDeviceSetupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioPortAudio.h b/include/AudioPortAudio.h index a926b1bf0ed..01b8f3fd7e8 100644 --- a/include/AudioPortAudio.h +++ b/include/AudioPortAudio.h @@ -35,7 +35,7 @@ # include # include "AudioDevice.h" -# include "AudioDeviceSetupGroupWidget.h" +# include "AudioDeviceSetupWidget.h" # if defined paNeverDropInput || defined paNonInterleaved # define PORTAUDIO_V19 @@ -90,7 +90,7 @@ class AudioPortAudio : public AudioDevice unsigned long _framesPerBuffer ); - class setupWidget : public gui::AudioDeviceSetupGroupWidget + class setupWidget : public gui::AudioDeviceSetupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioPulseAudio.h b/include/AudioPulseAudio.h index 22e47896d79..b6a99827479 100644 --- a/include/AudioPulseAudio.h +++ b/include/AudioPulseAudio.h @@ -34,7 +34,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupGroupWidget.h" +#include "AudioDeviceSetupWidget.h" class QLineEdit; @@ -62,7 +62,7 @@ class AudioPulseAudio : public QThread, public AudioDevice static QString probeDevice(); - class setupWidget : public gui::AudioDeviceSetupGroupWidget + class setupWidget : public gui::AudioDeviceSetupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/AudioSdl.h b/include/AudioSdl.h index 5f29596a50e..62db8b68ace 100644 --- a/include/AudioSdl.h +++ b/include/AudioSdl.h @@ -37,7 +37,7 @@ #endif #include "AudioDevice.h" -#include "AudioDeviceSetupGroupWidget.h" +#include "AudioDeviceSetupWidget.h" class QLineEdit; @@ -57,7 +57,7 @@ class AudioSdl : public AudioDevice } - class setupWidget : public gui::AudioDeviceSetupGroupWidget + class setupWidget : public gui::AudioDeviceSetupWidget { public: setupWidget( QWidget * _parent ); diff --git a/include/SetupDialog.h b/include/SetupDialog.h index 7097b320699..a68fe89cf4b 100644 --- a/include/SetupDialog.h +++ b/include/SetupDialog.h @@ -29,7 +29,7 @@ #include #include "AudioDevice.h" -#include "AudioDeviceSetupGroupWidget.h" +#include "AudioDeviceSetupWidget.h" #include "lmmsconfig.h" #include "MidiClient.h" #include "MidiSetupWidget.h" @@ -166,7 +166,7 @@ private slots: bool m_vstAlwaysOnTop; bool m_disableAutoQuit; - using AswMap = QMap; + using AswMap = QMap; using MswMap = QMap; using trMap = QMap; diff --git a/src/core/audio/AudioJack.cpp b/src/core/audio/AudioJack.cpp index 00024de6336..75d253671a4 100644 --- a/src/core/audio/AudioJack.cpp +++ b/src/core/audio/AudioJack.cpp @@ -452,7 +452,7 @@ void AudioJack::shutdownCallback( void * _udata ) AudioJack::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupGroupWidget( AudioJack::name(), _parent ) + AudioDeviceSetupWidget( AudioJack::name(), _parent ) { QFormLayout * form = new QFormLayout(this); diff --git a/src/core/audio/AudioOss.cpp b/src/core/audio/AudioOss.cpp index 5e0a8fc8984..b1b50907baa 100644 --- a/src/core/audio/AudioOss.cpp +++ b/src/core/audio/AudioOss.cpp @@ -318,7 +318,7 @@ void AudioOss::run() AudioOss::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupGroupWidget( AudioOss::name(), _parent ) + AudioDeviceSetupWidget( AudioOss::name(), _parent ) { QFormLayout * form = new QFormLayout(this); diff --git a/src/core/audio/AudioPortAudio.cpp b/src/core/audio/AudioPortAudio.cpp index cb0e4616ce3..c52ae8640d9 100644 --- a/src/core/audio/AudioPortAudio.cpp +++ b/src/core/audio/AudioPortAudio.cpp @@ -415,7 +415,7 @@ void AudioPortAudioSetupUtil::updateChannels() AudioPortAudio::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupGroupWidget( AudioPortAudio::name(), _parent ) + AudioDeviceSetupWidget( AudioPortAudio::name(), _parent ) { using gui::ComboBox; @@ -499,7 +499,7 @@ void AudioPortAudio::setupWidget::show() m_setupUtil.m_deviceModel.setValue( i ); } - AudioDeviceSetupGroupWidget::show(); + AudioDeviceSetupWidget::show(); } } // namespace lmms diff --git a/src/core/audio/AudioPulseAudio.cpp b/src/core/audio/AudioPulseAudio.cpp index 24913c60f5f..390bd0ba841 100644 --- a/src/core/audio/AudioPulseAudio.cpp +++ b/src/core/audio/AudioPulseAudio.cpp @@ -310,7 +310,7 @@ void AudioPulseAudio::signalConnected( bool connected ) AudioPulseAudio::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupGroupWidget( AudioPulseAudio::name(), _parent ) + AudioDeviceSetupWidget( AudioPulseAudio::name(), _parent ) { QFormLayout * form = new QFormLayout(this); diff --git a/src/core/audio/AudioSdl.cpp b/src/core/audio/AudioSdl.cpp index 071877f0d2b..794c486deb4 100644 --- a/src/core/audio/AudioSdl.cpp +++ b/src/core/audio/AudioSdl.cpp @@ -325,7 +325,7 @@ void AudioSdl::sdlInputAudioCallback(Uint8 *_buf, int _len) { #endif AudioSdl::setupWidget::setupWidget( QWidget * _parent ) : - AudioDeviceSetupGroupWidget( AudioSdl::name(), _parent ) + AudioDeviceSetupWidget( AudioSdl::name(), _parent ) { QFormLayout * form = new QFormLayout(this); diff --git a/src/gui/AudioAlsaSetupWidget.cpp b/src/gui/AudioAlsaSetupWidget.cpp index 015f4e8ad43..7db822b4be8 100644 --- a/src/gui/AudioAlsaSetupWidget.cpp +++ b/src/gui/AudioAlsaSetupWidget.cpp @@ -37,7 +37,7 @@ namespace lmms::gui { AudioAlsaSetupWidget::AudioAlsaSetupWidget( QWidget * _parent ) : - AudioDeviceSetupGroupWidget( AudioAlsa::name(), _parent ), + AudioDeviceSetupWidget( AudioAlsa::name(), _parent ), m_selectedDevice(-1) { QFormLayout * form = new QFormLayout(this); diff --git a/src/gui/AudioDeviceSetupGroupWidget.cpp b/src/gui/AudioDeviceSetupGroupWidget.cpp deleted file mode 100644 index f84c8bb8bbf..00000000000 --- a/src/gui/AudioDeviceSetupGroupWidget.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * AudioDeviceSetupGroupWidget.cpp - Base class for audio device setup widgets using group box - * - * Copyright (c) 2004-2015 Tobias Doerffel - * Copyright (c) 2004-2015 Michael Gregorius - * - * This file is part of LMMS - https://lmms.io - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program (see COPYING); if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. - * - */ - -#include "AudioDeviceSetupGroupWidget.h" - -namespace lmms::gui -{ - -AudioDeviceSetupGroupWidget::AudioDeviceSetupGroupWidget(const QString & caption, QWidget * parent) : - QGroupBox(QGroupBox::tr("Settings for %1").arg(tr(caption.toUtf8())), parent) -{ -} - -void AudioDeviceSetupGroupWidget::show() -{ - parentWidget()->show(); - QWidget::show(); -} - -} // namespace lmms::gui diff --git a/src/gui/AudioDeviceSetupWidget.cpp b/src/gui/AudioDeviceSetupWidget.cpp index b78800cecb7..98d03638f3c 100644 --- a/src/gui/AudioDeviceSetupWidget.cpp +++ b/src/gui/AudioDeviceSetupWidget.cpp @@ -28,7 +28,7 @@ namespace lmms::gui { AudioDeviceSetupWidget::AudioDeviceSetupWidget(const QString & caption, QWidget * parent) : - TabWidget(TabWidget::tr("Settings for %1").arg(tr(caption.toUtf8())), parent) + QGroupBox(QGroupBox::tr("Settings for %1").arg(tr(caption.toUtf8())), parent) { } @@ -38,4 +38,4 @@ void AudioDeviceSetupWidget::show() QWidget::show(); } -} // namespace lmms::gui \ No newline at end of file +} // namespace lmms::gui diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 3ae16c57347..9f940c0354b 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -3,7 +3,6 @@ SET(LMMS_SRCS gui/ActionGroup.cpp gui/AudioAlsaSetupWidget.cpp gui/AudioDeviceSetupWidget.cpp - gui/AudioDeviceSetupGroupWidget.cpp gui/AutomatableModelView.cpp gui/ControlLayout.cpp gui/ControllerDialog.cpp diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 87a54a9933a..23e1fe5d5a8 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -520,7 +520,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : it != m_audioIfaceSetupWidgets.end(); ++it) { m_audioIfaceNames[ - AudioDeviceSetupGroupWidget::tr(it.key().toUtf8())] = it.key(); + AudioDeviceSetupWidget::tr(it.key().toUtf8())] = it.key(); } for(trMap::iterator it = m_audioIfaceNames.begin(); it != m_audioIfaceNames.end(); ++it) From a429c2f94f338579176a81f230f0253b13e84650 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Tue, 25 Jul 2023 18:15:37 +0200 Subject: [PATCH 09/56] Adjustment of AudioSndio Adjust the layout that's created in AudioSndio::setupWidget::setupWidget by using a QFormLayout. This was done in a "blind" fashion as I am not able to compile this code. Adjustments are very similar to the ones done in AudioPulseAudio::setupWidget::setupWidget with commit b53290344b3 though. --- src/core/audio/AudioSndio.cpp | 13 +++++-------- src/gui/modals/SetupDialog.cpp | 1 - 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/core/audio/AudioSndio.cpp b/src/core/audio/AudioSndio.cpp index a8ea34ce1ec..8a1e0065376 100644 --- a/src/core/audio/AudioSndio.cpp +++ b/src/core/audio/AudioSndio.cpp @@ -28,7 +28,7 @@ #ifdef LMMS_HAVE_SNDIO #include -#include +#include #include #include "endian_handling.h" @@ -183,12 +183,10 @@ void AudioSndio::run() AudioSndio::setupWidget::setupWidget( QWidget * _parent ) : AudioDeviceSetupWidget( AudioSndio::name(), _parent ) { - m_device = new QLineEdit( "", this ); - m_device->setGeometry( 10, 20, 160, 20 ); + QFormLayout * form = new QFormLayout(this); - QLabel * dev_lbl = new QLabel( tr( "Device" ), this ); - dev_lbl->setFont( pointSize<6>( dev_lbl->font() ) ); - dev_lbl->setGeometry( 10, 40, 160, 10 ); + m_device = new QLineEdit( "", this ); + form->addRow(tr("Device"), m_device); gui::LcdSpinBoxModel * m = new gui::LcdSpinBoxModel( /* this */ ); m->setRange( DEFAULT_CHANNELS, SURROUND_CHANNELS ); @@ -198,9 +196,8 @@ AudioSndio::setupWidget::setupWidget( QWidget * _parent ) : m_channels = new gui::LcdSpinBox( 1, this ); m_channels->setModel( m ); - m_channels->setLabel( tr( "Channels" ) ); - m_channels->move( 180, 20 ); + form->addRow(tr("Channels"), m_channels); } diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 23e1fe5d5a8..7da234d0734 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -506,7 +506,6 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : new AudioOss::setupWidget(as_w); #endif -// TODO !!! #ifdef LMMS_HAVE_SNDIO m_audioIfaceSetupWidgets[AudioSndio::name()] = new AudioSndio::setupWidget(as_w); From 0759da2776139c59c98f16753d6ec1664cab44e8 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Tue, 25 Jul 2023 18:28:04 +0200 Subject: [PATCH 10/56] Layout adjustments for AudioSoundIo Use a QFormLayout in AudioSoundIo::setupWidget::setupWidget. Note: Changes have been done "blindly" as I am not able to compile this code. --- src/core/audio/AudioSoundIo.cpp | 16 +++++----------- src/gui/modals/SetupDialog.cpp | 1 - 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/core/audio/AudioSoundIo.cpp b/src/core/audio/AudioSoundIo.cpp index 6338082047b..23385960fc3 100644 --- a/src/core/audio/AudioSoundIo.cpp +++ b/src/core/audio/AudioSoundIo.cpp @@ -26,7 +26,7 @@ #ifdef LMMS_HAVE_SOUNDIO -#include +#include #include #include "Engine.h" @@ -451,19 +451,13 @@ AudioSoundIo::setupWidget::setupWidget( QWidget * _parent ) : { m_setupUtil.m_setupWidget = this; - m_backend = new gui::ComboBox( this, "BACKEND" ); - m_backend->setGeometry( 64, 15, 260, 20 ); + QFormLayout * form = new QFormLayout(this); - QLabel * backend_lbl = new QLabel( tr( "Backend" ), this ); - backend_lbl->setFont( pointSize<7>( backend_lbl->font() ) ); - backend_lbl->move( 8, 18 ); + m_backend = new gui::ComboBox( this, "BACKEND" ); + form->addRow(tr("Backend"), m_backend); m_device = new gui::ComboBox( this, "DEVICE" ); - m_device->setGeometry( 64, 35, 260, 20 ); - - QLabel * dev_lbl = new QLabel( tr( "Device" ), this ); - dev_lbl->setFont( pointSize<7>( dev_lbl->font() ) ); - dev_lbl->move( 8, 38 ); + form->addRow(tr("Device"), m_device); // Setup models m_soundio = soundio_create(); diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 7da234d0734..892155280f4 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -490,7 +490,6 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : new AudioPortAudio::setupWidget(as_w); #endif -// TODO !!! #ifdef LMMS_HAVE_SOUNDIO m_audioIfaceSetupWidgets[AudioSoundIo::name()] = new AudioSoundIo::setupWidget(as_w); From 4fac4c6c4a9a32a0d02dfd855c7685bcf1514fbb Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Tue, 25 Jul 2023 19:07:57 +0200 Subject: [PATCH 11/56] Fix a problem with some includes Remove a trailing ">" for some includes of `QFormLayout`. My local compiler did not complain but mingw rightfully does. --- src/core/audio/AudioOss.cpp | 2 +- src/core/audio/AudioSdl.cpp | 2 +- src/gui/MidiSetupWidget.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/audio/AudioOss.cpp b/src/core/audio/AudioOss.cpp index b1b50907baa..0b7812fe68b 100644 --- a/src/core/audio/AudioOss.cpp +++ b/src/core/audio/AudioOss.cpp @@ -27,7 +27,7 @@ #ifdef LMMS_HAVE_OSS #include -#include > +#include #include #include "endian_handling.h" diff --git a/src/core/audio/AudioSdl.cpp b/src/core/audio/AudioSdl.cpp index 794c486deb4..fa801f89020 100644 --- a/src/core/audio/AudioSdl.cpp +++ b/src/core/audio/AudioSdl.cpp @@ -26,7 +26,7 @@ #ifdef LMMS_HAVE_SDL -#include > +#include #include #include diff --git a/src/gui/MidiSetupWidget.cpp b/src/gui/MidiSetupWidget.cpp index d18c19babfb..2385def02dd 100644 --- a/src/gui/MidiSetupWidget.cpp +++ b/src/gui/MidiSetupWidget.cpp @@ -24,7 +24,7 @@ #include "MidiSetupWidget.h" -#include > +#include #include #include "ConfigManager.h" From f664698c80f8bf55992071a409cff4b24da84739 Mon Sep 17 00:00:00 2001 From: Bimal Poudel Date: Sun, 24 Sep 2023 16:58:56 -0600 Subject: [PATCH 12/56] Update copyright year (#6888) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4163ca5ccab..0b6d3b4ff82 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ INCLUDE(GenerateExportHeader) STRING(TOUPPER "${CMAKE_PROJECT_NAME}" PROJECT_NAME_UCASE) -SET(PROJECT_YEAR 2020) +SET(PROJECT_YEAR 2023) SET(PROJECT_AUTHOR "LMMS Developers") SET(PROJECT_URL "https://lmms.io") From 23ef89b4a15b6c7cccd7eae89f5fd512a460688a Mon Sep 17 00:00:00 2001 From: Bimal Poudel Date: Sun, 24 Sep 2023 19:03:29 -0600 Subject: [PATCH 13/56] Update SampleBuffer.cpp (#6892) File information corrected. --- src/core/SampleBuffer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/SampleBuffer.cpp b/src/core/SampleBuffer.cpp index 5e2d09c573e..c96111bba45 100644 --- a/src/core/SampleBuffer.cpp +++ b/src/core/SampleBuffer.cpp @@ -1389,7 +1389,7 @@ SampleBuffer * SampleBuffer::resample(const sample_rate_t srcSR, const sample_ra } else { - printf("Error: src_new() failed in sample_buffer.cpp!\n"); + printf("Error: src_new() failed in SampleBuffer.cpp!\n"); } dstSB->update(); return dstSB; @@ -1612,7 +1612,7 @@ SampleBuffer::handleState::handleState(bool varyingPitch, int interpolationMode) if ((m_resamplingData = src_new(interpolationMode, DEFAULT_CHANNELS, &error)) == nullptr) { - qDebug("Error: src_new() failed in sample_buffer.cpp!\n"); + qDebug("Error: src_new() failed in SampleBuffer.cpp!\n"); } } From 8fb9c3e6a26fa7a212bfe9f7dfd4f069001babab Mon Sep 17 00:00:00 2001 From: Dalton Messmer <33463986+messmerd@users.noreply.github.com> Date: Thu, 28 Sep 2023 20:23:35 -0400 Subject: [PATCH 14/56] Fix warnings in Clang build (#6893) * Fix unused variable warning * Fix implicit conversion warning * Fix unused lambda capture in DataFile.cpp * Fix implicit conversions in InstrumentFunctions.cpp * Fix operator precedence bug in Flags.h * Fix unused variable warning in Lv2UridMap.h * Fix unused lambda capture in MixerView.cpp * Fix unused lambda captures in SetupDialog.cpp * Fix unused lambda capture in TrackOperationsWidget.cpp * Fix MSVC build * Fix style * Remove unused member variable in Lv2UridMap.h --- include/Flags.h | 4 ++-- include/Lv2UridMap.h | 2 -- include/MidiEvent.h | 2 +- src/core/DataFile.cpp | 2 +- src/core/DrumSynth.cpp | 7 ++++--- src/core/InstrumentFunctions.cpp | 4 ++-- src/gui/MixerView.cpp | 2 +- src/gui/modals/SetupDialog.cpp | 6 +++--- src/gui/tracks/TrackOperationsWidget.cpp | 2 +- 9 files changed, 15 insertions(+), 16 deletions(-) diff --git a/include/Flags.h b/include/Flags.h index 76106dde660..62a5f8af8ba 100644 --- a/include/Flags.h +++ b/include/Flags.h @@ -48,8 +48,8 @@ class Flags m_value{value} {} - constexpr auto testAll(Flags flags) const -> bool { return *this & flags == flags; } - constexpr auto testAny(Flags flags) const -> bool { return *this & flags != Flags{}; } + constexpr auto testAll(Flags flags) const -> bool { return (*this & flags) == flags; } + constexpr auto testAny(Flags flags) const -> bool { return (*this & flags) != Flags{}; } constexpr auto testFlag(EnumType flag) const -> bool { return static_cast(*this & flag); } constexpr auto operator~() const -> Flags { return Flags{~m_value}; } diff --git a/include/Lv2UridMap.h b/include/Lv2UridMap.h index b8733023e5f..6c22aca3e40 100644 --- a/include/Lv2UridMap.h +++ b/include/Lv2UridMap.h @@ -55,8 +55,6 @@ class UridMap LV2_URID_Map m_mapFeature; LV2_URID_Unmap m_unmapFeature; - LV2_URID m_lastUrid = 0; - public: //! constructor; will set up the features UridMap(); diff --git a/include/MidiEvent.h b/include/MidiEvent.h index 956c33fb389..9a14e427c44 100644 --- a/include/MidiEvent.h +++ b/include/MidiEvent.h @@ -212,7 +212,7 @@ class MidiEvent int32_t m_sysExDataLen; // len of m_sysExData } m_data; - const char* m_sysExData; + [[maybe_unused]] const char* m_sysExData; const void* m_sourcePort; // Stores the source of the MidiEvent: Internal or External (hardware controllers). diff --git a/src/core/DataFile.cpp b/src/core/DataFile.cpp index 8d0a8dca43f..90e81907727 100644 --- a/src/core/DataFile.cpp +++ b/src/core/DataFile.cpp @@ -302,7 +302,7 @@ void DataFile::write( QTextStream & _strm ) bool DataFile::writeFile(const QString& filename, bool withResources) { // Small lambda function for displaying errors - auto showError = [this](QString title, QString body){ + auto showError = [](QString title, QString body){ if (gui::getGUI() != nullptr) { QMessageBox mb; diff --git a/src/core/DrumSynth.cpp b/src/core/DrumSynth.cpp index bc5455c96fc..decc6bfa26d 100644 --- a/src/core/DrumSynth.cpp +++ b/src/core/DrumSynth.cpp @@ -273,7 +273,9 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t *&wave, int channels, sa //generation long Length, tpos=0, tplus, totmp, t, i, j; float x[3] = {0.f, 0.f, 0.f}; - float MasterTune, randmax, randmax2; + float MasterTune; + constexpr float randmax = 1.f / static_cast(RAND_MAX); + constexpr float randmax2 = 2.f / static_cast(RAND_MAX); int MainFilter, HighPass; long NON, NT, TON, DiON, TDroop=0, DStep; @@ -454,7 +456,6 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t *&wave, int channels, sa } //prepare envelopes - randmax = 1.f / RAND_MAX; randmax2 = 2.f * randmax; for (i=1;i<8;i++) { envData[i][NEXTT]=0; envData[i][PNT]=0; } Length = LongestEnv(); @@ -745,4 +746,4 @@ int DrumSynth::GetDSFileSamples(QString dsfile, int16_t *&wave, int channels, sa } -} // namespace lmms \ No newline at end of file +} // namespace lmms diff --git a/src/core/InstrumentFunctions.cpp b/src/core/InstrumentFunctions.cpp index 431afd2fe5c..976363d3d08 100644 --- a/src/core/InstrumentFunctions.cpp +++ b/src/core/InstrumentFunctions.cpp @@ -409,7 +409,7 @@ void InstrumentFunctionArpeggio::processNote( NotePlayHandle * _n ) // Skip notes randomly if( m_arpSkipModel.value() ) { - if( 100 * ( (float) rand() / (float)( RAND_MAX + 1.0f ) ) < m_arpSkipModel.value() ) + if (100 * static_cast(rand()) / (static_cast(RAND_MAX) + 1.0f) < m_arpSkipModel.value()) { // update counters frames_processed += arp_frames; @@ -425,7 +425,7 @@ void InstrumentFunctionArpeggio::processNote( NotePlayHandle * _n ) if( m_arpMissModel.value() ) { - if( 100 * ( (float) rand() / (float)( RAND_MAX + 1.0f ) ) < m_arpMissModel.value() ) + if (100 * static_cast(rand()) / (static_cast(RAND_MAX) + 1.0f) < m_arpMissModel.value()) { dir = ArpDirection::Random; } diff --git a/src/gui/MixerView.cpp b/src/gui/MixerView.cpp index dff19ca3eb7..018e72c2b20 100644 --- a/src/gui/MixerView.cpp +++ b/src/gui/MixerView.cpp @@ -464,7 +464,7 @@ bool MixerView::confirmRemoval(int index) QString messageTitleRemoveTrack = tr("Confirm removal"); QString askAgainText = tr("Don't ask again"); auto askAgainCheckBox = new QCheckBox(askAgainText, nullptr); - connect(askAgainCheckBox, &QCheckBox::stateChanged, [this](int state) { + connect(askAgainCheckBox, &QCheckBox::stateChanged, [](int state) { // Invert button state, if it's checked we *shouldn't* ask again ConfigManager::inst()->setValue("ui", "mixerchanneldeletionwarning", state ? "0" : "1"); }); diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 0266285a7a4..09d6ab92c47 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -168,8 +168,8 @@ SetupDialog::SetupDialog(ConfigTab tab_to_open) : // Constants for positioning LED check boxes. - const int XDelta = 10; - const int YDelta = 18; + constexpr int XDelta = 10; + constexpr int YDelta = 18; // Main widget. auto main_w = new QWidget(this); @@ -212,7 +212,7 @@ SetupDialog::SetupDialog(ConfigTab tab_to_open) : auto generalControlsLayout = new QVBoxLayout; generalControlsLayout->setSpacing(10); - auto addLedCheckBox = [&XDelta, &YDelta, this](const QString& ledText, TabWidget* tw, int& counter, + auto addLedCheckBox = [&](const QString& ledText, TabWidget* tw, int& counter, bool initialState, const char* toggledSlot, bool showRestartWarning) { auto checkBox = new LedCheckBox(ledText, tw); counter++; diff --git a/src/gui/tracks/TrackOperationsWidget.cpp b/src/gui/tracks/TrackOperationsWidget.cpp index fa1a651f613..31edc4949a0 100644 --- a/src/gui/tracks/TrackOperationsWidget.cpp +++ b/src/gui/tracks/TrackOperationsWidget.cpp @@ -195,7 +195,7 @@ bool TrackOperationsWidget::confirmRemoval() QString messageTitleRemoveTrack = tr("Confirm removal"); QString askAgainText = tr("Don't ask again"); auto askAgainCheckBox = new QCheckBox(askAgainText, nullptr); - connect(askAgainCheckBox, &QCheckBox::stateChanged, [this](int state){ + connect(askAgainCheckBox, &QCheckBox::stateChanged, [](int state){ // Invert button state, if it's checked we *shouldn't* ask again ConfigManager::inst()->setValue("ui", "trackdeletionwarning", state ? "0" : "1"); }); From 7dc00524fa263a6aebef088f8ad9eb26a4884982 Mon Sep 17 00:00:00 2001 From: Oskar Wallgren Date: Fri, 29 Sep 2023 20:39:01 +0200 Subject: [PATCH 15/56] Mallets - Add random knob function (#6466) * Mallets - Add random knob function Implement randomness for the instrument. When Random is applied, Hardness and Position of instrument 1 - 9, or Modulator and Crossfade on instrument 10 (Tubular Bells), are nudged on every note to liven up the sound. With the modulated knobs placed at their center values, Random at max will select from the full range of possible values. Co-authored-by: saker Co-authored-by: Dominic Clark --- plugins/Stk/Mallets/Mallets.cpp | 44 ++++++++++++++++++++++++++++----- plugins/Stk/Mallets/Mallets.h | 2 ++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/plugins/Stk/Mallets/Mallets.cpp b/plugins/Stk/Mallets/Mallets.cpp index b746e949120..1bca0d40f09 100644 --- a/plugins/Stk/Mallets/Mallets.cpp +++ b/plugins/Stk/Mallets/Mallets.cpp @@ -87,6 +87,7 @@ MalletsInstrument::MalletsInstrument( InstrumentTrack * _instrument_track ): m_strikeModel( true, this, tr( "Bowed" ) ), m_presetsModel(this), m_spreadModel(0, 0, 255, 1, this, tr( "Spread" )), + m_randomModel(0.0f, 0.0f, 1.0f, 0.01f, this, tr("Randomness")), m_versionModel( MALLETS_PRESET_VERSION, 0, MALLETS_PRESET_VERSION, this, "" ), m_isOldVersionModel( false, this, "" ), m_filesMissing( !QDir( ConfigManager::inst()->stkDir() ).exists() || @@ -155,6 +156,7 @@ void MalletsInstrument::saveSettings( QDomDocument & _doc, QDomElement & _this ) m_presetsModel.saveSettings( _doc, _this, "preset" ); m_spreadModel.saveSettings( _doc, _this, "spread" ); + m_randomModel.saveSettings(_doc, _this, "randomness"); m_versionModel.saveSettings( _doc, _this, "version" ); m_isOldVersionModel.saveSettings( _doc, _this, "oldversion" ); } @@ -189,6 +191,7 @@ void MalletsInstrument::loadSettings( const QDomElement & _this ) m_presetsModel.loadSettings( _this, "preset" ); m_spreadModel.loadSettings( _this, "spread" ); + m_randomModel.loadSettings(_this, "randomness"); m_isOldVersionModel.loadSettings( _this, "oldversion" ); // To maintain backward compatibility @@ -284,7 +287,7 @@ void MalletsInstrument::playNote( NotePlayHandle * _n, } int p = m_presetsModel.value(); - + const float freq = _n->frequency(); if (!_n->m_pluginData) { @@ -293,6 +296,29 @@ void MalletsInstrument::playNote( NotePlayHandle * _n, m_isOldVersionModel.value() ? 100.0 : 200.0; const float vel = _n->getVolume() / velocityAdjust; + const float random = m_randomModel.value(); + float hardness = m_hardnessModel.value(); + float position = m_positionModel.value(); + float modulator = m_modulatorModel.value(); + float crossfade = m_crossfadeModel.value(); + + if (p < 9) + { + hardness += random * static_cast(fast_rand() % 128) - 64.0; + hardness = std::clamp(hardness, 0.0f, 128.0f); + + position += random * static_cast(fast_rand() % 64) - 32.0; + position = std::clamp(position, 0.0f, 64.0f); + } + else if (p == 9) + { + modulator += random * static_cast(fast_rand() % 128) - 64.0; + modulator = std::clamp(modulator, 0.0f, 128.0f); + + crossfade += random * static_cast(fast_rand() % 128) - 64.0; + crossfade = std::clamp(crossfade, 0.0f, 128.0f); + } + // critical section as STK is not thread-safe static QMutex m; m.lock(); @@ -301,8 +327,8 @@ void MalletsInstrument::playNote( NotePlayHandle * _n, _n->m_pluginData = new MalletsSynth( freq, vel, m_stickModel.value(), - m_hardnessModel.value(), - m_positionModel.value(), + hardness, + position, m_vibratoGainModel.value(), m_vibratoFreqModel.value(), p, @@ -315,8 +341,8 @@ void MalletsInstrument::playNote( NotePlayHandle * _n, vel, p, m_lfoDepthModel.value(), - m_modulatorModel.value(), - m_crossfadeModel.value(), + modulator, + crossfade, m_lfoSpeedModel.value(), m_adsrModel.value(), (uint8_t) m_spreadModel.value(), @@ -412,6 +438,11 @@ MalletsInstrumentView::MalletsInstrumentView( MalletsInstrument * _instrument, m_spreadKnob->move( 190, 140 ); m_spreadKnob->setHintText( tr( "Spread:" ), "" ); + m_randomKnob = new Knob(KnobType::Vintage32, this); + m_randomKnob->setLabel(tr("Random")); + m_randomKnob->move(190, 190); + m_randomKnob->setHintText(tr("Random:"), ""); + // try to inform user about missing Stk-installation if( _instrument->m_filesMissing && getGUI() != nullptr ) { @@ -467,7 +498,7 @@ QWidget * MalletsInstrumentView::setupModalBarControls( QWidget * _parent ) m_stickKnob->setLabel( tr( "Stick mix" ) ); m_stickKnob->move( 190, 90 ); m_stickKnob->setHintText( tr( "Stick mix:" ), "" ); - + return( widget ); } @@ -565,6 +596,7 @@ void MalletsInstrumentView::modelChanged() // m_strikeLED->setModel( &inst->m_strikeModel ); m_presetsCombo->setModel( &inst->m_presetsModel ); m_spreadKnob->setModel( &inst->m_spreadModel ); + m_randomKnob->setModel(&inst->m_randomModel); } diff --git a/plugins/Stk/Mallets/Mallets.h b/plugins/Stk/Mallets/Mallets.h index f66ac25d011..657d1538a95 100644 --- a/plugins/Stk/Mallets/Mallets.h +++ b/plugins/Stk/Mallets/Mallets.h @@ -197,6 +197,7 @@ class MalletsInstrument : public Instrument ComboBoxModel m_presetsModel; FloatModel m_spreadModel; + FloatModel m_randomModel; IntModel m_versionModel; BoolModel m_isOldVersionModel; @@ -255,6 +256,7 @@ public slots: ComboBox * m_presetsCombo; Knob * m_spreadKnob; + Knob * m_randomKnob; }; From d962070d7c84a1c1b0fa3877b41fe5d6365fdf69 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Sat, 30 Sep 2023 00:01:10 +0200 Subject: [PATCH 16/56] Fix release fade-out not being applied This fixes to bugs leading to clicks on instrument note-off in most instruments. The first bug was introduced as part of a refactoring done by Vesa [1] and caused each note play handle's last buffer being dropped because the play handles were deleted before being processed in AudioPort. Thanks to @lleroy for pointing this out. [2] The second bug / typo has always been there [3] and was a misplaced parenthesis in Instrument::applyRelease breaking the calculation of the note-off envelope's start frame, sometimes putting it outside of the buffer. Fixes #3086 [1] 857de8d2c829dc688745f41ba8eddbe148a63a20 and related commits [1] https://github.com/LMMS/lmms/issues/3086#issuecomment-519087089 [2] 02433380c629457ad021a1f9c91b8148769c33dc --- src/core/AudioEngine.cpp | 22 +++++++++++----------- src/core/Instrument.cpp | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/core/AudioEngine.cpp b/src/core/AudioEngine.cpp index 29c54647cf7..df274c188da 100644 --- a/src/core/AudioEngine.cpp +++ b/src/core/AudioEngine.cpp @@ -394,6 +394,17 @@ void AudioEngine::renderStageInstruments() AudioEngineWorkerThread::fillJobQueue(m_playHandles); AudioEngineWorkerThread::startAndWaitForJobs(); +} + + + +void AudioEngine::renderStageEffects() +{ + AudioEngineProfiler::Probe profilerProbe(m_profiler, AudioEngineProfiler::DetailType::Effects); + + // STAGE 2: process effects of all instrument- and sampletracks + AudioEngineWorkerThread::fillJobQueue(m_audioPorts); + AudioEngineWorkerThread::startAndWaitForJobs(); // removed all play handles which are done for( PlayHandleList::Iterator it = m_playHandles.begin(); @@ -424,17 +435,6 @@ void AudioEngine::renderStageInstruments() -void AudioEngine::renderStageEffects() -{ - AudioEngineProfiler::Probe profilerProbe(m_profiler, AudioEngineProfiler::DetailType::Effects); - - // STAGE 2: process effects of all instrument- and sampletracks - AudioEngineWorkerThread::fillJobQueue(m_audioPorts); - AudioEngineWorkerThread::startAndWaitForJobs(); -} - - - void AudioEngine::renderStageMix() { AudioEngineProfiler::Probe profilerProbe(m_profiler, AudioEngineProfiler::DetailType::Mixing); diff --git a/src/core/Instrument.cpp b/src/core/Instrument.cpp index b715bcac02c..fd729e3abc5 100644 --- a/src/core/Instrument.cpp +++ b/src/core/Instrument.cpp @@ -186,7 +186,7 @@ void Instrument::applyRelease( sampleFrame * buf, const NotePlayHandle * _n ) { for( fpp_t f = (fpp_t)( ( fl > desiredReleaseFrames() ) ? (std::max(fpp - desiredReleaseFrames(), 0) + - fl % fpp) : 0); f < frames; ++f) + fl) % fpp : 0); f < frames; ++f) { const float fac = (float)( fl-f-1 ) / desiredReleaseFrames(); From b29a46edf8d27106d7e43b0b3c27d7edce5554b3 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sat, 30 Sep 2023 12:12:04 +0200 Subject: [PATCH 17/56] Ensure minimum width for setup dialog Ensure that the dialog has a minimum width so that everything is shown. --- src/gui/modals/SetupDialog.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 892155280f4..effece1ba3c 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -870,6 +870,9 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : vlayout->addWidget(extras_w); vlayout->addSpacing(10); + // Ensure that we cannot make the dialog smaller than it wants to be + setMinimumWidth(width()); + show(); } From 4f94c3b13cec0b5c2326bc9ce08402f72fb0b2ac Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sat, 30 Sep 2023 21:15:10 +0200 Subject: [PATCH 18/56] Review change - Rectangular buttons Give the reset buttons for auto save and buffer size a rectangular shape. The size is fixed but the button and the pixmap scale with different scaling factors so that should be ok. --- src/gui/modals/SetupDialog.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index effece1ba3c..7faa9c9347f 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -372,6 +372,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : this, SLOT(setAutoSaveInterval(int))); auto autoSaveResetBtn = new QPushButton(embed::getIconPixmap("reload"), "", autoSaveBox); + autoSaveResetBtn->setFixedSize(32, 32); connect(autoSaveResetBtn, SIGNAL(clicked()), this, SLOT(resetAutoSave())); @@ -575,6 +576,7 @@ SetupDialog::SetupDialog(ConfigTabs tab_to_open) : bufferSizeSubLayout->addWidget(m_bufferSizeSlider, 1); auto bufferSize_reset_btn = new QPushButton(embed::getIconPixmap("reload"), "", bufferSizeBox); + bufferSize_reset_btn->setFixedSize(32, 32); connect(bufferSize_reset_btn, SIGNAL(clicked()), this, SLOT(resetBufferSize())); bufferSize_reset_btn->setToolTip( From 85310e75d3d6e658d3f7c101de884dd5194eb910 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sun, 1 Oct 2023 09:57:13 +0200 Subject: [PATCH 19/56] Order of includes and forward declarations Fix the alphabetical order of all includes and forward declarations. --- include/SetupDialog.h | 2 +- src/core/audio/AudioJack.cpp | 2 +- src/core/audio/AudioPulseAudio.cpp | 2 +- src/gui/modals/SetupDialog.cpp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/SetupDialog.h b/include/SetupDialog.h index f45b09dab5e..882ca2bedce 100644 --- a/include/SetupDialog.h +++ b/include/SetupDialog.h @@ -35,11 +35,11 @@ #include "MidiSetupWidget.h" +class QCheckBox; class QComboBox; class QLabel; class QLineEdit; class QSlider; -class QCheckBox; namespace lmms::gui diff --git a/src/core/audio/AudioJack.cpp b/src/core/audio/AudioJack.cpp index f5c3c160f48..83fa3c177f9 100644 --- a/src/core/audio/AudioJack.cpp +++ b/src/core/audio/AudioJack.cpp @@ -26,9 +26,9 @@ #ifdef LMMS_HAVE_JACK +#include #include #include -#include #include "Engine.h" #include "GuiApplication.h" diff --git a/src/core/audio/AudioPulseAudio.cpp b/src/core/audio/AudioPulseAudio.cpp index 2164a99f2dd..3ca8764cc47 100644 --- a/src/core/audio/AudioPulseAudio.cpp +++ b/src/core/audio/AudioPulseAudio.cpp @@ -22,8 +22,8 @@ * */ -#include #include +#include #include "AudioPulseAudio.h" diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 00344b1a188..c27992fa160 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -23,14 +23,14 @@ */ +#include #include +#include #include #include #include #include #include -#include -#include #include "AudioEngine.h" #include "debug.h" From d12675af2f19dd999bfe8f9ab249f21b7171cbd2 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sun, 1 Oct 2023 10:00:52 +0200 Subject: [PATCH 20/56] Remove unnecessary addStretch Remove an unnecessary call to `addStretch` and with that a TODO. --- src/gui/modals/SetupDialog.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index c27992fa160..06231d3825d 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -341,10 +341,6 @@ SetupDialog::SetupDialog(ConfigTab tab_to_open) : generalScroll->setWidgetResizable(true); general_layout->addWidget(generalScroll, 1); - // TODO Does not really seem to be needed - general_layout->addStretch(); - - // Performance widget. From cc6a0e86b5942c90b4b5c538cbcd8227faaec60a Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sun, 1 Oct 2023 10:17:08 +0200 Subject: [PATCH 21/56] Remove border/shadows from scroll area Remove the border/shadows from the QScrollAreas used in the context of the setup dialog via the style sheet. --- data/themes/default/style.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/themes/default/style.css b/data/themes/default/style.css index a49618b0a72..344aa051907 100644 --- a/data/themes/default/style.css +++ b/data/themes/default/style.css @@ -464,6 +464,10 @@ lmms--gui--EffectSelectDialog QScrollArea { background: #262b30; } +lmms--gui--SetupDialog QScrollArea { + border: 0px; +} + /* the inner boxes in LADSPA effect windows */ lmms--gui--EffectControlDialog QGroupBox { From 1399d5906f06d2f384e873abb1f5b0716f64ef02 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sun, 1 Oct 2023 10:21:34 +0200 Subject: [PATCH 22/56] Left align "General" and "Paths" Left align the scroll area content for "General" and "Paths" so that they look like the content on the other tabs. --- src/gui/modals/SetupDialog.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 06231d3825d..212ef92f0ef 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -208,6 +208,7 @@ SetupDialog::SetupDialog(ConfigTab tab_to_open) : // Path selectors layout. auto generalControlsLayout = new QVBoxLayout; generalControlsLayout->setSpacing(10); + generalControlsLayout->setContentsMargins(0, 0, 0, 0); auto addCheckBox = [&](const QString& ledText, QWidget* parent, QBoxLayout * layout, bool initialState, const char* toggledSlot, bool showRestartWarning) -> QCheckBox * { @@ -734,6 +735,7 @@ SetupDialog::SetupDialog(ConfigTab tab_to_open) : // Path selectors layout. auto pathSelectorsLayout = new QVBoxLayout; pathSelectorsLayout->setSpacing(10); + pathSelectorsLayout->setContentsMargins(0, 0, 0, 0); auto addPathEntry = [&](const QString& caption, const QString& content, const char* setSlot, const char* openSlot, QLineEdit*& lineEdit, const char* pixmap = "project_open") { From a54dc9a05f2ff73ea6c4f83012e9ec8a980a6979 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sun, 1 Oct 2023 10:34:21 +0200 Subject: [PATCH 23/56] Remove LedCheckBox include Enable the removal of the `LedCheckBox` include by commenting out code instead of using an `if(false)` statement. The commented out code was adjusted so that it would work with the current usage of layouts. --- src/gui/modals/SetupDialog.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index 212ef92f0ef..e64d1c572df 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -38,7 +38,6 @@ #include "Engine.h" #include "FileDialog.h" #include "gui_templates.h" -#include "LedCheckBox.h" #include "MainWindow.h" #include "MidiSetupWidget.h" #include "ProjectJournal.h" @@ -542,12 +541,10 @@ SetupDialog::SetupDialog(ConfigTab tab_to_open) : this, SLOT(audioInterfaceChanged(const QString&))); // Advanced setting, hidden for now - if(false) - { - // TODO Handle or remove. - auto useNaNHandler = new LedCheckBox(tr("Use built-in NaN handler"), audio_w); - useNaNHandler->setChecked(m_NaNHandler); - } + // // TODO Handle or remove. + // auto useNaNHandler = new LedCheckBox(tr("Use built-in NaN handler"), audio_w); + // audio_layout->addWidget(useNaNHandler); + // useNaNHandler->setChecked(m_NaNHandler); // HQ mode checkbox auto hqaudio = addCheckBox(tr("HQ mode for output audio device"), audioInterfaceBox, nullptr, From e1cc63bb971825a9be38f7a235a401eb807ad314 Mon Sep 17 00:00:00 2001 From: Rossmaxx <74815851+Rossmaxx@users.noreply.github.com> Date: Sun, 1 Oct 2023 19:25:25 +0530 Subject: [PATCH 24/56] Switched ladspaeffect/Cmakelists.txt to use `LMMS_HAVE_*` instead of `WANT_*` (#6903) * fixed cmakelists conditions * Fixed the order messup. Co-authored-by: Dominic Clark --------- Co-authored-by: Dominic Clark --- plugins/LadspaEffect/CMakeLists.txt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/LadspaEffect/CMakeLists.txt b/plugins/LadspaEffect/CMakeLists.txt index 951615ad4d0..a01eb950f1d 100644 --- a/plugins/LadspaEffect/CMakeLists.txt +++ b/plugins/LadspaEffect/CMakeLists.txt @@ -4,22 +4,22 @@ BUILD_PLUGIN(ladspaeffect LadspaEffect.cpp LadspaControls.cpp LadspaControlDialo SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/ladspa") -IF(WANT_CAPS) +IF(LMMS_HAVE_CAPS) ADD_SUBDIRECTORY(caps) -ENDIF(WANT_CAPS) +ENDIF() -IF(WANT_TAP) +IF(LMMS_HAVE_TAP) ADD_SUBDIRECTORY(tap) -ENDIF(WANT_TAP) +ENDIF() -IF(WANT_SWH) +IF(LMMS_HAVE_SWH) ADD_SUBDIRECTORY(swh) -ENDIF(WANT_SWH) +ENDIF() -IF(WANT_CMT) +IF(LMMS_HAVE_CMT) ADD_SUBDIRECTORY(cmt) -ENDIF(WANT_CMT) +ENDIF() -IF(WANT_CALF) +IF(LMMS_HAVE_CALF) ADD_SUBDIRECTORY(calf) -ENDIF(WANT_CALF) +ENDIF() From 579d132b8a3978c5a0e08534bbbce30b167bd129 Mon Sep 17 00:00:00 2001 From: Oskar Wallgren Date: Thu, 5 Oct 2023 16:51:52 +0200 Subject: [PATCH 25/56] SetupDialog - message on buffer size larger than 256 (#6906) LMMS supports the Lv2 feature powerOf2BlockLength. Plugins that need to be a power of two (32, 64, 128...) are not loaded if the buffer size setting is set to something else. However this logic breaks down on buffer sizes larger than 256. On larger sizes, LMMS works with chunks of 256 and plugins are still presented with a value of 256. So anything larger than 256 is a valid size as powerOf2BlockLength is concerned. LMMS supported powerOf2BlockLength correctly since 9c46370 but setup manager messages and comments are wrong in too strictly demanding an actual power of two value. 768 is not a power of two, but three chunks of 256 which are power of two values. Co-authored-by: Johannes Lorenz <1042576+JohannesLorenz@users.noreply.github.com> --- src/core/AudioEngine.cpp | 3 +++ src/gui/modals/SetupDialog.cpp | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/core/AudioEngine.cpp b/src/core/AudioEngine.cpp index 29c54647cf7..2f4459748c5 100644 --- a/src/core/AudioEngine.cpp +++ b/src/core/AudioEngine.cpp @@ -126,6 +126,9 @@ AudioEngine::AudioEngine( bool renderOnly ) : m_framesPerPeriod = DEFAULT_BUFFER_SIZE; } + // lmms works with chunks of size DEFAULT_BUFFER_SIZE (256) and only the final mix will use the actual + // buffer size. Plugins don't see a larger buffer size than 256. If m_framesPerPeriod is larger than + // DEFAULT_BUFFER_SIZE, it's set to DEFAULT_BUFFER_SIZE and the rest is handled by an increased fifoSize. else if( m_framesPerPeriod > DEFAULT_BUFFER_SIZE ) { fifoSize = m_framesPerPeriod / DEFAULT_BUFFER_SIZE; diff --git a/src/gui/modals/SetupDialog.cpp b/src/gui/modals/SetupDialog.cpp index e64d1c572df..209422563bc 100644 --- a/src/gui/modals/SetupDialog.cpp +++ b/src/gui/modals/SetupDialog.cpp @@ -1166,10 +1166,14 @@ void SetupDialog::audioInterfaceChanged(const QString & iface) void SetupDialog::updateBufferSizeWarning(int value) { QString text = "