Commit f80955869a7c5282f7ef4183c8d68a589821ea57

Add initial equalizer support for Amarok. Currently works only with
phonon=xine backend and require latest phonon svn.
  
11/****************************************************************************************
22 * Copyright (c) 2004 Max Howell <max.howell@methylblue.com> *
33 * Copyright (c) 2008 Mark Kretschmann <kretschmann@kde.org> *
4 * Copyright (c) 2009 Artur Szymiec <artur.szymiec@gmail.com> *
45 * *
56 * This program is free software; you can redistribute it and/or modify it under *
67 * the terms of the GNU General Public License as published by the Free Software *
110110
111111 safePlug( ac, "cover_manager", this );
112112 safePlug( ac, "queue_manager", this );
113 safePlug( ac, "equalizer", this );
114113 safePlug( ac, "script_manager", this );
115114
116115 addSeparator();
380380 << i18n( "&Album" ) );
381381 //setIcons( QStringList() << "media-playlist-replaygain-off-amarok" << "media-track-replaygain-amarok" << "media-album-replaygain-amarok" );
382382 setCurrentItem( AmarokConfig::replayGainMode() );
383}
384
385//////////////////////////////////////////////////////////////////////////////////////////
386// EqualizerAction
387//////////////////////////////////////////////////////////////////////////////////////////
388EqualizerAction::EqualizerAction( KActionCollection *ac, QObject *parent ) :
389 SelectAction( i18n( "&Equalizer" ), &AmarokConfig::setEqualizerMode, ac, "equalizer_mode", parent )
390{
391 NewList();
392 UpdateContent();
393 connect( this, SIGNAL( triggered( int ) ), this, SLOT( actTrigg( int ) ) );
394}
395
396void
397EqualizerAction::UpdateContent() //SLOT
398{
399 blockSignals( true );
400 setCurrentItem( AmarokConfig::equalizerMode() );
401 blockSignals( false );
402}
403
404void
405EqualizerAction::NewList() //SLOT
406{
407 if( !The::engineController()->isEqSupported() )
408 {
409 setEnabled( false );
410 return;
411 }
412 setEnabled( true );
413 setItems( QStringList() << i18nc( "State, as in, disabled", "&Off" ) << eqGlobalList() );
414}
415
416void
417EqualizerAction::actTrigg( int index ) //SLOT
418{
419 if( The::engineController()->isEqSupported() )
420 {
421 AmarokConfig::setEqualizerGains( eqCfgGetPresetVal( index - 1 ) );
422 The::engineController()->eqUpdate();
423 }
424}
425
426QStringList
427EqualizerAction::eqGlobalList()
428{
429 // Prepare a global list with duplicates removed
430 QStringList mGlobalList;
431 mGlobalList += AmarokConfig::defEqualizerPresetsNames();
432 foreach( QString mUsrName, AmarokConfig::equalizerPresetsNames() )
433 {
434 if( mGlobalList.indexOf( mUsrName ) < 0 )
435 mGlobalList.append( mUsrName );
436 }
437 return mGlobalList;
438}
439
440QList<int>
441EqualizerAction::eqCfgGetPresetVal( int mPresetNo )
442{
443 QList<int> mPresetVal;
444 if( mPresetNo > eqGlobalList().count() || mPresetNo < 0 )
445 return mPresetVal;
446 QString mPresetName = eqGlobalList().at(mPresetNo);
447 int idUsr = AmarokConfig::equalizerPresetsNames().indexOf( mPresetName );
448 int idDef = AmarokConfig::defEqualizerPresetsNames().indexOf( mPresetName );
449 if( idUsr >= 0 )
450 {
451 mPresetVal = AmarokConfig::equalizerPresestValues().mid( idUsr*11,11 );
452 }
453 else if( idDef >= 0)
454 {
455
456 mPresetVal = AmarokConfig::defEqualizerPresestValues().mid( idDef*11,11 );
457 }
458 return mPresetVal;
383459}
384460
385461//////////////////////////////////////////////////////////////////////////////////////////
  
11/****************************************************************************************
22 * Copyright (c) 2004 Max Howell <max.howell@methylblue.com> *
33 * Copyright (c) 2008 Mark Kretschmann <kretschmann@kde.org> *
4 * Copyright (c) 2009 Artur Szymiec <artur.szymiec@gmail.com> *
45 * *
56 * This program is free software; you can redistribute it and/or modify it under *
67 * the terms of the GNU General Public License as published by the Free Software *
119119 {
120120 public:
121121 ReplayGainModeAction( KActionCollection *ac, QObject* );
122 };
123
124 class EqualizerAction : public SelectAction
125 {
126 Q_OBJECT
127 public:
128 EqualizerAction( KActionCollection *ac, QObject* );
129 public slots:
130 void UpdateContent();
131 void NewList();
132 private slots:
133 void actTrigg( int index );
134 private:
135 QStringList eqGlobalList();
136 QList<int> eqCfgGetPresetVal ( int mPresetNo );
122137 };
123138
124139 class BurnMenu : public KMenu
  
55 * Copyright (c) 2006,2008 Ian Monroe <ian@monroe.nu> *
66 * Copyright (c) 2008 Jason A. Donenfeld <Jason@zx2c4.com> *
77 * Copyright (c) 2009 Nikolaj Hald Nielsen <nhnFreespirit@gmail.com> *
8 * Copyright (c) 2009 Artur Szymiec <artur.szymiec@gmail.com> *
89 * *
910 * This program is free software; you can redistribute it and/or modify it under *
1011 * the terms of the GNU General Public License as published by the Free Software *
110110 delete m_controller;
111111 delete m_audio;
112112 delete m_preamp;
113 delete m_equalizer;
113114
114115 PERF_LOG( "EngineController: loading phonon objects" )
115116 m_media = new Phonon::MediaObject( this );
120120
121121 m_controller = new Phonon::MediaController( m_media );
122122
123 //Add an equalizer effect if avaiable
124 QList<Phonon::EffectDescription> mEffectDescriptions = Phonon::BackendCapabilities::availableAudioEffects();
125 foreach ( Phonon::EffectDescription mDescr, mEffectDescriptions ) {
126 if ( mDescr.name() == QLatin1String( "KEqualizer" ) ) {
127 m_equalizer = new Phonon::Effect( mDescr );
128 eqUpdate();
129 }
130 }
131
123132 // HACK we turn off replaygain manually on OSX, until the phonon coreaudio backend is fixed.
124133 // as the default is specified in the .cfg file, we can't just tell it to be a different default on OSX
125134#ifdef Q_WS_MAC
665665EngineController::trackPositionMs() const
666666{
667667 return m_media->currentTime();
668}
669
670bool
671EngineController::isEqSupported() const
672{
673 // If effect was created it means we have equalizer support
674 return ( !m_equalizer.isNull() );
675}
676
677
678double
679EngineController::eqMaxGain() const
680{
681 if( m_equalizer.isNull() )
682 return 100;
683 QList<Phonon::EffectParameter> mEqPar = m_equalizer->parameters();
684 if( mEqPar.isEmpty() )
685 return 100.0;
686 double mScale;
687 mScale = ( fabs(mEqPar.at(0).maximumValue().toDouble() ) + fabs( mEqPar.at(0).minimumValue().toDouble() ) );
688 mScale /= 2.0;
689 return mScale;
690}
691
692QStringList
693EngineController::eqBandsFreq() const
694{
695 // This will extract the bands frequency values from effect paramter name
696 // as long as they folow the rules:
697 // eq-preamp paramter will contain 'pre-amp' string
698 // bands parameters are described using schema 'xxxHz'
699 QStringList mBandsFreq;
700 if( m_equalizer.isNull() )
701 return mBandsFreq;
702 QList<Phonon::EffectParameter> mEqPar = m_equalizer->parameters();
703 if( mEqPar.isEmpty() )
704 return mBandsFreq;
705 QRegExp rx( "\\d+(?=Hz)" );
706 foreach( Phonon::EffectParameter mParam, mEqPar )
707 {
708 if( mParam.name().contains( QString( "pre-amp" ) ) )
709 {
710 mBandsFreq << i18n( "Preamp" );
711 }
712 else if ( mParam.name().contains( rx ) )
713 {
714 if( rx.cap( 0 ).toInt() < 1000 )
715 {
716 mBandsFreq << QString( rx.cap( 0 )).append( " Hz" );
717 }
718 else
719 {
720 mBandsFreq << QString::number( rx.cap( 0 ).toInt()/1000 ).append( " kHz" );
721 }
722 }
723 }
724 return mBandsFreq;
725}
726
727void
728EngineController::eqUpdate() //SLOT
729{
730 // if equalizer not present simply return
731 if( m_equalizer.isNull() )
732 return;
733 // checkif equalizer should be disabled ??
734 if( AmarokConfig::equalizerMode() <= 0 )
735 {
736 // Remove effect from path
737 if( m_path.effects().indexOf( m_equalizer ) != -1 )
738 m_path.removeEffect( m_equalizer );
739 }
740 else
741 {
742 // Set equalizer parameter according to the gains from setttings
743 QList<Phonon::EffectParameter> mEqPar = m_equalizer->parameters();
744 QList<int> mEqParCfg = AmarokConfig::equalizerGains();
745
746 QListIterator<int> mEqParNewIt( mEqParCfg );
747 double scaledVal; // Scaled value to set from universal -100 - 100 range to plugin scale
748 foreach( Phonon::EffectParameter mParam, mEqPar )
749 {
750 scaledVal = mEqParNewIt.hasNext() ? mEqParNewIt.next() : 0;
751 scaledVal *= ( fabs(mParam.maximumValue().toDouble() ) + fabs( mParam.minimumValue().toDouble() ) );
752 scaledVal /= 200.0;
753 m_equalizer->setParameterValue( mParam, scaledVal );
754 }
755 // Insert effect into path if needed
756 if( m_path.effects().indexOf( m_equalizer ) == -1 )
757 {
758 if( !m_path.effects().isEmpty() )
759 {
760 m_path.insertEffect( m_equalizer, m_path.effects().first() );
761 }
762 else
763 {
764 m_path.insertEffect( m_equalizer );
765 }
766 }
767 }
668768}
669769
670770//////////////////////////////////////////////////////////////////////////////////////////
  
33 * Copyright (c) 2004,2005 Max Howell <max.howell@methylblue.com> *
44 * Copyright (c) 2004-2008 Mark Kretschmann <kretschmann@kde.org> *
55 * Copyright (c) 2008 Jason A. Donenfeld <Jason@zx2c4.com> *
6 * Copyright (c) 2009 Artur Szymiec <artur.szymiec@gmail.com> *
67 * *
78 * This program is free software; you can redistribute it and/or modify it under *
89 * the terms of the GNU General Public License as published by the Free Software *
3333#include <Phonon/Path>
3434#include <Phonon/MediaController>
3535#include <Phonon/MediaObject>
36#include <Phonon/Effect>
37#include <Phonon/EffectParameter>
3638
3739class QTimer;
3840
140140 */
141141 bool isStream();
142142
143 /**
144 * Phonon kequalizer support is required for Amarok to enable equalizer
145 * this method return whatever ponon support kequalizer effect.
146 *
147 * @return @c true if the phonon support kequalizer effect, @c false otherwise
148 */
149 bool isEqSupported() const;
150
151 /**
152 * kequalizer implementation for different backends may have different
153 * gain scale. To properly display it we need to get a scale from effect
154 *
155 * @return maximum gain value for kequalizer parameters.
156 */
157 double eqMaxGain() const;
158
159 /**
160 * kequalizer implementation for different backends may have different
161 * frequency bands. For proper display this will try to extract frequency values
162 * from effect parameters info.
163 *
164 * @return QStringList with band labels (form xxx Hz or xxx kHz).
165 */
166 QStringList eqBandsFreq() const;
167
143168public slots:
144169 /**
145170 * Plays the current track, if there is one
273273 */
274274 void toggleMute();
275275
276 /**
277 * Update equalizer status - enabled,disabled,set values
278 *
279 *
280 */
281 void eqUpdate();
282
276283private slots:
277284 /**
278285 * Sets up the Phonon system
319319
320320 QPointer<Phonon::MediaObject> m_media;
321321 QPointer<Phonon::VolumeFaderEffect> m_preamp;
322 QPointer<Phonon::Effect> m_equalizer;
322323 QPointer<Phonon::AudioOutput> m_audio;
323324 QPointer<Phonon::VolumeFaderEffect> m_fader;
324325 QPointer<Phonon::MediaController> m_controller;
  
33 * Copyright (c) 2002 Max Howell <max.howell@methylblue.com> *
44 * Copyright (c) 2002 Gabor Lehel <illissius@gmail.com> *
55 * Copyright (c) 2002 Nikolaj Hald Nielsen <nhnFreespirit@gmail.com> *
6 * Copyright (c) 2009 Artur Szymiec <artur.szymiec@gmail.com> *
67 * *
78 * This program is free software; you can redistribute it and/or modify it under *
89 * the terms of the GNU General Public License as published by the Free Software *
769769 new Amarok::RandomAction( ac, this );
770770 new Amarok::FavorAction( ac, this );
771771 new Amarok::ReplayGainModeAction( ac, this );
772 new Amarok::EqualizerAction( ac, this);
772773
773774 ac->addAssociatedWidget( this );
774775 foreach (QAction* action, ac->actions())
879879 m_settingsMenu->addAction( Amarok::actionCollection()->action("replay_gain_mode") );
880880 m_settingsMenu->addSeparator();
881881#endif
882
883 // Add equalizer action - a list with all equalizer presets avaiable
884 m_settingsMenu->addAction( Amarok::actionCollection()->action("equalizer_mode") );
885 m_settingsMenu->addSeparator();
882886
883887 m_settingsMenu->addAction( Amarok::actionCollection()->action(KStandardAction::name(KStandardAction::KeyBindings)) );
884888 m_settingsMenu->addAction( Amarok::actionCollection()->action(KStandardAction::name(KStandardAction::Preferences)) );
  
245245 <label>Whether to fade out when exiting the program.</label>
246246 <default>true</default>
247247 </entry>
248 <entry key="Equalizer Enabled" type="Bool">
249 <label>Enables the equalizer plugin</label>
248 <entry key="EqualizerMode" type="Int">
249 <label>Equalizer mode - 0 = off, 1 to n = preset no</label>
250250 <whatsthis>When enabled, an equalizer plugin filters the audio stream.</whatsthis>
251251 <default>false</default>
252252 </entry>
253 <entry key="Equalizer Preamp" type="Int">
254 <label>Equalizer pre-amplification value, range -100..100, 0 is normal.</label>
255 <default>0</default>
256 <min>-100</min>
257 <max>100</max>
253 <entry key="EqualizerGains" type="IntList">
254 <label>11 Equalizer gains include pre-amp, range -100..100, 0 is normal.</label>
255 <default>0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0</default>
258256 </entry>
259 <entry key="Equalizer Gains" type="IntList">
260 <label>Band gains for equalizer, 10 values, range -100..100, 0 is normal.</label>
261 <default>0, 0, 0, 0, 0, 0, 0, 0, 0, 0</default>
257 <entry key="EqualizerPresetsNames" type="StringList">
258 <label>List with user equalizer preset names</label>
262259 </entry>
263 <entry key="Equalizer Preset" type="String">
264 <label>Equalizer preset name.</label>
265 <default>Zero</default>
260 <entry key="EqualizerPresestValues" type="IntList">
261 <label>List with user presets values</label>
266262 </entry>
263 <entry key="DefEqualizerPresetsNames" type="StringList">
264 <label>List with user equalizer preset names</label>
265 <default>Manual,Classical,Club,Dance,Full Bass,Full Treble,Full Bass + Treble,Laptop/Headphones,Large Hall,Live,Party,Pop,Reggae,Rock,Soft,Ska,Soft Rock,Techno,Zero</default>
266 </entry>
267 <entry key="DefEqualizerPresestValues" type="IntList">
268 <default>
269 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, <!-- Manual -->
270 0, 0, 0, 0, 0, 0, 0, -40, -40, -40, -50, <!-- Classical -->
271 0, 0, 0, 20, 30, 30, 30, 20, 0, 0, 0, <!-- Club -->
272 -10, 50, 35, 10, 0, 0, -30, -40, -40, 0, 0, <!-- Dance -->
273 0, 29, 40, 23, 15, 0, 0, 0, 0, 0, 0, <!-- Full Bass -->
274 -83, -50, -50, -50, -25, 15, 55, 80, 80, 80, 85, <!-- Full Treble -->
275 -41, 35, 30, 0, -40, -25, 10, 45, 55, 60, 60, <!-- Full Bass + Treble -->
276 -16, 25, 50, 25, -20, 0, -30, -40, -40, 0, 0, <!-- Laptop/Headphones -->
277 -25, 50, 50, 30, 30, 0, -25, -25, -25, 0, 0, <!-- Large Hall -->
278 0, -25, 0, 20, 25, 30, 30, 20, 15, 15, 10, <!-- Live -->
279 0, 35, 35, 0, 0, 0, 0, 0, 0, 35, 35, <!-- Party -->
280 -15, -10, 25, 35, 40, 25, -5, -15, -15, -10, -10, <!-- Pop -->
281 0, 0, 0, -5, -30, 0, -35, -35, 0, 0, 0, <!-- Reggae -->
282 -28, 40, 25, -30, -40, -20, 20, 45, 55, 55, 55, <!-- Rock -->
283 -33, 25, 10, -5, -15, -5, 20, 45, 50, 55, 60, <!-- Soft -->
284 -29, -15, -25, -25, -5, 20, 30, 45, 50, 55, 50, <!-- Ska -->
285 0, 20, 20, 10, -5, -25, -30, -20, -5, 15, 45, <!-- Soft Rock -->
286 -26, 40, 30, 0, -30, -25, 0, 40, 50, 50, 45, <!-- Techno -->
287 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 <!-- Zero -->
288 </default>
289 <label>List with user presets values</label>
290 </entry>
291
267292 <entry key="Replay Gain Mode" type="Enum">
268293 <label>The mode for adjusting playback volume.</label>
269294 <whatsthis>Whether to adjust the volume of tracks to make them sound the same volume, and if so whether to make the adjustments per-track or per-album.</whatsthis>
  
11/****************************************************************************************
22 * Copyright (c) 2004-2009 Mark Kretschmann <kretschmann@kde.org> *
3 * Copyright (c) 2009 Artur Szymiec <artur.szymiec@gmail.com> *
34 * *
45 * This program is free software; you can redistribute it and/or modify it under *
56 * the terms of the GNU General Public License as published by the Free Software *
1616 ****************************************************************************************/
1717
1818#include "PlaybackConfig.h"
19
19#include "amarokconfig.h"
20#include "Amarok.h"
21#include "ActionClasses.h"
22#include "EngineController.h"
2023#include "Debug.h"
21
2224#include <KCMultiDialog>
25#include <kmessagebox.h>
2326
24
2527PlaybackConfig::PlaybackConfig( QWidget* parent )
2628 : ConfigDialogBase( parent )
2729{
3131 kcfg_FadeoutOnExit->setHidden( true );
3232
3333 connect( findChild<QPushButton*>( "pushButtonPhonon" ), SIGNAL( clicked() ), SLOT( configurePhonon() ) );
34
35 // Set up equalizer items :
36 eqSetupUI();
3437}
3538
3639PlaybackConfig::~PlaybackConfig()
7878 KCM->deleteLater();
7979}
8080
81///////////////////////////////////////////////////////////////
82// EQUALIZER METHODS
83///////////////////////////////////////////////////////////////
84void
85PlaybackConfig::eqSetupUI()
86{
87 // Check if equalizer is supported - disable controls if not
88 if( !The::engineController()->isEqSupported() )
89 {
90 EqualizerGroupBox->setDisabled(true);
91 EqualizerGroupBox->setTitle( i18n( "Equalizer not supported by Phonon") );
92 return;
93 }
94 // Assign slider items to vectors
95 mBands.append( eqPreampSlider );
96 mBands.append( eqBand0Slider );
97 mBands.append( eqBand1Slider );
98 mBands.append( eqBand2Slider );
99 mBands.append( eqBand3Slider );
100 mBands.append( eqBand4Slider );
101 mBands.append( eqBand5Slider );
102 mBands.append( eqBand6Slider );
103 mBands.append( eqBand7Slider );
104 mBands.append( eqBand8Slider );
105 mBands.append( eqBand9Slider );
106 mBandsValues.append( eqPreampValue );
107 mBandsValues.append( eqBand0Value );
108 mBandsValues.append( eqBand1Value );
109 mBandsValues.append( eqBand2Value );
110 mBandsValues.append( eqBand3Value );
111 mBandsValues.append( eqBand4Value );
112 mBandsValues.append( eqBand5Value );
113 mBandsValues.append( eqBand6Value );
114 mBandsValues.append( eqBand7Value );
115 mBandsValues.append( eqBand8Value );
116 mBandsValues.append( eqBand9Value );
117 mBandsLabels.append( eqPreampLabel );
118 mBandsLabels.append( eqBand0Label );
119 mBandsLabels.append( eqBand1Label );
120 mBandsLabels.append( eqBand2Label );
121 mBandsLabels.append( eqBand3Label );
122 mBandsLabels.append( eqBand4Label );
123 mBandsLabels.append( eqBand5Label );
124 mBandsLabels.append( eqBand6Label );
125 mBandsLabels.append( eqBand7Label );
126 mBandsLabels.append( eqBand8Label );
127 mBandsLabels.append( eqBand9Label );
128 // Configure signal and slots to handle presets
129 connect( eqPresets, SIGNAL( currentIndexChanged( int ) ), SLOT ( eqPresetChanged( int ) ) );
130 foreach( QSlider* mSlider, mBands )
131 connect( mSlider, SIGNAL( valueChanged( int ) ), SLOT ( eqBandsChanged() ) );
132 connect( eqPresetSaveBtn, SIGNAL( clicked() ), SLOT( eqSavePreset() ) );
133 connect( eqPresetDeleteBtn, SIGNAL( clicked() ), SLOT( eqDeletePreset() ) );
134 connect( eqPresetResetBtn, SIGNAL( clicked() ), SLOT( eqRestorePreset() ) );
135 // Signals exchange to keep both config dialog and eq action in sync
136 connect( eqPresets, SIGNAL( currentIndexChanged( int ) ),
137 Amarok::actionCollection()->action( "equalizer_mode" ), SLOT( UpdateContent() ) );
138 connect( Amarok::actionCollection()->action( "equalizer_mode" ), SIGNAL( triggered(int) ),
139 SLOT( eqUpdateUI( int ) ) );
140 // Ask engine for maximum gain value and compute scale to display values
141 mValueScale = The::engineController()->eqMaxGain();
142 QString mlblText;
143 mlblText = QString::number( mValueScale, 'f', 1 );
144 mlblText.append( QString( "dB" ) );
145 eqMaxEq->setText( mlblText.prepend( QString( "+ " ) ) );
146 eqMinEq->setText( mlblText.prepend( QString( "- " ) ) );
147 // Ask engine for band frequencies and set labels
148 QStringList meqBandFrq = The::engineController()->eqBandsFreq();
149 QStringListIterator i( meqBandFrq );
150 foreach( QLabel* mLabel, mBandsLabels )
151 mLabel-> setText( i.hasNext() ? i.next() : "N/A" );
152 // Set initial preset to current with signal blocking toprevent circular loops
153 eqPresets->blockSignals( true );
154 eqPresets->addItem( i18nc( "State, as in, disabled", "Off" ) );
155 eqPresets->addItems( eqGlobalList() );
156 eqPresets->blockSignals( false );
157 eqUpdateUI( AmarokConfig::equalizerMode() );
158}
81159
160void
161PlaybackConfig::eqPresetChanged( int index ) //SLOT
162{
163 if( index < 0 )
164 return;
165 // new settings
166 AmarokConfig::setEqualizerMode( index );
167 AmarokConfig::setEqualizerGains( eqCfgGetPresetVal( eqPresets->currentText() ) );
168 The::engineController()->eqUpdate();
169 // update controls
170 eqUpdateUI( index );
171}
172
173void
174PlaybackConfig::eqBandsChanged() //SLOT
175{
176 // update values from sliders
177 QList<int> eqGains;
178 foreach( QSlider* mSlider, mBands )
179 eqGains << mSlider->value();
180 eqUpdateToolTips();
181 eqUpdateLabels( eqGains );
182 AmarokConfig::setEqualizerGains( eqGains );
183 The::engineController()->eqUpdate();
184 // Change preset to manual
185 eqPresets->blockSignals( true );
186 eqPresets->setCurrentIndex( 1 );
187 eqPresets->blockSignals( false );
188}
189
190void
191PlaybackConfig::eqUpdateToolTips()
192{
193 foreach( QSlider* mSlider, mBands )
194 mSlider->setToolTip( QString::number( mSlider->value()*mValueScale/100.0, 'f', 1 ) );
195}
196
197void
198PlaybackConfig::eqUpdateLabels( QList<int> & mEqGains )
199{
200 QListIterator<int> i( mEqGains );
201 foreach( QLabel* mLabel, mBandsValues )
202 mLabel->setText( i.hasNext() ? QString::number( i.next()*mValueScale/100.0, 'f', 1 ) : QString::number( 0 ) );
203}
204
205// SLOTS
206
207void
208PlaybackConfig::eqUpdateUI( int index ) // SLOT
209{
210 if( index < 0 )
211 return;
212 bool mstate = index>0 ? true : false;
213 eqBandsGroupBox->setEnabled( mstate );
214 eqPresetSaveBtn->setEnabled( mstate );
215 eqPresetDeleteBtn->setEnabled( mstate );
216 eqPresetResetBtn->setEnabled( mstate );
217 QList<int> eqGains = AmarokConfig::equalizerGains();
218 QListIterator<int> i( eqGains );
219 // Update slider values with signal blocking to prevent circular loop
220 foreach( QSlider* mSlider, mBands )
221 {
222 mSlider->blockSignals( true );
223 mSlider->setValue( i.hasNext() ? i.next() : 0 );
224 mSlider->blockSignals( false );
225 }
226 eqUpdateToolTips();
227 eqUpdateLabels(eqGains);
228 // Update preset list - with signal blocking to prevent circular loop
229 eqPresets->blockSignals( true );
230 eqPresets->setCurrentIndex( index );
231 eqPresets->blockSignals( false) ;
232}
233
234void
235PlaybackConfig::eqDeletePreset() //SLOT
236{
237 QString mPresetSelected = eqPresets->currentText();
238 if( eqCfgDeletePreset( mPresetSelected ) )
239 {
240 eqPresets->blockSignals( true );
241 eqPresets->clear();
242 eqPresets->addItem( i18nc( "State, as in, disabled", "Off" ) );
243 eqPresets->addItems( eqGlobalList() );
244 eqPresets->blockSignals( false );
245 ( (Amarok::EqualizerAction*) Amarok::actionCollection()->action( "equalizer_mode") )->NewList();
246 eqPresets->setCurrentIndex( 1 );
247 }
248 else
249 {
250 KMessageBox::detailedSorry( this, i18n( "Can't delete this preset !" ),
251 i18n( "Default presets can't be deleted." ),
252 i18n( "Error deleting preset" ) );
253 }
254}
255
256void
257PlaybackConfig::eqRestorePreset() //SLOT
258{
259 QString mPresetSelected = eqPresets->currentText();
260 if( !eqCfgRestorePreset( mPresetSelected ) )
261 {
262 KMessageBox::detailedSorry( this, i18n( "Can't restore this preset !" ),
263 i18n( "Only default presets can be restored." ),
264 i18n( "Error restoring preset" ) );
265 return;
266 }
267 // new settings
268 ///AmarokConfig::setEqualizerMode( eqPresets->currentIndex() );
269 AmarokConfig::setEqualizerGains( eqCfgGetPresetVal( eqPresets->currentText() ) );
270 The::engineController()->eqUpdate();
271 // update controls
272 eqUpdateUI( eqPresets->currentIndex() );
273}
274
275void
276PlaybackConfig::eqSavePreset() //SLOT
277{
278 QString mPresetSelected = eqPresets->currentText();
279 if( mPresetSelected == QLatin1String( "Manual" ) )
280 {
281 KMessageBox::detailedSorry( this, i18n( "Can't save this preset !" ),
282 i18n( "Preset 'Manual' is reserved for momentary settings.\n\
283 Please choose different name and try again." ),
284 i18n( "Error saving preset" ) );
285 return;
286 }
287 QList<int> eqGains;
288 foreach( QSlider* mSlider, mBands )
289 eqGains << mSlider->value();
290 eqCfgSetPresetVal( mPresetSelected, eqGains );
291 eqPresets->blockSignals( true );
292 eqPresets->clear();
293 eqPresets->addItem( i18nc( "State, as in, disabled", "Off" ) );
294 eqPresets->addItems( eqGlobalList() );
295 ( (Amarok::EqualizerAction*) Amarok::actionCollection()->action( "equalizer_mode") )->NewList();
296 eqPresets->blockSignals( false );
297 eqPresets->setCurrentIndex( eqPresets->findText( mPresetSelected ) );
298}
299
300// Equalizer preset managment helper functions
301bool
302PlaybackConfig::eqCfgDeletePreset( QString & mPresetName )
303{
304 // Idea is to delete the preset only if it is user preset:
305 // present on user list & absent od default list
306 int idUsr = AmarokConfig::equalizerPresetsNames().indexOf( mPresetName );
307 int idDef = AmarokConfig::defEqualizerPresetsNames().indexOf( mPresetName );
308 if( idUsr >= 0 && idDef < 0 )
309 {
310 QStringList mNewNames = AmarokConfig::equalizerPresetsNames();
311 QList<int> mNewValues = AmarokConfig::equalizerPresestValues();
312 mNewNames.removeAt( idUsr );
313 for( int it = 0; it <= 10; it++ )
314 {
315 mNewValues.removeAt( 11*idUsr );
316 }
317 AmarokConfig::setEqualizerPresetsNames( mNewNames );
318 AmarokConfig::setEqualizerPresestValues( mNewValues );
319 return true;
320 }
321 return false;
322}
323
324bool
325PlaybackConfig::eqCfgRestorePreset( QString mPresetName )
326{
327 // Idea is to delete the preset if it found on both
328 // user list and default list - delete from the latter if so
329 int idUsr = AmarokConfig::equalizerPresetsNames().indexOf( mPresetName );
330 int idDef = AmarokConfig::defEqualizerPresetsNames().indexOf( mPresetName );
331 if( idDef >= 0 )
332 {
333 QStringList mNewNames = AmarokConfig::equalizerPresetsNames();
334 QList<int> mNewValues = AmarokConfig::equalizerPresestValues();
335 mNewNames.removeAt( idUsr );
336 for( int it = 0; it <= 10; it++ )
337 {
338 mNewValues.removeAt( 11*idUsr );
339 }
340 AmarokConfig::setEqualizerPresetsNames( mNewNames );
341 AmarokConfig::setEqualizerPresestValues( mNewValues );
342 return true;
343 }
344 return false;
345}
346
347void
348PlaybackConfig::eqCfgSetPresetVal( QString & mPresetName, QList<int> & mPresetValues)
349{
350 // Idea is to insert new values into user list
351 // if preset exist on the list - replace it values
352 int idUsr = AmarokConfig::equalizerPresetsNames().indexOf( mPresetName );
353 QStringList mNewNames = AmarokConfig::equalizerPresetsNames();
354 QList<int> mNewValues = AmarokConfig::equalizerPresestValues();
355
356 if( idUsr < 0 )
357 {
358 mNewNames.append( mPresetName );
359 mNewValues += mPresetValues;
360 }
361 else
362 {
363 for( int it = 0; it <= 10; it++ )
364 {
365 mNewValues.replace( idUsr*11+it,mPresetValues.value(it) );
366 }
367 }
368 AmarokConfig::setEqualizerPresetsNames( mNewNames );
369 AmarokConfig::setEqualizerPresestValues( mNewValues );
370}
371
372QList<int>
373PlaybackConfig::eqCfgGetPresetVal( QString mPresetName )
374{
375 // Idea is to return user preset with request name first
376 // if not look into into deafult preset names
377 int idUsr = AmarokConfig::equalizerPresetsNames().indexOf( mPresetName );
378 int idDef = AmarokConfig::defEqualizerPresetsNames().indexOf( mPresetName );
379
380 QList<int> mPresetVal;
381 if( idUsr >= 0 )
382 {
383 mPresetVal = AmarokConfig::equalizerPresestValues().mid( idUsr*11,11 );
384 }
385 else if( idDef >= 0)
386 {
387
388 mPresetVal = AmarokConfig::defEqualizerPresestValues().mid( idDef*11,11 );
389 }
390 return mPresetVal;
391}
392
393
394QStringList
395PlaybackConfig::eqGlobalList()
396{
397 // This function will build up a global list
398 // first a default preset will comes
399 // then user list is filtered to ommit duplicates from default preset list
400 QStringList mGlobalList;
401 mGlobalList += AmarokConfig::defEqualizerPresetsNames();
402 foreach( QString mUsrName, AmarokConfig::equalizerPresetsNames() )
403 {
404 if( mGlobalList.indexOf( mUsrName ) < 0 )
405 mGlobalList.append( mUsrName );
406 }
407 return mGlobalList;
408}
82409#include "PlaybackConfig.moc"
  
