File indexing completed on 2024-04-21 04:48:17

0001 /* AUDEX CDDA EXTRACTOR
0002  * SPDX-FileCopyrightText: Copyright (C) 2007 Marco Nelles
0003  * <https://userbase.kde.org/Audex>
0004  *
0005  * SPDX-License-Identifier: GPL-3.0-or-later
0006  */
0007 
0008 #include "lamewidget.h"
0009 
0010 #include <QDebug>
0011 
0012 lameWidget::lameWidget(Parameters *parameters, QWidget *parent)
0013     : lameWidgetUI(parent)
0014 {
0015     Q_UNUSED(parent);
0016 
0017     this->parameters = parameters;
0018     if (!parameters) {
0019         qDebug() << "ParameterString is NULL!";
0020         return;
0021     }
0022 
0023     bitrates << 80 << 96 << 112 << 128 << 160 << 192 << 224 << 256 << 320;
0024 
0025     real_bitrate = parameters->value(ENCODER_LAME_BITRATE_KEY, ENCODER_LAME_BITRATE).toInt();
0026     p_cbr_flag = parameters->value(ENCODER_LAME_CBR_KEY).toBool();
0027     enable_CBR(p_cbr_flag);
0028     preset = parameters->value(ENCODER_LAME_PRESET_KEY, ENCODER_LAME_PRESET).toInt();
0029     switch (preset) {
0030     case ENCODER_LAME_PRESET_MEDIUM:
0031         radioButton_medium->setChecked(true);
0032         enable_custom(false);
0033         break;
0034     case ENCODER_LAME_PRESET_STANDARD:
0035         radioButton_standard->setChecked(true);
0036         enable_custom(false);
0037         break;
0038     case ENCODER_LAME_PRESET_EXTREME:
0039         radioButton_extreme->setChecked(true);
0040         enable_custom(false);
0041         break;
0042     case ENCODER_LAME_PRESET_INSANE:
0043         radioButton_insane->setChecked(true);
0044         enable_custom(false);
0045         break;
0046     case ENCODER_LAME_PRESET_CUSTOM:
0047         radioButton_custom->setChecked(true);
0048         enable_custom(true);
0049         break;
0050     }
0051     checkBox_cbr->setChecked(p_cbr_flag);
0052     checkBox_embedcover->setChecked(parameters->value(ENCODER_LAME_EMBED_COVER_KEY).toBool());
0053     qlineedit_suffix->setText(parameters->value(ENCODER_LAME_SUFFIX_KEY, ENCODER_LAME_SUFFIX).toString());
0054 
0055     connect(radioButton_medium, SIGNAL(toggled(bool)), this, SLOT(enable_medium(bool)));
0056     connect(radioButton_medium, SIGNAL(toggled(bool)), this, SLOT(trigger_changed()));
0057     connect(radioButton_standard, SIGNAL(toggled(bool)), this, SLOT(enable_standard(bool)));
0058     connect(radioButton_standard, SIGNAL(toggled(bool)), this, SLOT(trigger_changed()));
0059     connect(radioButton_extreme, SIGNAL(toggled(bool)), this, SLOT(enable_extreme(bool)));
0060     connect(radioButton_extreme, SIGNAL(toggled(bool)), this, SLOT(trigger_changed()));
0061     connect(radioButton_insane, SIGNAL(toggled(bool)), this, SLOT(enable_insane(bool)));
0062     connect(radioButton_insane, SIGNAL(toggled(bool)), this, SLOT(trigger_changed()));
0063     connect(radioButton_custom, SIGNAL(toggled(bool)), this, SLOT(enable_custom(bool)));
0064     connect(radioButton_custom, SIGNAL(toggled(bool)), this, SLOT(trigger_changed()));
0065 
0066     connect(checkBox_cbr, SIGNAL(toggled(bool)), this, SLOT(enable_CBR(bool)));
0067     connect(checkBox_cbr, SIGNAL(toggled(bool)), this, SLOT(trigger_changed()));
0068 
0069     connect(horizontalSlider_bitrate, SIGNAL(valueChanged(int)), this, SLOT(bitrate_changed_by_slider(int)));
0070     connect(horizontalSlider_bitrate, SIGNAL(valueChanged(int)), this, SLOT(trigger_changed()));
0071 
0072     connect(kintspinbox_bitrate, SIGNAL(valueChanged(int)), this, SLOT(bitrate_changed_by_spinbox(int)));
0073     connect(kintspinbox_bitrate, SIGNAL(valueChanged(int)), this, SLOT(trigger_changed()));
0074 
0075     connect(checkBox_embedcover, SIGNAL(toggled(bool)), this, SLOT(trigger_changed()));
0076 
0077     connect(qlineedit_suffix, SIGNAL(textEdited(const QString &)), this, SLOT(trigger_changed()));
0078 
0079     changed = false;
0080 }
0081 
0082 lameWidget::~lameWidget()
0083 {
0084 }
0085 
0086 bool lameWidget::save()
0087 {
0088     bool success = true;
0089 
0090     parameters->setValue(ENCODER_LAME_PRESET_KEY, preset);
0091     parameters->setValue(ENCODER_LAME_BITRATE_KEY, real_bitrate);
0092     parameters->setValue(ENCODER_LAME_CBR_KEY, checkBox_cbr->isChecked());
0093     parameters->setValue(ENCODER_LAME_EMBED_COVER_KEY, checkBox_embedcover->isChecked());
0094     parameters->setValue(ENCODER_LAME_SUFFIX_KEY, qlineedit_suffix->text());
0095 
0096     changed = false;
0097 
0098     return success;
0099 }
0100 
0101 void lameWidget::enable_medium(bool enable)
0102 {
0103     if (enable)
0104         preset = ENCODER_LAME_PRESET_MEDIUM;
0105 }
0106 
0107 void lameWidget::enable_standard(bool enable)
0108 {
0109     if (enable)
0110         preset = ENCODER_LAME_PRESET_STANDARD;
0111 }
0112 
0113 void lameWidget::enable_extreme(bool enable)
0114 {
0115     if (enable)
0116         preset = ENCODER_LAME_PRESET_EXTREME;
0117 }
0118 
0119 void lameWidget::enable_insane(bool enable)
0120 {
0121     if (enable)
0122         preset = ENCODER_LAME_PRESET_INSANE;
0123 }
0124 
0125 void lameWidget::enable_custom(bool enable)
0126 {
0127     checkBox_cbr->setEnabled(enable);
0128     label_targetbitrate->setEnabled(enable);
0129     horizontalSlider_bitrate->setEnabled(enable);
0130     kintspinbox_bitrate->setEnabled(enable);
0131     label_lowest->setEnabled(enable);
0132     label_highest->setEnabled(enable);
0133     if (enable)
0134         preset = ENCODER_LAME_PRESET_CUSTOM;
0135 }
0136 
0137 template<class T>
0138 T square(const T &x)
0139 {
0140     return x * x;
0141 }
0142 
0143 void lameWidget::enable_CBR(bool enable)
0144 {
0145     if (enable) {
0146         // find the nearest neighbor
0147         int d = 0, nd = 0, nb = -1, i;
0148         for (i = 0; i < bitrates.count(); ++i) {
0149             nd = square(real_bitrate - bitrates[i]);
0150             if ((i > 0) && (nd > d)) {
0151                 nb = bitrates[i - 1];
0152                 break;
0153             }
0154             d = nd;
0155         }
0156         if (nb == -1)
0157             nb = bitrates.last();
0158 
0159         horizontalSlider_bitrate->blockSignals(true);
0160         horizontalSlider_bitrate->setMinimum(0);
0161         horizontalSlider_bitrate->setMaximum(8);
0162         horizontalSlider_bitrate->setSingleStep(1);
0163         horizontalSlider_bitrate->setPageStep(1);
0164         horizontalSlider_bitrate->setValue(i - 1);
0165         horizontalSlider_bitrate->blockSignals(false);
0166 
0167         kintspinbox_bitrate->blockSignals(true);
0168         kintspinbox_bitrate->setMinimum(80);
0169         kintspinbox_bitrate->setMaximum(320);
0170         kintspinbox_bitrate->setSingleStep(16);
0171         kintspinbox_bitrate->setValue(nb);
0172         kintspinbox_bitrate->setReadOnly(true);
0173         kintspinbox_bitrate->blockSignals(false);
0174 
0175         real_bitrate = nb;
0176 
0177         p_cbr_flag = true;
0178 
0179     } else {
0180         horizontalSlider_bitrate->blockSignals(true);
0181         horizontalSlider_bitrate->setMinimum(80);
0182         horizontalSlider_bitrate->setMaximum(320);
0183         horizontalSlider_bitrate->setSingleStep(1);
0184         horizontalSlider_bitrate->setPageStep(10);
0185         horizontalSlider_bitrate->setValue(real_bitrate);
0186         horizontalSlider_bitrate->blockSignals(false);
0187 
0188         kintspinbox_bitrate->blockSignals(true);
0189         kintspinbox_bitrate->setMinimum(80);
0190         kintspinbox_bitrate->setMaximum(320);
0191         kintspinbox_bitrate->setSingleStep(1);
0192         kintspinbox_bitrate->setValue(real_bitrate);
0193         kintspinbox_bitrate->setReadOnly(false);
0194         kintspinbox_bitrate->blockSignals(false);
0195 
0196         p_cbr_flag = false;
0197     }
0198 }
0199 
0200 void lameWidget::bitrate_changed_by_slider(int bitrate)
0201 {
0202     if (p_cbr_flag) {
0203         if (bitrate < 0)
0204             bitrate = 0;
0205         if (bitrate >= bitrates.count())
0206             bitrate = bitrates.count() - 1;
0207 
0208         kintspinbox_bitrate->blockSignals(true);
0209         kintspinbox_bitrate->setValue(bitrates[bitrate]);
0210         kintspinbox_bitrate->blockSignals(false);
0211 
0212         real_bitrate = bitrates[bitrate];
0213 
0214     } else {
0215         kintspinbox_bitrate->blockSignals(true);
0216         kintspinbox_bitrate->setValue(bitrate);
0217         kintspinbox_bitrate->blockSignals(false);
0218 
0219         real_bitrate = bitrate;
0220     }
0221 }
0222 
0223 void lameWidget::bitrate_changed_by_spinbox(int bitrate)
0224 {
0225     if (!p_cbr_flag) {
0226         horizontalSlider_bitrate->blockSignals(true);
0227         horizontalSlider_bitrate->setValue(bitrate);
0228         horizontalSlider_bitrate->blockSignals(false);
0229 
0230         real_bitrate = bitrate;
0231     }
0232 }
0233 
0234 void lameWidget::trigger_changed()
0235 {
0236     changed = (preset != parameters->value(ENCODER_LAME_PRESET_KEY, ENCODER_LAME_PRESET).toInt()
0237                || real_bitrate != parameters->value(ENCODER_LAME_BITRATE_KEY, ENCODER_LAME_BITRATE).toInt()
0238                || checkBox_cbr->isChecked() != parameters->value(ENCODER_LAME_CBR_KEY).toBool()
0239                || checkBox_embedcover->isChecked() != parameters->value(ENCODER_LAME_EMBED_COVER_KEY).toBool()
0240                || qlineedit_suffix->text() != parameters->value(ENCODER_LAME_SUFFIX_KEY, ENCODER_LAME_SUFFIX).toString());
0241 
0242     Q_EMIT triggerChanged();
0243 }