BackendSettingsPage: add "EBU R 128 loudness normalization"-related settings
Change `Use Replay Gain metadata if it is available` checkbox
into a radio button and add button to disable any loudness normalization.
Add second group(+radio button), for EBU R 128 loudness normalization.
There is only one tunable: Target Level,
defaulting to EBU R 128-recommended `-23 LUFS`.
Care should be taken when changing Target Level!
You probably don't want to go outside of `-30..-16` range!
At least as implemented, there is only support for per-song normalization,
i.e. no per-album normalization.
We do not do anything with loudness range,
although i have some further thoughts about compression.
We do not do anything about clipping / peak level.
NOTE: we do not need `libebur128` to *perform* the audio normalization,
only for the initial analysis.
Co-authored-by: Jonas Kvinge <jonas@jkvinge.net>
This commit is contained in:
committed by
Jonas Kvinge
parent
9a7949297e
commit
0ea81b13b9
@@ -74,6 +74,8 @@ BackendSettingsPage::BackendSettingsPage(SettingsDialog *dialog, QWidget *parent
|
||||
ui_->label_replaygainpreamp->setMinimumWidth(QFontMetrics(ui_->label_replaygainpreamp->font()).horizontalAdvance("-WW.W dB"));
|
||||
ui_->label_replaygainfallbackgain->setMinimumWidth(QFontMetrics(ui_->label_replaygainfallbackgain->font()).horizontalAdvance("-WW.W dB"));
|
||||
|
||||
ui_->label_ebur128_target_level->setMinimumWidth(QFontMetrics(ui_->label_ebur128_target_level->font()).horizontalAdvance("-WW.W LUFS"));
|
||||
|
||||
QObject::connect(ui_->combobox_engine, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &BackendSettingsPage::EngineChanged);
|
||||
QObject::connect(ui_->combobox_output, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &BackendSettingsPage::OutputChanged);
|
||||
QObject::connect(ui_->combobox_device, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &BackendSettingsPage::DeviceSelectionChanged);
|
||||
@@ -85,6 +87,9 @@ BackendSettingsPage::BackendSettingsPage(SettingsDialog *dialog, QWidget *parent
|
||||
#endif
|
||||
QObject::connect(ui_->stickyslider_replaygainpreamp, &StickySlider::valueChanged, this, &BackendSettingsPage::RgPreampChanged);
|
||||
QObject::connect(ui_->stickyslider_replaygainfallbackgain, &StickySlider::valueChanged, this, &BackendSettingsPage::RgFallbackGainChanged);
|
||||
#ifdef HAVE_GSTREAMER
|
||||
QObject::connect(ui_->stickyslider_ebur128_target_level, &StickySlider::valueChanged, this, &BackendSettingsPage::EbuR128TargetLevelChanged);
|
||||
#endif
|
||||
QObject::connect(ui_->checkbox_fadeout_stop, &QCheckBox::toggled, this, &BackendSettingsPage::FadingOptionsChanged);
|
||||
QObject::connect(ui_->checkbox_fadeout_cross, &QCheckBox::toggled, this, &BackendSettingsPage::FadingOptionsChanged);
|
||||
QObject::connect(ui_->checkbox_fadeout_auto, &QCheckBox::toggled, this, &BackendSettingsPage::FadingOptionsChanged);
|
||||
@@ -161,12 +166,21 @@ void BackendSettingsPage::Load() {
|
||||
ui_->spinbox_low_watermark->setValue(s.value("bufferlowwatermark", kDefaultBufferLowWatermark).toDouble());
|
||||
ui_->spinbox_high_watermark->setValue(s.value("bufferhighwatermark", kDefaultBufferHighWatermark).toDouble());
|
||||
|
||||
ui_->checkbox_replaygain->setChecked(s.value("rgenabled", false).toBool());
|
||||
ui_->radiobutton_replaygain->setChecked(s.value("rgenabled", false).toBool());
|
||||
ui_->combobox_replaygainmode->setCurrentIndex(s.value("rgmode", 0).toInt());
|
||||
ui_->stickyslider_replaygainpreamp->setValue(static_cast<int>(s.value("rgpreamp", 0.0).toDouble() * 10 + 600));
|
||||
ui_->checkbox_replaygaincompression->setChecked(s.value("rgcompression", true).toBool());
|
||||
ui_->stickyslider_replaygainfallbackgain->setValue(static_cast<int>(s.value("rgfallbackgain", 0.0).toDouble() * 10 + 600));
|
||||
|
||||
#ifdef HAVE_GSTREAMER
|
||||
ui_->groupbox_ebur128->show();
|
||||
#else
|
||||
ui_->groupbox_ebur128->hide();
|
||||
#endif
|
||||
|
||||
ui_->radiobutton_ebur128_loudness_normalization->setChecked(s.value("ebur128_loudness_normalization", false).toBool());
|
||||
ui_->stickyslider_ebur128_target_level->setValue(static_cast<int>(s.value("ebur128_target_level_lufs", -23.0).toDouble() * 10));
|
||||
|
||||
#ifdef HAVE_ALSA
|
||||
bool fade_default = false;
|
||||
#else
|
||||
@@ -197,6 +211,10 @@ void BackendSettingsPage::Load() {
|
||||
RgPreampChanged(ui_->stickyslider_replaygainpreamp->value());
|
||||
RgFallbackGainChanged(ui_->stickyslider_replaygainfallbackgain->value());
|
||||
|
||||
#ifdef HAVE_GSTREAMER
|
||||
EbuR128TargetLevelChanged(ui_->stickyslider_ebur128_target_level->value());
|
||||
#endif
|
||||
|
||||
Init(ui_->layout_backendsettingspage->parentWidget());
|
||||
if (!QSettings().childGroups().contains(kSettingsGroup)) set_changed();
|
||||
|
||||
@@ -251,6 +269,7 @@ void BackendSettingsPage::Load_Engine(const EngineBase::Type enginetype) {
|
||||
ui_->lineedit_device->clear();
|
||||
|
||||
ui_->groupbox_replaygain->setEnabled(false);
|
||||
ui_->groupbox_ebur128->setEnabled(false);
|
||||
|
||||
if (engine()->type() != enginetype) {
|
||||
qLog(Debug) << "Switching engine.";
|
||||
@@ -304,10 +323,12 @@ void BackendSettingsPage::Load_Output(QString output, QVariant device) {
|
||||
if (engine()->type() == EngineBase::Type::GStreamer) {
|
||||
ui_->groupbox_buffer->setEnabled(true);
|
||||
ui_->groupbox_replaygain->setEnabled(true);
|
||||
ui_->groupbox_ebur128->setEnabled(true);
|
||||
}
|
||||
else {
|
||||
ui_->groupbox_buffer->setEnabled(false);
|
||||
ui_->groupbox_replaygain->setEnabled(false);
|
||||
ui_->groupbox_ebur128->setEnabled(false);
|
||||
}
|
||||
|
||||
if (ui_->combobox_output->count() >= 1) Load_Device(output, device);
|
||||
@@ -474,12 +495,15 @@ void BackendSettingsPage::Save() {
|
||||
s.setValue("bufferlowwatermark", ui_->spinbox_low_watermark->value());
|
||||
s.setValue("bufferhighwatermark", ui_->spinbox_high_watermark->value());
|
||||
|
||||
s.setValue("rgenabled", ui_->checkbox_replaygain->isChecked());
|
||||
s.setValue("rgenabled", ui_->radiobutton_replaygain->isChecked());
|
||||
s.setValue("rgmode", ui_->combobox_replaygainmode->currentIndex());
|
||||
s.setValue("rgpreamp", static_cast<double>(ui_->stickyslider_replaygainpreamp->value()) / 10 - 60);
|
||||
s.setValue("rgfallbackgain", static_cast<double>(ui_->stickyslider_replaygainfallbackgain->value()) / 10 - 60);
|
||||
s.setValue("rgcompression", ui_->checkbox_replaygaincompression->isChecked());
|
||||
|
||||
s.setValue("ebur128_loudness_normalization", ui_->radiobutton_ebur128_loudness_normalization->isChecked());
|
||||
s.setValue("ebur128_target_level_lufs", static_cast<double>(ui_->stickyslider_ebur128_target_level->value()) / 10);
|
||||
|
||||
s.setValue("FadeoutEnabled", ui_->checkbox_fadeout_stop->isChecked());
|
||||
s.setValue("CrossfadeEnabled", ui_->checkbox_fadeout_cross->isChecked());
|
||||
s.setValue("AutoCrossfadeEnabled", ui_->checkbox_fadeout_auto->isChecked());
|
||||
@@ -638,6 +662,16 @@ void BackendSettingsPage::RgFallbackGainChanged(const int value) {
|
||||
|
||||
}
|
||||
|
||||
#ifdef HAVE_GSTREAMER
|
||||
void BackendSettingsPage::EbuR128TargetLevelChanged(const int value) {
|
||||
|
||||
double db = static_cast<double>(value) / 10;
|
||||
QString db_str = QString::asprintf("%+.1f LUFS", db);
|
||||
ui_->label_ebur128_target_level->setText(db_str);
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ALSA
|
||||
void BackendSettingsPage::SwitchALSADevices(const ALSAPluginType alsa_plugin_type) {
|
||||
|
||||
|
||||
@@ -68,6 +68,9 @@ class BackendSettingsPage : public SettingsPage {
|
||||
void DeviceStringChanged();
|
||||
void RgPreampChanged(const int value);
|
||||
void RgFallbackGainChanged(const int value);
|
||||
#ifdef HAVE_GSTREAMER
|
||||
void EbuR128TargetLevelChanged(const int value);
|
||||
#endif
|
||||
void radiobutton_alsa_hw_clicked(const bool checked);
|
||||
void radiobutton_alsa_plughw_clicked(const bool checked);
|
||||
void radiobutton_alsa_pcm_clicked(const bool checked);
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>583</width>
|
||||
<height>1097</height>
|
||||
<width>717</width>
|
||||
<height>1245</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -409,131 +409,235 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupbox_replaygain">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Replay Gain</string>
|
||||
<string>Audio normalization</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="layout_replay_gain">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="checkbox_replaygain">
|
||||
<property name="enabled">
|
||||
<widget class="QRadioButton" name="radiobutton_no_audio_normalization">
|
||||
<property name="text">
|
||||
<string>No audio normalization</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Use Replay Gain metadata if it is available</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup_audio_normalization</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QWidget" name="widget_replaygain" native="true">
|
||||
<widget class="QGroupBox" name="groupbox_replaygain">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_4">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_regainmode">
|
||||
<property name="text">
|
||||
<string>Replay Gain mode</string>
|
||||
<property name="title">
|
||||
<string>Replay Gain</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="layout_replay_gain">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radiobutton_replaygain">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Use Replay Gain metadata if it is available</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup_audio_normalization</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="combobox_replaygainmode">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Radio (equal loudness for all tracks)</string>
|
||||
<item>
|
||||
<widget class="QWidget" name="widget_replaygain" native="true">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_4">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Album (ideal loudness for all tracks)</string>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</item>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_regainmode">
|
||||
<property name="text">
|
||||
<string>Replay Gain mode</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="combobox_replaygainmode">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Radio (equal loudness for all tracks)</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Album (ideal loudness for all tracks)</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_preamp">
|
||||
<property name="text">
|
||||
<string>Pre-amp</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QHBoxLayout" name="layout_replayagainpreamp">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_replaygainpreamp"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="StickySlider" name="stickyslider_replaygainpreamp">
|
||||
<property name="maximum">
|
||||
<number>1200</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>600</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sticky_center" stdset="0">
|
||||
<number>600</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="checkbox_replaygaincompression">
|
||||
<property name="text">
|
||||
<string>Apply compression to prevent clipping</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<layout class="QHBoxLayout" name="layout_replaygainfallbackgain">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_replaygainfallbackgain"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="StickySlider" name="stickyslider_replaygainfallbackgain">
|
||||
<property name="minimum">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1200</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>600</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sticky_center" stdset="0">
|
||||
<number>600</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_fallbackgain">
|
||||
<property name="text">
|
||||
<string>Fallback-gain</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_preamp">
|
||||
<property name="text">
|
||||
<string>Pre-amp</string>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupbox_ebur128">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>EBU R 128 Loudness Normalization</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="layout_ebur128">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="radiobutton_ebur128_loudness_normalization">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Perform track loudness normalization</string>
|
||||
</property>
|
||||
<attribute name="buttonGroup">
|
||||
<string notr="true">buttonGroup_audio_normalization</string>
|
||||
</attribute>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QHBoxLayout" name="layout_replayagainpreamp">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_replaygainpreamp"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="StickySlider" name="stickyslider_replaygainpreamp">
|
||||
<property name="maximum">
|
||||
<number>1200</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>600</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sticky_center" stdset="0">
|
||||
<number>600</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="checkbox_replaygaincompression">
|
||||
<property name="text">
|
||||
<string>Apply compression to prevent clipping</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<layout class="QHBoxLayout" name="layout_replaygainfallbackgain">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_replaygainfallbackgain"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="StickySlider" name="stickyslider_replaygainfallbackgain">
|
||||
<property name="minimum">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1200</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>600</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sticky_center" stdset="0">
|
||||
<number>600</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_fallbackgain">
|
||||
<property name="text">
|
||||
<string>Fallback-gain</string>
|
||||
<item>
|
||||
<widget class="QWidget" name="widget_ebur128" native="true">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_ebur128">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_ebur128_target_level_label">
|
||||
<property name="text">
|
||||
<string>Target Level</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<layout class="QHBoxLayout" name="layout_ebur128_target_level">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_ebur128_target_level"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="StickySlider" name="stickyslider_ebur128_target_level">
|
||||
<property name="minimum">
|
||||
<number>-480</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>-230</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sticky_center" stdset="0">
|
||||
<number>-230</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
@@ -735,7 +839,7 @@
|
||||
<tabstop>spinbox_low_watermark</tabstop>
|
||||
<tabstop>spinbox_high_watermark</tabstop>
|
||||
<tabstop>button_buffer_defaults</tabstop>
|
||||
<tabstop>checkbox_replaygain</tabstop>
|
||||
<tabstop>radiobutton_replaygain</tabstop>
|
||||
<tabstop>combobox_replaygainmode</tabstop>
|
||||
<tabstop>stickyslider_replaygainpreamp</tabstop>
|
||||
<tabstop>stickyslider_replaygainfallbackgain</tabstop>
|
||||
@@ -751,20 +855,43 @@
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>checkbox_replaygain</sender>
|
||||
<sender>radiobutton_ebur128_loudness_normalization</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>widget_ebur128</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>429</x>
|
||||
<y>835</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>429</x>
|
||||
<y>890</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>radiobutton_replaygain</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>widget_replaygain</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>110</x>
|
||||
<y>465</y>
|
||||
<x>429</x>
|
||||
<y>640</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>164</x>
|
||||
<y>573</y>
|
||||
<x>429</x>
|
||||
<y>717</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
<buttongroups>
|
||||
<buttongroup name="buttonGroup_audio_normalization">
|
||||
<property name="exclusive">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</buttongroup>
|
||||
</buttongroups>
|
||||
</ui>
|
||||
|
||||
Reference in New Issue
Block a user