From 7dac1137bc14aace187cd5e4cb22076b629cca4c Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 15 Mar 2014 10:45:55 +0200 Subject: [PATCH 1/6] Knob: add volumeRatio property to allow showing knobs with ratios other than 100 in dBV Waveshaper, Dynamics processor: make input/output knobs respect the show in dBV setting --- include/knob.h | 3 +++ .../dynamics_processor/dynamics_processor_control_dialog.cpp | 4 ++++ plugins/waveshaper/waveshaper_control_dialog.cpp | 4 ++++ src/gui/widgets/knob.cpp | 3 ++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/knob.h b/include/knob.h index 2c6d8de07..81141220d 100644 --- a/include/knob.h +++ b/include/knob.h @@ -58,6 +58,8 @@ class EXPORT knob : public QWidget, public FloatModelView // correctly so we need to do this: Q_PROPERTY(QColor outerColor READ outerColor WRITE setOuterColor) mapPropertyFromModel(bool,isVolumeKnob,setVolumeKnob,m_volumeKnob); + mapPropertyFromModel(float,volumeRatio,setVolumeRatio,m_volumeRatio); + public: knob( int _knob_num, QWidget * _parent = NULL, const QString & _name = QString() ); virtual ~knob(); @@ -149,6 +151,7 @@ private: QPixmap * m_knobPixmap; BoolModel m_volumeKnob; + FloatModel m_volumeRatio; QPoint m_mouseOffset; QPoint m_origMousePos; diff --git a/plugins/dynamics_processor/dynamics_processor_control_dialog.cpp b/plugins/dynamics_processor/dynamics_processor_control_dialog.cpp index 6fcb1d1d6..e92e8e6d0 100644 --- a/plugins/dynamics_processor/dynamics_processor_control_dialog.cpp +++ b/plugins/dynamics_processor/dynamics_processor_control_dialog.cpp @@ -58,12 +58,16 @@ dynProcControlDialog::dynProcControlDialog( waveGraph -> setMaximumSize( 204, 205 ); knob * inputKnob = new knob( knobBright_26, this); + inputKnob -> setVolumeKnob( true ); + inputKnob -> setVolumeRatio( 1.0 ); inputKnob -> move( 14, 251 ); inputKnob->setModel( &_controls->m_inputModel ); inputKnob->setLabel( tr( "INPUT" ) ); inputKnob->setHintText( tr( "Input gain:" ) + " ", "" ); knob * outputKnob = new knob( knobBright_26, this ); + outputKnob -> setVolumeKnob( true ); + outputKnob -> setVolumeRatio( 1.0 ); outputKnob -> move( 54, 251 ); outputKnob->setModel( &_controls->m_outputModel ); outputKnob->setLabel( tr( "OUTPUT" ) ); diff --git a/plugins/waveshaper/waveshaper_control_dialog.cpp b/plugins/waveshaper/waveshaper_control_dialog.cpp index 5adb373de..b32b5b211 100644 --- a/plugins/waveshaper/waveshaper_control_dialog.cpp +++ b/plugins/waveshaper/waveshaper_control_dialog.cpp @@ -58,12 +58,16 @@ waveShaperControlDialog::waveShaperControlDialog( waveGraph -> setMaximumSize( 204, 205 ); knob * inputKnob = new knob( knobBright_26, this); + inputKnob -> setVolumeKnob( true ); + inputKnob -> setVolumeRatio( 1.0 ); inputKnob -> move( 14, 251 ); inputKnob->setModel( &_controls->m_inputModel ); inputKnob->setLabel( tr( "INPUT" ) ); inputKnob->setHintText( tr( "Input gain:" ) + " ", "" ); knob * outputKnob = new knob( knobBright_26, this ); + outputKnob -> setVolumeKnob( true ); + outputKnob -> setVolumeRatio( 1.0 ); outputKnob -> move( 54, 251 ); outputKnob->setModel( &_controls->m_outputModel ); outputKnob->setLabel( tr( "OUTPUT" ) ); diff --git a/src/gui/widgets/knob.cpp b/src/gui/widgets/knob.cpp index 074f32813..73f00d84a 100644 --- a/src/gui/widgets/knob.cpp +++ b/src/gui/widgets/knob.cpp @@ -61,6 +61,7 @@ knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) : m_label( "" ), m_knobPixmap( NULL ), m_volumeKnob( false ), + m_volumeRatio( 100.0, 0.0, 1000000.0 ), m_buttonPressed( false ), m_angle( -10 ), m_outerColor( NULL ) @@ -668,7 +669,7 @@ QString knob::displayValue() const configManager::inst()->value( "app", "displaydbv" ).toInt() ) { return m_description.trimmed() + QString( " %1 dBV" ). - arg( 20.0 * log10( model()->value() / 100.0 ), + arg( 20.0 * log10( model()->value() / volumeRatio() ), 3, 'f', 2 ); } return m_description.trimmed() + QString( " %1" ). From cf925d7c5bfa946681780cee39f4aa6662d8a2fd Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 15 Mar 2014 10:45:55 +0200 Subject: [PATCH 2/6] Knob: add volumeRatio property to allow showing knobs with ratios other than 100 in dBV Waveshaper, Dynamics processor: make input/output knobs respect the show in dBV setting --- include/knob.h | 3 +++ .../dynamics_processor/dynamics_processor_control_dialog.cpp | 4 ++++ plugins/waveshaper/waveshaper_control_dialog.cpp | 4 ++++ src/gui/widgets/knob.cpp | 3 ++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/knob.h b/include/knob.h index 2c6d8de07..81141220d 100644 --- a/include/knob.h +++ b/include/knob.h @@ -58,6 +58,8 @@ class EXPORT knob : public QWidget, public FloatModelView // correctly so we need to do this: Q_PROPERTY(QColor outerColor READ outerColor WRITE setOuterColor) mapPropertyFromModel(bool,isVolumeKnob,setVolumeKnob,m_volumeKnob); + mapPropertyFromModel(float,volumeRatio,setVolumeRatio,m_volumeRatio); + public: knob( int _knob_num, QWidget * _parent = NULL, const QString & _name = QString() ); virtual ~knob(); @@ -149,6 +151,7 @@ private: QPixmap * m_knobPixmap; BoolModel m_volumeKnob; + FloatModel m_volumeRatio; QPoint m_mouseOffset; QPoint m_origMousePos; diff --git a/plugins/dynamics_processor/dynamics_processor_control_dialog.cpp b/plugins/dynamics_processor/dynamics_processor_control_dialog.cpp index 6fcb1d1d6..e92e8e6d0 100644 --- a/plugins/dynamics_processor/dynamics_processor_control_dialog.cpp +++ b/plugins/dynamics_processor/dynamics_processor_control_dialog.cpp @@ -58,12 +58,16 @@ dynProcControlDialog::dynProcControlDialog( waveGraph -> setMaximumSize( 204, 205 ); knob * inputKnob = new knob( knobBright_26, this); + inputKnob -> setVolumeKnob( true ); + inputKnob -> setVolumeRatio( 1.0 ); inputKnob -> move( 14, 251 ); inputKnob->setModel( &_controls->m_inputModel ); inputKnob->setLabel( tr( "INPUT" ) ); inputKnob->setHintText( tr( "Input gain:" ) + " ", "" ); knob * outputKnob = new knob( knobBright_26, this ); + outputKnob -> setVolumeKnob( true ); + outputKnob -> setVolumeRatio( 1.0 ); outputKnob -> move( 54, 251 ); outputKnob->setModel( &_controls->m_outputModel ); outputKnob->setLabel( tr( "OUTPUT" ) ); diff --git a/plugins/waveshaper/waveshaper_control_dialog.cpp b/plugins/waveshaper/waveshaper_control_dialog.cpp index 5adb373de..b32b5b211 100644 --- a/plugins/waveshaper/waveshaper_control_dialog.cpp +++ b/plugins/waveshaper/waveshaper_control_dialog.cpp @@ -58,12 +58,16 @@ waveShaperControlDialog::waveShaperControlDialog( waveGraph -> setMaximumSize( 204, 205 ); knob * inputKnob = new knob( knobBright_26, this); + inputKnob -> setVolumeKnob( true ); + inputKnob -> setVolumeRatio( 1.0 ); inputKnob -> move( 14, 251 ); inputKnob->setModel( &_controls->m_inputModel ); inputKnob->setLabel( tr( "INPUT" ) ); inputKnob->setHintText( tr( "Input gain:" ) + " ", "" ); knob * outputKnob = new knob( knobBright_26, this ); + outputKnob -> setVolumeKnob( true ); + outputKnob -> setVolumeRatio( 1.0 ); outputKnob -> move( 54, 251 ); outputKnob->setModel( &_controls->m_outputModel ); outputKnob->setLabel( tr( "OUTPUT" ) ); diff --git a/src/gui/widgets/knob.cpp b/src/gui/widgets/knob.cpp index 074f32813..73f00d84a 100644 --- a/src/gui/widgets/knob.cpp +++ b/src/gui/widgets/knob.cpp @@ -61,6 +61,7 @@ knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) : m_label( "" ), m_knobPixmap( NULL ), m_volumeKnob( false ), + m_volumeRatio( 100.0, 0.0, 1000000.0 ), m_buttonPressed( false ), m_angle( -10 ), m_outerColor( NULL ) @@ -668,7 +669,7 @@ QString knob::displayValue() const configManager::inst()->value( "app", "displaydbv" ).toInt() ) { return m_description.trimmed() + QString( " %1 dBV" ). - arg( 20.0 * log10( model()->value() / 100.0 ), + arg( 20.0 * log10( model()->value() / volumeRatio() ), 3, 'f', 2 ); } return m_description.trimmed() + QString( " %1" ). From eb63f04f55439673225fd37512d5101003e43bbf Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 15 Mar 2014 21:14:55 +0200 Subject: [PATCH 3/6] Amplifier --- plugins/Amplifier/Amplifier.cpp | 125 +++++++++++++++++++ plugins/Amplifier/Amplifier.h | 54 ++++++++ plugins/Amplifier/AmplifierControlDialog.cpp | 69 ++++++++++ plugins/Amplifier/AmplifierControlDialog.h | 45 +++++++ plugins/Amplifier/AmplifierControls.cpp | 82 ++++++++++++ plugins/Amplifier/AmplifierControls.h | 79 ++++++++++++ plugins/Amplifier/CMakeLists.txt | 3 + plugins/Amplifier/artwork.png | Bin 0 -> 15755 bytes plugins/Amplifier/logo.png | Bin 0 -> 3225 bytes 9 files changed, 457 insertions(+) create mode 100644 plugins/Amplifier/Amplifier.cpp create mode 100644 plugins/Amplifier/Amplifier.h create mode 100644 plugins/Amplifier/AmplifierControlDialog.cpp create mode 100644 plugins/Amplifier/AmplifierControlDialog.h create mode 100644 plugins/Amplifier/AmplifierControls.cpp create mode 100644 plugins/Amplifier/AmplifierControls.h create mode 100644 plugins/Amplifier/CMakeLists.txt create mode 100644 plugins/Amplifier/artwork.png create mode 100644 plugins/Amplifier/logo.png diff --git a/plugins/Amplifier/Amplifier.cpp b/plugins/Amplifier/Amplifier.cpp new file mode 100644 index 000000000..380fde0ef --- /dev/null +++ b/plugins/Amplifier/Amplifier.cpp @@ -0,0 +1,125 @@ +/* + * Amplifier.cpp - A native amplifier effect plugin with sample-exact amplification + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2006-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 "Amplifier.h" + +#include "embed.cpp" + + +extern "C" +{ + +Plugin::Descriptor PLUGIN_EXPORT amplifier_plugin_descriptor = +{ + STRINGIFY( PLUGIN_NAME ), + "Amplifier", + QT_TRANSLATE_NOOP( "pluginBrowser", "A native amplifier plugin" ), + "Vesa Kivimäki ", + 0x0100, + Plugin::Effect, + new PluginPixmapLoader( "logo" ), + NULL, + NULL +} ; + +} + + + +AmplifierEffect::AmplifierEffect( Model* parent, const Descriptor::SubPluginFeatures::Key* key ) : + Effect( &lifier_plugin_descriptor, parent, key ), + m_ampControls( this ) +{ +} + + + + +AmplifierEffect::~AmplifierEffect() +{ +} + + + + +bool AmplifierEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames ) +{ + if( !isEnabled() || !isRunning () ) + { + return( false ); + } + + double outSum = 0.0; + const float d = dryLevel(); + const float w = wetLevel(); + for( fpp_t f = 0; f < frames; ++f ) + { +// qDebug( "offset %d, value %f", f, m_ampControls.m_volumeModel.value( f ) ); + + sample_t s[2] = { buf[f][0], buf[f][1] }; + + // convert vol/pan values to left/right values + const float left1 = m_ampControls.m_volumeModel.value( f ) * + ( m_ampControls.m_panModel.value( f ) <= 0 + ? 1.0 + : 1.0 - m_ampControls.m_panModel.value( f ) / 100.0 ); + const float right1 = m_ampControls.m_volumeModel.value( f ) * + ( m_ampControls.m_panModel.value( f ) >= 0 + ? 1.0 + : 1.0 + m_ampControls.m_panModel.value( f ) / 100.0 ); + + // first stage amplification + s[0] *= ( left1 / 100.0 ); + s[1] *= ( right1 / 100.0 ); + + // second stage amplification + s[0] *= ( m_ampControls.m_leftModel.value( f ) / 100.0 ); + s[1] *= ( m_ampControls.m_rightModel.value( f ) / 100.0 ); + + buf[f][0] = d * buf[f][0] + w * s[0]; + buf[f][1] = d * buf[f][1] + w * s[1]; + outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1]; + } + + checkGate( outSum / frames ); + + return isRunning(); +} + + + + + +extern "C" +{ + +// necessary for getting instance out of shared lib +Plugin * PLUGIN_EXPORT lmms_plugin_main( Model* parent, void* data ) +{ + return new AmplifierEffect( parent, static_cast( data ) ); +} + +} + diff --git a/plugins/Amplifier/Amplifier.h b/plugins/Amplifier/Amplifier.h new file mode 100644 index 000000000..e9a78e9d5 --- /dev/null +++ b/plugins/Amplifier/Amplifier.h @@ -0,0 +1,54 @@ +/* + * Amplifier.h - amplifier-effect-plugin + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2006-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 AMPLIFIER_H +#define AMPLIFIER_H + +#include "Effect.h" +#include "AmplifierControls.h" + + +class AmplifierEffect : public Effect +{ +public: + AmplifierEffect( Model* parent, const Descriptor::SubPluginFeatures::Key* key ); + virtual ~AmplifierEffect(); + virtual bool processAudioBuffer( sampleFrame* buf, const fpp_t frames ); + + virtual EffectControls* controls() + { + return &m_ampControls; + } + + +private: + AmplifierControls m_ampControls; + + friend class AmplifierControls; + +} ; + +#endif diff --git a/plugins/Amplifier/AmplifierControlDialog.cpp b/plugins/Amplifier/AmplifierControlDialog.cpp new file mode 100644 index 000000000..752601765 --- /dev/null +++ b/plugins/Amplifier/AmplifierControlDialog.cpp @@ -0,0 +1,69 @@ +/* + * AmplifierControlDialog.cpp - control dialog for amplifier effect + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2006-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 + +#include "AmplifierControlDialog.h" +#include "AmplifierControls.h" +#include "embed.h" + + + +AmplifierControlDialog::AmplifierControlDialog( AmplifierControls* controls ) : + EffectControlDialog( controls ) +{ + setAutoFillBackground( true ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); + setFixedSize( 100, 125 ); + + knob * volumeKnob = new knob( knobBright_26, this); + volumeKnob -> move( 20, 30 ); + volumeKnob -> setVolumeKnob( true ); + volumeKnob->setModel( &controls->m_volumeModel ); + volumeKnob->setLabel( tr( "VOL" ) ); + volumeKnob->setHintText( tr( "Volume:" ) + " ", "%" ); + + knob * panKnob = new knob( knobBright_26, this); + panKnob -> move( 60, 30 ); + panKnob->setModel( &controls->m_panModel ); + panKnob->setLabel( tr( "PAN" ) ); + panKnob->setHintText( tr( "Panning:" ) + " ", "" ); + + knob * leftKnob = new knob( knobBright_26, this); + leftKnob -> move( 20, 80 ); + leftKnob -> setVolumeKnob( true ); + leftKnob->setModel( &controls->m_leftModel ); + leftKnob->setLabel( tr( "LEFT" ) ); + leftKnob->setHintText( tr( "Left gain:" ) + " ", "%" ); + + knob * rightKnob = new knob( knobBright_26, this); + rightKnob -> move( 60, 80 ); + rightKnob -> setVolumeKnob( true ); + rightKnob->setModel( &controls->m_rightModel ); + rightKnob->setLabel( tr( "RIGHT" ) ); + rightKnob->setHintText( tr( "Right gain:" ) + " ", "%" ); +} diff --git a/plugins/Amplifier/AmplifierControlDialog.h b/plugins/Amplifier/AmplifierControlDialog.h new file mode 100644 index 000000000..41409c674 --- /dev/null +++ b/plugins/Amplifier/AmplifierControlDialog.h @@ -0,0 +1,45 @@ +/* + * AmplifierControlDialog.h - control dialog for amplifier effect + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2006-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 AMPLIFIER_CONTROL_DIALOG_H +#define AMPLIFIER_CONTROL_DIALOG_H + +#include "EffectControlDialog.h" + + +class AmplifierControls; + + +class AmplifierControlDialog : public EffectControlDialog +{ +public: + AmplifierControlDialog( AmplifierControls* controls ); + virtual ~AmplifierControlDialog() + { + } + +} ; + +#endif diff --git a/plugins/Amplifier/AmplifierControls.cpp b/plugins/Amplifier/AmplifierControls.cpp new file mode 100644 index 000000000..f06876e1e --- /dev/null +++ b/plugins/Amplifier/AmplifierControls.cpp @@ -0,0 +1,82 @@ +/* + * AmplifierControls.cpp - controls for amplifier effect + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2008-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 + +#include "AmplifierControls.h" +#include "Amplifier.h" +#include "engine.h" +#include "song.h" + + +AmplifierControls::AmplifierControls( AmplifierEffect* effect ) : + EffectControls( effect ), + m_effect( effect ), + m_volumeModel( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Volume" ) ), + m_panModel( 0.0f, -100.0f, 100.0f, 0.1f, this, tr( "Panning" ) ), + m_leftModel( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Left gain" ) ), + m_rightModel( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Right gain" ) ) +{ + connect( &m_volumeModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); + connect( &m_panModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); + connect( &m_leftModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); + connect( &m_rightModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); +} + + + + +void AmplifierControls::changeControl() +{ + engine::getSong()->setModified(); +} + + + + +void AmplifierControls::loadSettings( const QDomElement& _this ) +{ + m_volumeModel.loadSettings( _this, "volume" ); + m_panModel.loadSettings( _this, "pan" ); + m_leftModel.loadSettings( _this, "left" ); + m_rightModel.loadSettings( _this, "right" ); +} + + + + +void AmplifierControls::saveSettings( QDomDocument& doc, QDomElement& _this ) +{ + m_volumeModel.saveSettings( doc, _this, "volume" ); + m_panModel.saveSettings( doc, _this, "pan" ); + m_leftModel.saveSettings( doc, _this, "left" ); + m_rightModel.saveSettings( doc, _this, "right" ); +} + + + +#include "moc_AmplifierControls.cxx" + diff --git a/plugins/Amplifier/AmplifierControls.h b/plugins/Amplifier/AmplifierControls.h new file mode 100644 index 000000000..2640c8aca --- /dev/null +++ b/plugins/Amplifier/AmplifierControls.h @@ -0,0 +1,79 @@ +/* + * AmplifierControls.h - controls for bassboosterx -effect + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2008-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 AMPLIFIER_CONTROLS_H +#define AMPLIFIER_CONTROLS_H + +#include "EffectControls.h" +#include "AmplifierControlDialog.h" +#include "knob.h" + + +class AmplifierEffect; + + +class AmplifierControls : public EffectControls +{ + Q_OBJECT +public: + AmplifierControls( AmplifierEffect* effect ); + virtual ~AmplifierControls() + { + } + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + inline virtual QString nodeName() const + { + return "AmplifierControls"; + } + + virtual int controlCount() + { + return 4; + } + + virtual EffectControlDialog* createView() + { + return new AmplifierControlDialog( this ); + } + + +private slots: + void changeControl(); + +private: + AmplifierEffect* m_effect; + FloatModel m_volumeModel; + FloatModel m_panModel; + FloatModel m_leftModel; + FloatModel m_rightModel; + + friend class AmplifierControlDialog; + friend class AmplifierEffect; + +} ; + +#endif diff --git a/plugins/Amplifier/CMakeLists.txt b/plugins/Amplifier/CMakeLists.txt new file mode 100644 index 000000000..8d9ac96c2 --- /dev/null +++ b/plugins/Amplifier/CMakeLists.txt @@ -0,0 +1,3 @@ +INCLUDE(BuildPlugin) + +BUILD_PLUGIN(amplifier Amplifier.cpp AmplifierControls.cpp AmplifierControlDialog.cpp MOCFILES AmplifierControls.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/Amplifier/artwork.png b/plugins/Amplifier/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..9750296a9d9c5c81e9454ca3c95d1eb081cfc574 GIT binary patch literal 15755 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 JPDHLkV1hQH`#WFm#_KhbhiGA@U*^o_ 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 Date: Sat, 15 Mar 2014 21:15:39 +0200 Subject: [PATCH 4/6] Cmakelist --- plugins/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 71c07501e..e8027e2ba 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -1,3 +1,4 @@ +ADD_SUBDIRECTORY(Amplifier) ADD_SUBDIRECTORY(audio_file_processor) ADD_SUBDIRECTORY(BassBooster) ADD_SUBDIRECTORY(bit_invader) From d269cfe6dbedc66ef0cb2ff62460e4177f490b69 Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 15 Mar 2014 21:16:06 +0200 Subject: [PATCH 5/6] BassBooster artwork --- plugins/BassBooster/artwork.png | Bin 12823 -> 15535 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/BassBooster/artwork.png b/plugins/BassBooster/artwork.png index 23e2be7b34a2762a9d72d1e1e85a1e9aaa43fb5c..55ef058fffdfbbd097e4dc25c084f167beeb4a2f 100644 GIT binary patch literal 15535 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