11/****************************************************************************************
22 * Copyright (c) 2004-2009 Mark Kretschmann <kretschmann@kde.org> *
3 * Copyright (c) 2009 Artur Szymiec <artur.szymiec@gmail.com> *
34 * *
45 * This program is free software; you can redistribute it and/or modify it under *
56 * the terms of the GNU General Public License as published by the Free Software *
2222#include "ConfigDialogBase.h"
2323
2424
25
2526class PlaybackConfig : public ConfigDialogBase, public Ui_PlaybackConfig
2627{
2728 Q_OBJECT
3434 virtual bool hasChanged();
3535 virtual bool isDefault();
3636 virtual void updateSettings();
37
37 public Q_SLOTS:
38 void eqUpdateUI( int index );
3839 private Q_SLOTS:
3940 void configurePhonon();
41 void eqPresetChanged( int index );
42 void eqBandsChanged();
43 void eqSavePreset();
44 void eqDeletePreset();
45 void eqRestorePreset();
46 private:
47 double mValueScale;
48 QVector<QSlider*> mBands;
49 QVector<QLabel*> mBandsValues;
50 QVector<QLabel*> mBandsLabels;
51 void eqSetupUI();
52 void eqUpdateToolTips();
53 void eqUpdateLabels( QList<int> & mEqGains );
54 bool eqCfgDeletePreset( QString & mPresetName );
55 bool eqCfgRestorePreset( QString mPresetName );
56 void eqCfgSetPresetVal( QString & mPresetName, QList<int> & mPresetValues);
57 QList<int> eqCfgGetPresetVal ( QString mPresetName );
58 QStringList eqGlobalList();
4059};
41
4260
4361#endif
  
66 <rect>
77 <x>0</x>
88 <y>0</y>
9 <width>320</width>
10 <height>349</height>
9 <width>801</width>
10 <height>706</height>
1111 </rect>
1212 </property>
13 <layout class="QVBoxLayout" name="verticalLayout_2">
14 <item>
13 <layout class="QGridLayout" name="gridLayout_5">
14 <item row="0" column="0">
1515 <widget class="QGroupBox" name="groupBox_2">
1616 <property name="title">
1717 <string>Sound system configuration</string>
3333 </layout>
3434 </widget>
3535 </item>
36 <item>
36 <item row="1" column="0">
3737 <widget class="QGroupBox" name="opt_crossfade_2">
3838 <property name="whatsThis">
3939 <string>&lt;b&gt;Quit Behavior&lt;/b&gt;
9191 </layout>
9292 </widget>
9393 </item>
94 <item>
94 <item row="2" column="0">
9595 <widget class="QGroupBox" name="groupBox">
9696 <property name="title">
9797 <string>Miscellaneous</string>
9898 </property>
9999 <layout class="QGridLayout" name="gridLayout_3">
100 <item row="0" column="0">
100 <item row="1" column="0">
101101 <widget class="QCheckBox" name="kcfg_FadeoutOnExit">
102102 <property name="toolTip">
103103 <string>If checked, Amarok will fade out the music on program exit.</string>
107107 </property>
108108 </widget>
109109 </item>
110 <item row="1" column="0">
110 <item row="2" column="0">
111111 <widget class="QCheckBox" name="kcfg_ResumePlayback">
112112 <property name="toolTip">
113113 <string>If checked, Amarok will&lt;br&gt;resume playback from where you left it the previous session -- just like a tape-player.</string>
120120 </layout>
121121 </widget>
122122 </item>
123 <item>
123 <item row="6" column="0">
124124 <spacer name="verticalSpacer">
125125 <property name="orientation">
126126 <enum>Qt::Vertical</enum>
132132 </size>
133133 </property>
134134 </spacer>
135 </item>
136 <item row="3" column="0">
137 <widget class="QGroupBox" name="EqualizerGroupBox">
138 <property name="title">
139 <string>Equalizer</string>
140 </property>
141 <layout class="QGridLayout" name="gridLayout_7">
142 <item row="2" column="0">
143 <widget class="QLabel" name="eqPresetslabel">
144 <property name="text">
145 <string>Presets:</string>
146 </property>
147 </widget>
148 </item>
149 <item row="5" column="0">
150 <widget class="QComboBox" name="eqPresets">
151 <property name="sizePolicy">
152 <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
153 <horstretch>0</horstretch>
154 <verstretch>0</verstretch>
155 </sizepolicy>
156 </property>
157 <property name="toolTip">
158 <string>List of avaiable equalizer presets.</string>
159 </property>
160 <property name="editable">
161 <bool>true</bool>
162 </property>
163 </widget>
164 </item>
165 <item row="5" column="1">
166 <widget class="QPushButton" name="eqPresetSaveBtn">
167 <property name="sizePolicy">
168 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
169 <horstretch>0</horstretch>
170 <verstretch>0</verstretch>
171 </sizepolicy>
172 </property>
173 <property name="toolTip">
174 <string>Save changes of currently selected preset</string>
175 </property>
176 <property name="text">
177 <string>Save</string>
178 </property>
179 </widget>
180 </item>
181 <item row="5" column="2">
182 <widget class="QPushButton" name="eqPresetDeleteBtn">
183 <property name="sizePolicy">
184 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
185 <horstretch>0</horstretch>
186 <verstretch>0</verstretch>
187 </sizepolicy>
188 </property>
189 <property name="toolTip">
190 <string>Delete currently selected preset. Not avaiable for built-in presets.</string>
191 </property>
192 <property name="text">
193 <string>Delete preset</string>
194 </property>
195 </widget>
196 </item>
197 <item row="5" column="3">
198 <widget class="QPushButton" name="eqPresetResetBtn">
199 <property name="sizePolicy">
200 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
201 <horstretch>0</horstretch>
202 <verstretch>0</verstretch>
203 </sizepolicy>
204 </property>
205 <property name="toolTip">
206 <string>Reset selected preset setting to default. Avaiable only for built-in preset.</string>
207 </property>
208 <property name="text">
209 <string>Reset to default</string>
210 </property>
211 </widget>
212 </item>
213 <item row="7" column="0" rowspan="2" colspan="4">
214 <widget class="QGroupBox" name="eqBandsGroupBox">
215 <property name="sizePolicy">
216 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
217 <horstretch>0</horstretch>
218 <verstretch>0</verstretch>
219 </sizepolicy>
220 </property>
221 <property name="minimumSize">
222 <size>
223 <width>0</width>
224 <height>200</height>
225 </size>
226 </property>
227 <property name="title">
228 <string>Bands</string>
229 </property>
230 <property name="flat">
231 <bool>false</bool>
232 </property>
233 <layout class="QGridLayout" name="gridLayout_11">
234 <property name="horizontalSpacing">
235 <number>5</number>
236 </property>
237 <item row="0" column="1">
238 <widget class="QGroupBox" name="groupBox_4">
239 <property name="enabled">
240 <bool>true</bool>
241 </property>
242 <property name="sizePolicy">
243 <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
244 <horstretch>0</horstretch>
245 <verstretch>0</verstretch>
246 </sizepolicy>
247 </property>
248 <property name="flat">
249 <bool>true</bool>
250 </property>
251 <property name="checkable">
252 <bool>false</bool>
253 </property>
254 <layout class="QVBoxLayout" name="verticalLayout_2">
255 <item>
256 <widget class="QLabel" name="eqMaxEq">
257 <property name="sizePolicy">
258 <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
259 <horstretch>0</horstretch>
260 <verstretch>0</verstretch>
261 </sizepolicy>
262 </property>
263 <property name="text">
264 <string>+ dB</string>
265 </property>
266 <property name="alignment">
267 <set>Qt::AlignCenter</set>
268 </property>
269 </widget>
270 </item>
271 <item>
272 <spacer name="verticalSpacer_3">
273 <property name="orientation">
274 <enum>Qt::Vertical</enum>
275 </property>
276 <property name="sizeHint" stdset="0">
277 <size>
278 <width>20</width>
279 <height>40</height>
280 </size>
281 </property>
282 </spacer>
283 </item>
284 <item>
285 <widget class="QLabel" name="eqZero">
286 <property name="sizePolicy">
287 <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
288 <horstretch>0</horstretch>
289 <verstretch>0</verstretch>
290 </sizepolicy>
291 </property>
292 <property name="text">
293 <string> 0 dB</string>
294 </property>
295 <property name="alignment">
296 <set>Qt::AlignCenter</set>
297 </property>
298 </widget>
299 </item>
300 <item>
301 <spacer name="verticalSpacer_4">
302 <property name="orientation">
303 <enum>Qt::Vertical</enum>
304 </property>
305 <property name="sizeHint" stdset="0">
306 <size>
307 <width>20</width>
308 <height>40</height>
309 </size>
310 </property>
311 </spacer>
312 </item>
313 <item>
314 <widget class="QLabel" name="eqMinEq">
315 <property name="text">
316 <string>- dB</string>
317 </property>
318 <property name="alignment">
319 <set>Qt::AlignCenter</set>
320 </property>
321 </widget>
322 </item>
323 <item>
324 <spacer name="verticalSpacer_2">
325 <property name="orientation">
326 <enum>Qt::Vertical</enum>
327 </property>
328 <property name="sizeHint" stdset="0">
329 <size>
330 <width>20</width>
331 <height>20</height>
332 </size>
333 </property>
334 </spacer>
335 </item>
336 </layout>
337 </widget>
338 </item>
339 <item row="0" column="2">
340 <widget class="QGroupBox" name="eqPreampGroupBox">
341 <property name="sizePolicy">
342 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
343 <horstretch>0</horstretch>
344 <verstretch>0</verstretch>
345 </sizepolicy>
346 </property>
347 <property name="title">
348 <string notr="true"/>
349 </property>
350 <property name="flat">
351 <bool>true</bool>
352 </property>
353 <layout class="QVBoxLayout" name="verticalLayout">
354 <item>
355 <widget class="QLabel" name="eqPreampValue">
356 <property name="text">
357 <string>0</string>
358 </property>
359 <property name="alignment">
360 <set>Qt::AlignCenter</set>
361 </property>
362 </widget>
363 </item>
364 <item>
365 <layout class="QHBoxLayout" name="eqPrampHLayout">
366 <property name="leftMargin">
367 <number>1</number>
368 </property>
369 <item>
370 <widget class="QSlider" name="eqPreampSlider">
371 <property name="sizePolicy">
372 <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
373 <horstretch>0</horstretch>
374 <verstretch>0</verstretch>
375 </sizepolicy>
376 </property>
377 <property name="layoutDirection">
378 <enum>Qt::LeftToRight</enum>
379 </property>
380 <property name="minimum">
381 <number>-100</number>
382 </property>
383 <property name="maximum">
384 <number>100</number>
385 </property>
386 <property name="sliderPosition">
387 <number>0</number>
388 </property>
389 <property name="orientation">
390 <enum>Qt::Vertical</enum>
391 </property>
392 <property name="tickPosition">
393 <enum>QSlider::TicksAbove</enum>
394 </property>
395 <property name="tickInterval">
396 <number>20</number>
397 </property>
398 </widget>
399 </item>
400 </layout>
401 </item>
402 <item>
403 <widget class="QLabel" name="eqPreampLabel">
404 <property name="text">
405 <string>Hz</string>
406 </property>
407 <property name="alignment">
408 <set>Qt::AlignCenter</set>
409 </property>
410 </widget>
411 </item>
412 </layout>
413 </widget>
414 </item>
415 <item row="0" column="13">
416 <spacer name="eqHorizontalSpacer1">
417 <property name="orientation">
418 <enum>Qt::Horizontal</enum>
419 </property>
420 <property name="sizeHint" stdset="0">
421 <size>
422 <width>40</width>
423 <height>20</height>
424 </size>
425 </property>
426 </spacer>
427 </item>
428 <item row="0" column="3">
429 <widget class="QGroupBox" name="eqBand0GroupBox">
430 <property name="sizePolicy">
431 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
432 <horstretch>0</horstretch>
433 <verstretch>0</verstretch>
434 </sizepolicy>
435 </property>
436 <property name="title">
437 <string notr="true"/>
438 </property>
439 <property name="flat">
440 <bool>true</bool>
441 </property>
442 <layout class="QVBoxLayout" name="verticalLayout_3">
443 <item>
444 <widget class="QLabel" name="eqBand0Value">
445 <property name="text">
446 <string>0</string>
447 </property>
448 <property name="alignment">
449 <set>Qt::AlignCenter</set>
450 </property>
451 </widget>
452 </item>
453 <item>
454 <layout class="QHBoxLayout" name="eqBand0HLayout">
455 <item>
456 <widget class="QSlider" name="eqBand0Slider">
457 <property name="minimum">
458 <number>-100</number>
459 </property>
460 <property name="maximum">
461 <number>100</number>
462 </property>
463 <property name="orientation">
464 <enum>Qt::Vertical</enum>
465 </property>
466 <property name="tickPosition">
467 <enum>QSlider::TicksAbove</enum>
468 </property>
469 <property name="tickInterval">
470 <number>20</number>
471 </property>
472 </widget>
473 </item>
474 </layout>
475 </item>
476 <item>
477 <widget class="QLabel" name="eqBand0Label">
478 <property name="text">
479 <string>Hz</string>
480 </property>
481 <property name="scaledContents">
482 <bool>false</bool>
483 </property>
484 <property name="alignment">
485 <set>Qt::AlignCenter</set>
486 </property>
487 <property name="wordWrap">
488 <bool>false</bool>
489 </property>
490 </widget>
491 </item>
492 </layout>
493 </widget>
494 </item>
495 <item row="0" column="4">
496 <widget class="QGroupBox" name="eqBand1GroupBox">
497 <property name="title">
498 <string notr="true"/>
499 </property>
500 <property name="flat">
501 <bool>true</bool>
502 </property>
503 <layout class="QVBoxLayout" name="verticalLayout_4">
504 <item>
505 <widget class="QLabel" name="eqBand1Value">
506 <property name="text">
507 <string>0</string>
508 </property>
509 <property name="alignment">
510 <set>Qt::AlignCenter</set>
511 </property>
512 </widget>
513 </item>
514 <item>
515 <layout class="QHBoxLayout" name="eqBand1HLayout">
516 <item>
517 <widget class="QSlider" name="eqBand1Slider">
518 <property name="minimum">
519 <number>-100</number>
520 </property>
521 <property name="maximum">
522 <number>100</number>
523 </property>
524 <property name="orientation">
525 <enum>Qt::Vertical</enum>
526 </property>
527 <property name="tickPosition">
528 <enum>QSlider::TicksAbove</enum>
529 </property>
530 <property name="tickInterval">
531 <number>20</number>
532 </property>
533 </widget>
534 </item>
535 </layout>
536 </item>
537 <item>
538 <widget class="QLabel" name="eqBand1Label">
539 <property name="text">
540 <string>Hz</string>
541 </property>
542 <property name="alignment">
543 <set>Qt::AlignCenter</set>
544 </property>
545 </widget>
546 </item>
547 </layout>
548 </widget>
549 </item>
550 <item row="0" column="5">
551 <widget class="QGroupBox" name="eqBand2GroupBox">
552 <property name="flat">
553 <bool>true</bool>
554 </property>
555 <layout class="QVBoxLayout" name="verticalLayout_5">
556 <item>
557 <widget class="QLabel" name="eqBand2Value">
558 <property name="text">
559 <string>0</string>
560 </property>
561 <property name="alignment">
562 <set>Qt::AlignCenter</set>
563 </property>
564 </widget>
565 </item>
566 <item>
567 <layout class="QHBoxLayout" name="eqBand2HLayout">
568 <item>
569 <widget class="QSlider" name="eqBand2Slider">
570 <property name="minimum">
571 <number>-100</number>
572 </property>
573 <property name="maximum">
574 <number>100</number>
575 </property>
576 <property name="orientation">
577 <enum>Qt::Vertical</enum>
578 </property>
579 <property name="tickPosition">
580 <enum>QSlider::TicksAbove</enum>
581 </property>
582 <property name="tickInterval">
583 <number>20</number>
584 </property>
585 </widget>
586 </item>
587 </layout>
588 </item>
589 <item>
590 <widget class="QLabel" name="eqBand2Label">
591 <property name="text">
592 <string>Hz</string>
593 </property>
594 <property name="alignment">
595 <set>Qt::AlignCenter</set>
596 </property>
597 </widget>
598 </item>
599 </layout>
600 </widget>
601 </item>
602 <item row="0" column="6">
603 <widget class="QGroupBox" name="eqBand3GroupBox">
604 <property name="title">
605 <string notr="true"/>
606 </property>
607 <property name="flat">
608 <bool>true</bool>
609 </property>
610 <layout class="QVBoxLayout" name="verticalLayout_6">
611 <item>
612 <widget class="QLabel" name="eqBand3Value">
613 <property name="text">
614 <string>0</string>
615 </property>
616 <property name="alignment">
617 <set>Qt::AlignCenter</set>
618 </property>
619 </widget>
620 </item>
621 <item>
622 <layout class="QHBoxLayout" name="eqBand3HLayout">
623 <item>
624 <widget class="QSlider" name="eqBand3Slider">
625 <property name="minimum">
626 <number>-100</number>
627 </property>
628 <property name="maximum">
629 <number>100</number>
630 </property>
631 <property name="orientation">
632 <enum>Qt::Vertical</enum>
633 </property>
634 <property name="tickPosition">
635 <enum>QSlider::TicksAbove</enum>
636 </property>
637 <property name="tickInterval">
638 <number>20</number>
639 </property>
640 </widget>
641 </item>
642 </layout>
643 </item>
644 <item>
645 <widget class="QLabel" name="eqBand3Label">
646 <property name="text">
647 <string>Hz</string>
648 </property>
649 <property name="alignment">
650 <set>Qt::AlignCenter</set>
651 </property>
652 </widget>
653 </item>
654 </layout>
655 </widget>
656 </item>
657 <item row="0" column="7">
658 <widget class="QGroupBox" name="eqBand4GroupBox">
659 <property name="flat">
660 <bool>true</bool>
661 </property>
662 <layout class="QVBoxLayout" name="verticalLayout_7">
663 <item>
664 <widget class="QLabel" name="eqBand4Value">
665 <property name="text">
666 <string>0</string>
667 </property>
668 <property name="alignment">
669 <set>Qt::AlignCenter</set>
670 </property>
671 </widget>
672 </item>
673 <item>
674 <layout class="QHBoxLayout" name="eqBand4HLayout">
675 <item>
676 <widget class="QSlider" name="eqBand4Slider">
677 <property name="minimum">
678 <number>-100</number>
679 </property>
680 <property name="maximum">
681 <number>100</number>
682 </property>
683 <property name="orientation">
684 <enum>Qt::Vertical</enum>
685 </property>
686 <property name="tickPosition">
687 <enum>QSlider::TicksAbove</enum>
688 </property>
689 <property name="tickInterval">
690 <number>20</number>
691 </property>
692 </widget>
693 </item>
694 </layout>
695 </item>
696 <item>
697 <widget class="QLabel" name="eqBand4Label">
698 <property name="text">
699 <string>Hz</string>
700 </property>
701 <property name="alignment">
702 <set>Qt::AlignCenter</set>
703 </property>
704 </widget>
705 </item>
706 </layout>
707 </widget>
708 </item>
709 <item row="0" column="8">
710 <widget class="QGroupBox" name="eqBand5GroupBox">
711 <property name="flat">
712 <bool>true</bool>
713 </property>
714 <layout class="QVBoxLayout" name="verticalLayout_10">
715 <item>
716 <widget class="QLabel" name="eqBand5Value">
717 <property name="text">
718 <string>0</string>
719 </property>
720 <property name="alignment">
721 <set>Qt::AlignCenter</set>
722 </property>
723 </widget>
724 </item>
725 <item>
726 <layout class="QHBoxLayout" name="eqBand5HLayout">
727 <item>
728 <widget class="QSlider" name="eqBand5Slider">
729 <property name="minimum">
730 <number>-100</number>
731 </property>
732 <property name="maximum">
733 <number>100</number>
734 </property>
735 <property name="orientation">
736 <enum>Qt::Vertical</enum>
737 </property>
738 <property name="tickPosition">
739 <enum>QSlider::TicksAbove</enum>
740 </property>
741 <property name="tickInterval">
742 <number>20</number>
743 </property>
744 </widget>
745 </item>
746 </layout>
747 </item>
748 <item>
749 <widget class="QLabel" name="eqBand5Label">
750 <property name="text">
751 <string>Hz</string>
752 </property>
753 <property name="alignment">
754 <set>Qt::AlignCenter</set>
755 </property>
756 </widget>
757 </item>
758 </layout>
759 </widget>
760 </item>
761 <item row="0" column="9">
762 <widget class="QGroupBox" name="eqBand6GroupBox">
763 <property name="sizePolicy">
764 <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
765 <horstretch>0</horstretch>
766 <verstretch>0</verstretch>
767 </sizepolicy>
768 </property>
769 <property name="title">
770 <string notr="true"/>
771 </property>
772 <property name="flat">
773 <bool>true</bool>
774 </property>
775 <layout class="QVBoxLayout" name="verticalLayout_11">
776 <item>
777 <widget class="QLabel" name="eqBand6Value">
778 <property name="text">
779 <string>0</string>
780 </property>
781 <property name="alignment">
782 <set>Qt::AlignCenter</set>
783 </property>
784 </widget>
785 </item>
786 <item>
787 <layout class="QHBoxLayout" name="eqBand6HLayout">
788 <item>
789 <widget class="QSlider" name="eqBand6Slider">
790 <property name="minimum">
791 <number>-100</number>
792 </property>
793 <property name="maximum">
794 <number>100</number>
795 </property>
796 <property name="orientation">
797 <enum>Qt::Vertical</enum>
798 </property>
799 <property name="tickPosition">
800 <enum>QSlider::TicksAbove</enum>
801 </property>
802 <property name="tickInterval">
803 <number>20</number>
804 </property>
805 </widget>
806 </item>
807 </layout>
808 </item>
809 <item>
810 <widget class="QLabel" name="eqBand6Label">
811 <property name="text">
812 <string>Hz</string>
813 </property>
814 <property name="alignment">
815 <set>Qt::AlignCenter</set>
816 </property>
817 </widget>
818 </item>
819 </layout>
820 </widget>
821 </item>
822 <item row="0" column="10">
823 <widget class="QGroupBox" name="eqBand7GroupBox">
824 <property name="title">
825 <string notr="true"/>
826 </property>
827 <property name="flat">
828 <bool>true</bool>
829 </property>
830 <layout class="QVBoxLayout" name="verticalLayout_8">
831 <item>
832 <widget class="QLabel" name="eqBand7Value">
833 <property name="text">
834 <string>0</string>
835 </property>
836 <property name="alignment">
837 <set>Qt::AlignCenter</set>
838 </property>
839 </widget>
840 </item>
841 <item>
842 <layout class="QHBoxLayout" name="eqBand7HLayout">
843 <item>
844 <widget class="QSlider" name="eqBand7Slider">
845 <property name="minimum">
846 <number>-100</number>
847 </property>
848 <property name="maximum">
849 <number>100</number>
850 </property>
851 <property name="orientation">
852 <enum>Qt::Vertical</enum>
853 </property>
854 <property name="tickPosition">
855 <enum>QSlider::TicksAbove</enum>
856 </property>
857 <property name="tickInterval">
858 <number>20</number>
859 </property>
860 </widget>
861 </item>
862 </layout>
863 </item>
864 <item>
865 <widget class="QLabel" name="eqBand7Label">
866 <property name="text">
867 <string>Hz</string>
868 </property>
869 <property name="alignment">
870 <set>Qt::AlignCenter</set>
871 </property>
872 </widget>
873 </item>
874 </layout>
875 </widget>
876 </item>
877 <item row="0" column="11">
878 <widget class="QGroupBox" name="eqBand8GroupBox">
879 <property name="title">
880 <string notr="true"/>
881 </property>
882 <property name="flat">
883 <bool>true</bool>
884 </property>
885 <layout class="QVBoxLayout" name="verticalLayout_9">
886 <item>
887 <widget class="QLabel" name="eqBand8Value">
888 <property name="text">
889 <string>0</string>
890 </property>
891 <property name="alignment">
892 <set>Qt::AlignCenter</set>
893 </property>
894 </widget>
895 </item>
896 <item>
897 <layout class="QHBoxLayout" name="eqBand8HLayout">
898 <item>
899 <widget class="QSlider" name="eqBand8Slider">
900 <property name="minimum">
901 <number>-100</number>
902 </property>
903 <property name="maximum">
904 <number>100</number>
905 </property>
906 <property name="orientation">
907 <enum>Qt::Vertical</enum>
908 </property>
909 <property name="tickPosition">
910 <enum>QSlider::TicksAbove</enum>
911 </property>
912 <property name="tickInterval">
913 <number>20</number>
914 </property>
915 </widget>
916 </item>
917 </layout>
918 </item>
919 <item>
920 <widget class="QLabel" name="eqBand8Label">
921 <property name="text">
922 <string>Hz</string>
923 </property>
924 <property name="alignment">
925 <set>Qt::AlignCenter</set>
926 </property>
927 </widget>
928 </item>
929 </layout>
930 </widget>
931 </item>
932 <item row="0" column="12">
933 <widget class="QGroupBox" name="eqBand9GroupBox">
934 <property name="title">
935 <string notr="true"/>
936 </property>
937 <property name="flat">
938 <bool>true</bool>
939 </property>
940 <layout class="QVBoxLayout" name="verticalLayout_12">
941 <item>
942 <widget class="QLabel" name="eqBand9Value">
943 <property name="text">
944 <string>0</string>
945 </property>
946 <property name="alignment">
947 <set>Qt::AlignCenter</set>
948 </property>
949 </widget>
950 </item>
951 <item>
952 <layout class="QHBoxLayout" name="eqBand9HLayout">
953 <item>
954 <widget class="QSlider" name="eqBand9Slider">
955 <property name="minimum">
956 <number>-100</number>
957 </property>
958 <property name="maximum">
959 <number>100</number>
960 </property>
961 <property name="orientation">
962 <enum>Qt::Vertical</enum>
963 </property>
964 <property name="tickPosition">
965 <enum>QSlider::TicksAbove</enum>
966 </property>
967 <property name="tickInterval">
968 <number>20</number>
969 </property>
970 </widget>
971 </item>
972 </layout>
973 </item>
974 <item>
975 <widget class="QLabel" name="eqBand9Label">
976 <property name="text">
977 <string>Hz</string>
978 </property>
979 <property name="alignment">
980 <set>Qt::AlignCenter</set>
981 </property>
982 </widget>
983 </item>
984 </layout>
985 </widget>
986 </item>
987 </layout>
988 </widget>
989 </item>
990 </layout>
991 </widget>
135992 </item>
136993 </layout>
137994 </widget>