&#=@ZT(ecf%))+bScxrYTOh!j2j^w7Tg4 zspBFQ-Dn?r<2SrdXV1Dmwr&BfXLrU#^ z(4hwjY*?3bE=qbUmV0pH#>2F6-SC~2*0)BjI^rj_35sxb#rRU33^PlaN`;{=$)OzULvfzvhVC zFzkvQZRvQb9QW3cUA2Ub;&u}u9a}gn?s4;bPud%u^bC&x8;jU)Y>RG+eP?z5=bWeZ z&Q$>8(v1G5y+!M#=N#h0B#EW#Vwgi~VG-8v_v-rp^t({?;Mlumuxspe*UhUN8SY_u z?@gdCqZ=MBdVO*-#$j0*N_6vt9YKNmhNWH}e6TwY4-2mO`n3LShArUi$3O0kgba&^ zkwp3`=PUT!*2k7)PLXD+9;W*c^~GF*W8)szG1@DG3(~w3VOW@i;Zir*3e6=|#7$;D zYMBe)q6{0WEF*oiPoOfa0Lm}{?H;Eb7O-@(lANZ-VP?5eN6(i=^#TzaVl~ADRY$*H zjTe-JV_Ne9Ys8H(Et_uY*tDOVFR|VTTEm_^FFxV80udM78w>f4%e0AzF!Sx?1Apx_ z{@h274W#`q^9=yw1VezL{p!iZ&>!c>r)G&YwMocotv&hpBa)&*4g*VGxXRzU(#;Di xF%QShpnDQ*VZxN%Mc( z_j}GK&UJ;TD9d7^k)grC!C}hFNr8cPSKwv#78&>|RLvs~yrJ64={Uf_q2s^4-oT}% zlK=-%9OadyQC8j%5Rnrm+-qL~he#czwH+mGtgN8cj&PFpP$NgE36+bvqZyT~ypoF6 z4=iFhI4U@KDRFhzg#@oJ;S{nnCt4cI9%D1yl#9ku89q(^|8+~lqvFQy`A19M2K*-^ zMny}BwL!HOKuqiJ3i`v{au)iZoSZK0+K(hEUtByJ+grb5+BSUQbJt${F)xGPB?lnK ziUW<368gsv(&xh`%X)fs7J6;}$}|qFY=ln>rchh7;NZ%5(;dbkl8i`s1T8mbE0VAX z{R)&a-q0K$PBMu3e~f?J1a1!~72ZI^v+voKB^d)iV;$bCI=oSEo|IP7 z%CldlE}wA<<=K*U9iv zel{!%;6(0CuB^0&Qz){<^x0d5zyt*T%->V`fRSex&P1@O#;VUKQaRjHScZU7M5vr6 zeP)f+EWVc!(QiwB+}?LcHG@#yXZYV2BJGSZgu$n_iba&M3?T7VVTY zH_Vcq`COL&8`Y)SJH2Ra_FsgA4SQf4V?@3ei`1_mM&4`sFv50d!_4^aeaTahmsdDAu>Ka_l5;HNhVXnulut za@GEVI+d0}ysHbVF=5o`w!*?x_yz77g)}Z8cg;D^eUKAkHPcCqa0mZeYYF;>2Px9Q z9Mg~e7}L(PTrs~aBv(<#cf`7dPV>L*`Repz*IlgmGB%xg`tqQr=q=b2ovb2{R1J36|xVZWa@fXSE7z)2R7^KQKR zpS#G_gV*rbm?R^@=_dw_&v^4Q?r-G(!OF6g=vX{e%}pJSsazs`eVvF{*&K&jbTX}~h{m<2In~<}9ER}s)=szHP)e)%yV;H!36Osk%0Q-0%g6|r zK-S6ZfP{gQ>nv8%dJ^&@5i6VP?-o^sQ_9C~BeyBZ4Qyeo`BRKo*eK$>$opkB>I7A^+Kv6Sfb7+%-Yr@Uv${o&WR_VmMDndc~j-eA~{sSg>wbI%oFjWGi(40S= zof5VExz~-R?5)-?R$s(Q&dFSR(+KYh1~d$0KMqQFVi@bUZ{L27u&BUr@f@wobH}p7 z;mILbrV50Y%ftLqy~OG;3Xx!pHV3TDbCTJ_afq>l1Gjq>%Mb@Yf6$#<#JOwu_xAUK zhF2FLDFrt_`vO8~T%xS}g_$uC06vaF0XLL~hlepwqoqr>?CDFUr+;xJ-ZhMAR+ z7xpo@vXPIcSkP@TZZ#L7G?w}ExYyP#N4>z13^xp71} zD}3;=p|i2*g#CoMo%h4y>Q@^Z?AKyoAUAqF@IBx5iEW%L{}ymQA_>j;uVOCjqrbCH zJYTAf zj%db;IE@D@iZ%XvDoO@_XO0S1PXXG=VIU(sD889rS?N9Xe(_lP?SjqTc1!d9x+ZIV zx=2mjY~XQQ2kUl6uQ6rqo1{g@w`?Z)tFsOad$pj2AGG4ZM6trOGba4PHbCOoB3C%& zdcOmc48D`XU@+JF{etsRmo|K;&ew0>KDtg%?ei24?K?uA$_k(PG8KJO>ti_gxM$SF8=EOu1eR(Azyf-dUjRx|z_J=~gu?7A|u63rEb;M5q%WwcI2t z7Z@#h&P^;?+1MC6IT6MUAhznWhmx3Cn^o|Xnyj6m3wAfMTU zeV~H>IyFZJmzH#sm#Rz2q}UL~^rs{5*{rqux|)!_V^xm-#i=B7mZWF0GHA z?ZEanQtH9IRliZW#x*02{)7htVS7 zQS{}b3eO741+c?Po-V-#UiUPf1j#va3Zwb&QqmlgG!Fp$K~l+y?AP(LEk8B)_}B{c zZ(8kkPgX26A%SqI(GG#VwJidlUiptl)X0dE=aKRIuDH*lA$fUpOU+K`#B92M zN-EkyXJ$0CVO32{Aq6jeQ?8HaeO0x!{%QO+8=V2@jZTL|${9j4WZ33#WY|T!uVH`& z>z(>67O~kEwR!*V&~-h4*!FTqskF58KgNKJ3<}Wm?WXHaimC16t)1>~XUs9N7m)Q* zT2H-t%{8RV*NjLusOrp-k0aeq_ZW5G3kXh?yNhE zlcgrVPf2Xzun0dtgxB@CUeBA_U2MtgHrXS+hJA%+Qg3gfjGAlt2s9WOQ*mGyXgUWlD-zf9>~&Nj3Wj)5*Q z?w>^Uz5ZzsNdFk~e!jfjAZ`!#xH(xLOkfu9egt``ho`|!M z*K)Q$ZnN6~o(D8$cYkH>ddf)|b-s@6EuedOXz(J`9Hd}^N{>v4-d21@$cW3M#? zD6s#M99!(sR;3mA?c(C%-{s{Vo9~xtl@IbY+rx|>tv)$)5DOz1D5kU%unBx-u(Yw+ z1b7H2bfd?OwJneCvE$Ln$;N1gaOLb*u9UUERmNv4#^1kFa&vP73ILQtRwuFJJUJ_? zul@NSJ3uouW6Y+ffMTwbl{q;owXb3;Q$*}W@UH~-88e@{09y=vk|aWgqj!3&kVhKm z8WS$T3$i?d+6mXEe{(?pxPoL7p+=y~%S$+)fB+;QBV#Ko*5t4p1`e@ypNE^%E=bt+ zHk5^pEl|k`02V+5wYBQolR9Q{#jYM6!UECp-A9(v4e_-L&NFXXPzsbY(6EBRXh1)iUXS&X zcUOfZ=UwZ46<`C|JF+&fJce4;+lfMGwE1Ffz3=FCt&uWx9@oU1VCJ2+sX^f=S+fCf!p&`IZ z7-(ZrvGWLYY1q@{nNYo}&UAdgc1j{#7|Kru`Mt^XI1w}}J2!awXK=f?`W#4~=}PmT zAE3zqsAeH8SCgL_?f;=Em!|*GYP%pD9vNBh4#5X}opa+ez&@_q30kj=?|BR}c-3^} zOi&0w?#MrWoyS8-Bl?7i!H%F532Mxg52EIviOvdY?sI^h);D^>1l%rY+s-3w46UuP zUM-9F%Xfb^>C3{6JrfQRLl_J_iQNDh4zMbQfCzv8E^0qaRxpsW3R_dXPgmz%4F@p| z(vHw=+`)~@G&l=HnWN6pA&UpFXz&4Enw*kyV@AuM$6-u_*ln+(^_uMa)1iSe5Y(pS z9JviZzcCbw1Q=+*0#`x_X`TQ=eLLrQ>aiMDz8;QF7F7r3$z&N?gV~x0kju;$i6Hkz zk9^XT{C)rY^l-a;`klD<66h4+a8q-0)ZSzt)k{m&gb-m2ECRt41xDQ#S6s2jb!<++ z$)0aW13z*O%un*3hRK4+6|?1n(32e4ly4ob{g&E5jAJgs9f5#X0Ep(50t`9c*2n1H zahr}B0wkO+Zhv*#a>*58J7=6yt%E}0cl9rZsJ02wJ-__NHV>9K-$ItI~u(-73&xs7U>Zq2>7>;Z} zZULtY%zePd>LeNgRIGREuGP5nZ_Xfy54oP@Rp7P1;9^pKzcm7eF&s{uKv6)f);j#) zL}&=WhJZqJlK26h>{TjW zo}NxCp&>w3fW-w|rQc8j5^g#>x^|H_1h{$n&zaqT`PBC~<_(wm0H{1r*Ujkz##eU- z)!6{xxtt)|MqLPvlZC%~&r-z%WhK3-Zn}DkV zqwG?P8@E6NU|@m#-`)s09T0@>BPOx8`>hj!UO7&_71`ErSwPxUs3vK=C>Fd}xLrZ{kveNp_$4MgPt@rWGgX>XM zpRKK{Pgj?uBK_1_KVT^?cgJ310CWGk=*k0?N-s&eunX4E(2#(Dz}w%p&dz*hX)Hsw zfVTjQsv!>(nSW?Y=qSIsRbbZ4Q@3q& zZxsdFftrPt)yUKo1!#N#Yv}mx?d|U?Pvhu6e|2^y>RRX6DmQNduK9{zS5WWs^Y;j} zZ|h#>eUbEWq4ms4jGyWOg{`SkyQ2a%jj08ydg}VEU(FvJSRi8Jy;bhbYFP#BI^u)O zDA2LGbTMw&Zi&X$^%ueNpMV=5L5?~VbAEM1Ko0<=ThH5@zgoI!yJ`LLQwG&XKcn-P zCE*=9y>j|niKWvU)kNsHBH)GkA}P=}>0D#DMKc_dGctOL)CznHL;(wTQI8lM4;>J& zh*(oqJSoNeiIgWlV3(s_z}fswpKHwz+PSr%!1P(<8$#aO3rVU$`9PFBEP1_XSs=Jk zHOs~a)xTfEQSm+t8pM8=NOh$_fRpJms$AUy;T$F1JnYSdNjK>!q~Q)kAkHMxVI8(G zM{s|2m>nK}9o|wTvqlBC>a0Hg*sRsw)l~`dTi{Gr{D}GGSLD!stDLs%FIDNCsphXK zldhzSiU;ZVZ}u*OtK)2=>BK;43bN|pvP&F&oM_brycBcSLD0*M6ebEJlgibHUV81$~e_rMaLq ziikqG(LGQDCA&;*qDD2mPJ$4(L6#Ob&igHk0L;u=8Gfn%>VqGk8G4L0cQoG zoxcs1Hf@PThz@}5ABt>5Xd&{(&2%USDlz!2a6(aX_)YH6~TYcfpY8C8+bbk*{7ABn@{Ga ztNJQh6zj!!nXLy+swVG&ygx4mqYqixt+~=WW6`fn3EPtUR7=E#$Wn>L(Oc?CW8d>D zm_heLiPOvfge7*HOa0?M|N2hNw}P4-BThfPG=9w@S=gYOC={DRLxiON%+g4WSF#NY zJ-%{oRM5;!d+gZjCikO6)EZ$@h-tynH3!VOCNWW5TBM-6|o_8`EOyung!jkfx&8d-)R^=@7#Dy&4d_xoQI;;X} z%RnM|Z?qT6N()(7atot(IkTj`(m*VAx`hkM+k(;i3DPgmG6g+oXlW|=w+HZ5PD}j; z6bS}#QU5z(>$4xq4NNE|($b`}jiBRK)>X{Uk&clV?kll~(m5ZY6wEQ3@rF*ODISj> zI8d|*z;P_7zbMzzpRIHWW9MnWaGTSXS&g``(#9oQB-ECtbK&vn zF#Iw0=wte~N#neqZf+J}QdZ?juTwUVu}-wl#=@~k0k*oBMPU6fDv`~EJgr2s2}-vw z2z{vTC~4sx2|XfE2V+a;Mfynt<2lR*aIGhQUjsnjTs)qgpVOB&a}qD-|p z_6?@pO0_RfTDdSm3d z?EbnR#P81LLco^O%027@#W4-WAq$LB56;05iz-hrnph&f1%nRXq zr+8|eh11|Vz9L^xC%&&>Mh)R_+9}+{7%j02c&AB*Nl}jpcWR9+mIpsu;?A(;!^2G4 z8JcWs(!AI?@JReLQ@Q26yWHmtc1`BzS+dAg*<`8=j+&HGVTEH8)C}Hn@)B2KjVmml zZy_P^7R>o-u0+l;aN4jEO0Z7)$_FPlSknGY{O+JjY3Xp%Z`JyU4F@WG;_3N5k6O^p zV7pmRN=I5n9QRc@IVuMF)<&c5g4;@l4sOT zdBIXOU5W#_UBpq1^SZD_DKle33w-e~>G~-9&Z1hq&>Pmxp#v8weR$`^*bRytcge#IjpY7i<)k_WV1Q`Xe<$BezRj8u$#Z4Sp>+`$ zOup0nFv0eFcs0rRNGB0#9S!|hq^0Ekz%GkAL0Qp?gS5|~qFr9B-uS7s>2HT1p_B8W z0!@K_yf6)75>kTZqFG8eRg~aQ(Q@z|q<{hxsXYLpDJu5U!osc)iC4?$q@&=ZL~^Op z1;djF=7;EiWjqythPmlOCY`}>VdPppLRCu5l{typTW(|{v3zX*CUL2-RuzO5AQ(Ma zM3guOYDC)S$Lanv?1nt{_+-n1PL)e35|p*lfeF{pzv-Smyf zasR1Q^D%CVOy(AVJrI#d61^rN2u>NrEL}$j-M#4j476*NMpG2*8J7v9WTzquyAr0p z)5`Ij?Gi2sr{%dGp&cYAyBda2f!(zh^z29$k`fi!xk(y5H>1q7-6q)ca~Zs?^(O7H z^bWVNb5IB+FsPNMf*?Pd(}&}e7V>9uTXkTpmH>I}dLcPY4h3b7IBjIzBr8<03tN>` z2I=Wg6nQb(P?oiD$!765q9YxKrl=7Xb<=eDS3pBaVm(kMU zv0;tokd4)gUD!8DAC)EN&m(ZO^d2$^avW{m1?1bxXB#|90Hf~j!WvlGy^bk>>qy4w zFbCIlcQzbZFnvqVgBoMk3Pa@PN2is45d~NC8WI19LhBpff-QuQK)7hm}mS@Kw zUgf@IoT=O+=^8c-ZsGoyxbH*!-boYz@sLLY=f8AED2At=ow!8Kxy>_98|kz}*^R)% zhwcKY=Z`;d>x9VnPCFwygp1LCW|7e8MMh2_cT;GUVw;qZVUzV1V(nHx*@PH;>QJ`A z$^0AbT>pvAR4A;Ld{tZg)1B1bAWg8X7os8eJxoCX6NO=rD;YUY$Km-a--2%`S_;F#g-f`b zSwUB2HD$4?MXhA|wf||V``W?5FIU&X!QlqHJ_}HoIG27=4h0brdU5`d=*_))Z!|EO z9bEiZ$Cb85(j0|Ov?AoAl6}Ge<7Peg%mA+Y|Rw(Pacoeq$_Dy&l`}@#cjimRC`L+V%O-^7xbS z_AU@e_t7?~yP>UmVUC{~4mIivq+7$kH%EmOR@XWe29N5|sl{icRLZmV+nlfrq&`Zo8pwI*Ad_B{lrk&@}Z^Giro|(5LPB4fnzEr$n|R|9AI$yR$51b z6_jo7>+XGa($Jh=-t0fJUDUY)bt>6mQlJZcP=9_?^FYQih`8}H=yZ6m-vS3_RVXA^ zNN1Qwz?b z)#~pO$>SRZds4FrPHTNYTIe(H;Q{`R1_KFasFQOMYLL#dV%)OD1(^=edN9o?l4Tp} zncsHkj@|{+#M_tBWaKp{V& z%J2}UgPyf3K67qe3`$_YzFkvSZ%zVr`=Qgbe}k#g;S0xa&Pk}&+iEY8uzxQ^$Vyv?5V_I$#Ot`exm->8h{IILl_gHAxv0>R z0V%#+cU~;BDXT=~zS33`9n`s_7KQ6AEad=jHQ2Wp&a9)vbgwX;XC{Qcr~79>dLi8}krj^Y#B>kBJnje}j ztvX4ye#~^&VgI1I$4b(s?CdAHTJgBLpp4fX7y6vfn75orn!w>k`_mUc-JVRXEIF4i z_P@}H<^`Qu=}3CnU#@7pNUQk^{H<>8U_W=)+z~`b1f=oIpCbgnEmyW*xTBv*D3bz> zH8vSDmXo8QN1Z|32nS_|F0aJ19A=0fN>Ovxw<-LBQX{WV>j%b6!3FyA6ALm>ru z8y=}%@Y`_8wKd$<#8p1<=!SuQaB{cQn*Yf9^jA#^Z5i)|5vs(K>bmbuo6r&`uEM#m zh4lw0MrpRudMEBd(UcN+sk~qJ?WCwk*bVl&JfY(>)#h8@pDe*1+(sj%4J!HpS9sp2 z3)d|Z!KH3U>R!Pb8qb}m2uk$i@2MG!LOo7+>TrH7lnWo`e2*(Cw^27ApCMDYo_u?1 zNx+rNkh_r|9D5$?qRaV#SE2Xr;J_%>M1w1c#qC?*?7$91QMzqyf2eaMLcFy@q;X@F zIolv{N-oD(4Oy`i^OD`lOo7@1oDZ#wR0gBM44v>q-ps7}0ujZGCSSTxgEQ`I(@hp0 zd{I-*X;;Ue+Ka9xfz-Cc=x_$%z#T*UlXC}IF#4FV#$8r;1fyO*F0BslXYbA3D_eFI zG^CddHEXg=w%DZ&IGo_{&&3HeMc(^Tj0ZS7i+nsblOuA+~e?<1H0 zSz!@;ejYlCEY($<|2hy-QoJ7{g-_?>sIHn07W&vWw8U<3RL)i)^HV=zE5V5P{OWyC zs(t)SUiC8f6kw7ET zK}k|BI+4EzJls)}i7^hn;$gp9j0b+_sDy-;Lv`6;$+aQGF{AvkY;v)-mzwOu)ffrXI*Bv45-BWe zaj8mQHxhc!H9mPCaLol5Dd$hSju~5A^e`{y4CD0Wkwyi#Wr0;=@BZ-ml++=iJVWaX z52DGg$)si)8W{3BQCsHjh@XaXNsSEx>DJ;-95xiUbVA zc~M{9>JpE%xz&k|*<9$!XxC_>6=PxMGNGFb&xY_x@4(zb3OgHvE$J;>8_ne@DjC=R z3NS;B&uFL_7{9(NxYewaho+Iv+vk(51;WIHZkc8(q^dx5vcE&Z6$xb~ROXa7`iV?s z!SETMrF0TCI2+8EXa?3g>KOxulbc7{La|!b@=6&`5NSHS{|OZi=gbbO zt__$DV-kv%fN9&6Mu2Ptl*ppq5Yqk}Q^!qR64$f+It5Rnx?f`XBblb=94Gi<6wkhH zMJ8i$Ghi$_#tsc2p60j_P~3c}yB>K{|= zF+mNcy@6(sInSn(QhM3u z$IOI+G6@XEAx@~V`UxU9Inm;l6(0dF?Q=qL|CEZWgCic*#k=(J{7erO)S%mu1zo7F zbUs$bntpACi#^k{xl@Wp@qrXGNVO<)@8wCf#7P59(>C2NnlZ^zjbZU!{sIx6Q2d}w zU1X=EuJ<%jhJrp}kUF$gvly9CT72gcD7LD4$AevNFqzR)-S|?i_NwZJfH~T*o<{{Z$1XfnR)n_d%SYaut zEb5f0Nj`RkX8fw+jW<;Y)Qjl(Tw*h;+6D?x2(3@>n1=D6bnW+A=38$blrwPYsQZ2m zns1#Sl|Aw=W*`669QWiAa@Zn-?v9Yfyd~`XB!5fV$%w|P@1nCa`98~$MT;uc?`i!mhI_(f zD1-KkRKG`^GHRLpfv9*yLP1vl61%A#;+QT%?^a<165P~$yMI#KVEl(5*=>-Co}JZn zzE;X8UZ`P#kBJea8)DK)t3d|QVVt9Z%P(Y|RNG}w=j>PSo#Wc37g-~a)}plT@esT8 zQ()+f9yJ&euAiAlpT?bY|3chbV6^xvma)1|8-`LaN`hhOwtP)VH`tRwgvB98I2uFO zCY*<&5GPocRwb7}NI?L8%HAeWz!cxyw(~|4-#~=l&-mnC<#}4}kNifYERY#7$8}Li zlW!(bBK8^L4{G`&OYueF2;Ll~9;BBjTONCC(G@~kTBBhq5Hu4vqwcHgr(6e3!RVK775hD7SK>r1G!1xVVQBjDG&-DaVmN`8xyqDn2(SXSW zzL;!BUA1v3!?A*GhMik-NrwMMs@l3SjEzueB{nqwmTl}%tuI_6{~fPP9v%6il?LOq zQQ)wKy;)R{W;H)uML|(DM{#Ey4E#M23OrC!wuQovS}l}0&4vBRr0>=cZ!O9n;mg6~ zhg=S|mC~ygwIWs0Z!v3wHAG+bpnB{x@w5Gdn2CB}LUFSQT*U)(f$+@aUhurEY^G2- z#;^sD8KJoC`A~`G6Mn}0&_um$vz$cp-DR`0fL2jaGEZK|R(aUnT!^*%{hlVqQvSt? z7OQL$9Vb<%)Jj;cJ(riGgk`)SDm$%k-u*|>_=wKity~2;wH8BTuB(Ie!U08zX5&*W zJ`x*{C!tC$L1cyk>Y%sF{rmXCZ+!?c5No(JGZ-C%(!O0TS(AddTq^tMr%kL<0!`5< zoz%QJ(ev=zwkj{qj>Apiz>=@Z`youkuEyL2knrd0c`QD(R@YwnkAL#iXt9shm^8jk zq;54S1Zgmpch%)ZS$dQfzhk>qB@E;ud0AYc1kCUI&OA` zSLLabsXqT`vx0|~kCPQ3$J#i8%^ltCf%UC; z&QVpaK%4aH6UjmH-2V1PZ4;TDKO*Jv!_-GKM+| zUpa2-IF1o+%TF0Y5;f{(U90Sbl;@&TleOb60z~7i)x8nS={oq{NA(mEU-z+R?m8E1aDR;Ovh)WgHhnV#!VQb8-94sH|R`&mTam z!C4a({Fu9;7LIeW{@y9vV31KUCD_&)Pac&MU4SF=EAtsv$Q`g)kLk zWR;~#Co>gzAfOya87)q|L)NMMlWHJ1H-L|9mJL2S#51I=r;IesR#mhi43=S^_#$?p X&wXgr*p~?W2M3(Iw6avWgrV>MYdPk{ From a666df0e564d30acaf1505897b246974e86e2dea Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 15 Mar 2014 21:37:35 +0200 Subject: [PATCH 6/6] Fix incorrect loading/saving of models on all native effect plugins. Backwards compatible. --- plugins/BassBooster/BassBoosterControls.cpp | 12 +++++------ .../dynamics_processor_controls.cpp | 20 +++++++++---------- .../stereoenhancer_controls.cpp | 4 ++-- .../stereo_matrix/stereomatrix_controls.cpp | 16 +++++++-------- plugins/waveshaper/waveshaper_controls.cpp | 10 +++++----- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/plugins/BassBooster/BassBoosterControls.cpp b/plugins/BassBooster/BassBoosterControls.cpp index f1c7184c8..321d6dd22 100644 --- a/plugins/BassBooster/BassBoosterControls.cpp +++ b/plugins/BassBooster/BassBoosterControls.cpp @@ -81,9 +81,9 @@ void BassBoosterControls::changeRatio() void BassBoosterControls::loadSettings( const QDomElement& _this ) { - m_freqModel.setValue( _this.attribute( "freq" ).toFloat() ); - m_gainModel.setValue( _this.attribute( "gain" ).toFloat() ); - m_ratioModel.setValue( _this.attribute( "ratio" ).toFloat() ); + m_freqModel.loadSettings( _this, "freq" ); + m_gainModel.loadSettings( _this, "gain" ); + m_ratioModel.loadSettings( _this, "ratio"); } @@ -91,9 +91,9 @@ void BassBoosterControls::loadSettings( const QDomElement& _this ) void BassBoosterControls::saveSettings( QDomDocument& doc, QDomElement& _this ) { - _this.setAttribute( "freq", m_freqModel.value() ); - _this.setAttribute( "gain", m_gainModel.value() ); - _this.setAttribute( "ratio", m_ratioModel.value() ); + m_freqModel.saveSettings( doc, _this, "freq" ); + m_gainModel.saveSettings( doc, _this, "gain" ); + m_ratioModel.saveSettings( doc, _this, "ratio"); } diff --git a/plugins/dynamics_processor/dynamics_processor_controls.cpp b/plugins/dynamics_processor/dynamics_processor_controls.cpp index 614aed8e9..6d0a34672 100644 --- a/plugins/dynamics_processor/dynamics_processor_controls.cpp +++ b/plugins/dynamics_processor/dynamics_processor_controls.cpp @@ -86,11 +86,11 @@ void dynProcControls::samplesChanged( int _begin, int _end) void dynProcControls::loadSettings( const QDomElement & _this ) { //load knobs, stereomode - m_inputModel.setValue( _this.attribute( "inputGain" ).toFloat() ); - m_outputModel.setValue( _this.attribute( "outputGain" ).toFloat() ); - m_attackModel.setValue( _this.attribute( "attack" ).toFloat() ); - m_releaseModel.setValue( _this.attribute( "release" ).toFloat() ); - m_stereomodeModel.setValue( _this.attribute( "stereoMode" ).toInt() ); + m_inputModel.loadSettings( _this, "inputGain" ); + m_outputModel.loadSettings( _this, "outputGain" ); + m_attackModel.loadSettings( _this, "attack" ); + m_releaseModel.loadSettings( _this, "release" ); + m_stereomodeModel.loadSettings( _this, "stereoMode" ); //load waveshape int size = 0; @@ -109,11 +109,11 @@ void dynProcControls::saveSettings( QDomDocument & _doc, QDomElement & _this ) { //save input, output knobs - _this.setAttribute( "inputGain", m_inputModel.value() ); - _this.setAttribute( "outputGain", m_outputModel.value() ); - _this.setAttribute( "attack", m_attackModel.value() ); - _this.setAttribute( "release", m_releaseModel.value() ); - _this.setAttribute( "stereoMode", m_stereomodeModel.value() ); + m_inputModel.saveSettings( _doc, _this, "inputGain" ); + m_outputModel.saveSettings( _doc, _this, "outputGain" ); + m_attackModel.saveSettings( _doc, _this, "attack" ); + m_releaseModel.saveSettings( _doc, _this, "release" ); + m_stereomodeModel.saveSettings( _doc, _this, "stereoMode" ); //save waveshape diff --git a/plugins/stereo_enhancer/stereoenhancer_controls.cpp b/plugins/stereo_enhancer/stereoenhancer_controls.cpp index 8f6941156..4ea92c65e 100644 --- a/plugins/stereo_enhancer/stereoenhancer_controls.cpp +++ b/plugins/stereo_enhancer/stereoenhancer_controls.cpp @@ -51,7 +51,7 @@ void stereoEnhancerControls::changeWideCoeff() void stereoEnhancerControls::loadSettings( const QDomElement & _this ) { - m_widthModel.setValue( _this.attribute( "width" ).toFloat() ); + m_widthModel.loadSettings( _this, "width" ); } @@ -60,7 +60,7 @@ void stereoEnhancerControls::loadSettings( const QDomElement & _this ) void stereoEnhancerControls::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - _this.setAttribute( "width", m_widthModel.value() ); + m_widthModel.saveSettings( _doc, _this, "width" ); } diff --git a/plugins/stereo_matrix/stereomatrix_controls.cpp b/plugins/stereo_matrix/stereomatrix_controls.cpp index 6353063fd..69f60e7c9 100644 --- a/plugins/stereo_matrix/stereomatrix_controls.cpp +++ b/plugins/stereo_matrix/stereomatrix_controls.cpp @@ -59,10 +59,10 @@ void stereoMatrixControls::changeMatrix() void stereoMatrixControls::loadSettings( const QDomElement & _this ) { - m_llModel.setValue( _this.attribute( "l-l" ).toFloat() ); - m_lrModel.setValue( _this.attribute( "l-r" ).toFloat() ); - m_rlModel.setValue( _this.attribute( "r-l" ).toFloat() ); - m_rrModel.setValue( _this.attribute( "r-r" ).toFloat() ); + m_llModel.loadSettings( _this, "l-l" ); + m_lrModel.loadSettings( _this, "l-r" ); + m_rlModel.loadSettings( _this, "r-l" ); + m_rrModel.loadSettings( _this, "r-r" ); } @@ -71,10 +71,10 @@ void stereoMatrixControls::loadSettings( const QDomElement & _this ) void stereoMatrixControls::saveSettings( QDomDocument & _doc, QDomElement & _this ) { - _this.setAttribute( "l-l", m_llModel.value() ); - _this.setAttribute( "l-r", m_lrModel.value() ); - _this.setAttribute( "r-l", m_rlModel.value() ); - _this.setAttribute( "r-r", m_rrModel.value() ); + m_llModel.saveSettings( _doc, _this, "l-l" ); + m_lrModel.saveSettings( _doc, _this, "l-r" ); + m_rlModel.saveSettings( _doc, _this, "r-l" ); + m_rrModel.saveSettings( _doc, _this, "r-r" ); } diff --git a/plugins/waveshaper/waveshaper_controls.cpp b/plugins/waveshaper/waveshaper_controls.cpp index dd06f75e4..39e30d273 100644 --- a/plugins/waveshaper/waveshaper_controls.cpp +++ b/plugins/waveshaper/waveshaper_controls.cpp @@ -88,8 +88,8 @@ void waveShaperControls::samplesChanged( int _begin, int _end) void waveShaperControls::loadSettings( const QDomElement & _this ) { //load input, output knobs - m_inputModel.setValue( _this.attribute( "inputGain" ).toFloat() ); - m_outputModel.setValue( _this.attribute( "outputGain" ).toFloat() ); + m_inputModel.loadSettings( _this, "inputGain" ); + m_outputModel.loadSettings( _this, "outputGain" ); m_clipModel.loadSettings( _this, "clipInput" ); @@ -110,9 +110,9 @@ void waveShaperControls::saveSettings( QDomDocument & _doc, QDomElement & _this ) { //save input, output knobs - _this.setAttribute( "inputGain", m_inputModel.value() ); - _this.setAttribute( "outputGain", m_outputModel.value() ); - + m_inputModel.saveSettings( _doc, _this, "inputGain" ); + m_outputModel.saveSettings( _doc, _this, "outputGain" ); + m_clipModel.saveSettings( _doc, _this, "clipInput" ); //save waveshape