diff --git a/modules/gui/qt4/Modules.am b/modules/gui/qt4/Modules.am index d1ada4703a..50d1f43bde 100644 --- a/modules/gui/qt4/Modules.am +++ b/modules/gui/qt4/Modules.am @@ -29,6 +29,7 @@ TOMOC = main_interface \ dialogs/errors \ dialogs/streaminfo \ dialogs/interaction \ + components/equalizer \ components/infopanels \ components/preferences_widgets \ components/preferences \ @@ -53,6 +54,7 @@ nodist_SOURCES_qt4 = \ dialogs/errors.moc.cpp \ dialogs/prefs_dialog.moc.cpp \ dialogs/interaction.moc.cpp \ + components/equalizer.moc.cpp \ components/infopanels.moc.cpp \ components/preferences_widgets.moc.cpp \ components/preferences.moc.cpp \ @@ -97,6 +99,7 @@ SOURCES_qt4 = qt4.cpp \ dialogs/messages.cpp \ dialogs/errors.cpp \ dialogs/interaction.cpp \ + components/equalizer.cpp \ components/infopanels.cpp \ components/preferences_widgets.cpp \ components/preferences.cpp \ @@ -123,6 +126,7 @@ EXTRA_DIST += \ dialogs/errors.hpp \ dialogs/prefs_dialog.hpp \ dialogs/interaction.hpp \ + components/equalizer.hpp \ components/infopanels.hpp \ components/preferences_widgets.hpp \ components/preferences.hpp \ diff --git a/modules/gui/qt4/components/equalizer.cpp b/modules/gui/qt4/components/equalizer.cpp new file mode 100644 index 0000000000..e071d98e9b --- /dev/null +++ b/modules/gui/qt4/components/equalizer.cpp @@ -0,0 +1,214 @@ +/***************************************************************************** + * equalizer.cpp : Equalizer + **************************************************************************** + * Copyright (C) 2006 the VideoLAN team + * $Id: preferences.cpp 16643 2006-09-13 12:45:46Z zorglub $ + * + * Authors: Clément Stenac + * + * 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#include +#include +#include +#include +#include + +#include "components/equalizer.hpp" +#include "qt4.hpp" + +#include "../../audio_filter/equalizer_presets.h" +#include +#include +#include +#include + +static const QString band_frequencies[] = +{ + " 60Hz", "170 Hz", "310 Hz", "600 Hz", " 1 kHz", + " 3 kHz", " 6 kHz", "12 kHz", "14 kHz", "16 kHz" +}; + +Equalizer::Equalizer( intf_thread_t *_p_intf, QWidget *_parent ) : + QWidget( _parent ) , p_intf( _p_intf ) +{ + ui.setupUi( this ); + + for( int i = 0 ; i < NB_PRESETS ; i ++ ) + { + ui.presetsCombo->addItem( qfu( preset_list_text[i] ), + QVariant( i ) ); + } + CONNECT( ui.presetsCombo, activated( int ), this, setPreset( int ) ); + + for( int i = 0 ; i < BANDS ; i++ ) + { + QGridLayout *grid = new QGridLayout( this ); + bands[i] = new QSlider( Qt::Horizontal, this ); + bands[i]->setMaximum( 400 ); + + band_texts[i] = new QLabel( band_frequencies[i] + "\n0.0dB" ); + + grid->addWidget( bands[i], 0, i ); + grid->addWidget( band_texts[i], 1, i ); + } +} + +Equalizer::~Equalizer() +{ +} + +void Equalizer::enable() +{ + bool en = ui.enableCheck->isChecked(); + aout_EnableFilter( VLC_OBJECT( p_intf ), "equalizer", + en ? VLC_TRUE : VLC_FALSE ); + + ui.eq2PassCheck->setEnabled( en ); + ui.preampSlider->setEnabled( en ); + for( int i = 0 ; i< BANDS; i++ ) + { + bands[i]->setEnabled( en ); band_texts[i]->setEnabled( en ); + } +} + +void Equalizer::set2Pass() +{ + aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf, + VLC_OBJECT_AOUT, FIND_ANYWHERE); + vlc_bool_t b_2p = ui.eq2PassCheck->isChecked(); + + if( p_aout == NULL ) + config_PutInt( p_intf, "equalizer-2pass", b_2p ); + else + { + var_SetBool( p_aout, "equalizer-2pass", b_2p ); + config_PutInt( p_intf, "equalizer-2pass", b_2p ); + for( int i = 0; i < p_aout->i_nb_inputs; i++ ) + { + p_aout->pp_inputs[i]->b_restart = VLC_TRUE; + } + vlc_object_release( p_aout ); + } +} + +void Equalizer::setPreamp() +{ + float f= (float)( 400 - ui.preampSlider->value() ) /10 - 20; + char psz_val[5]; + aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf, + VLC_OBJECT_AOUT, FIND_ANYWHERE); + + sprintf( psz_val, "%.1f", f ); + ui.preampLabel->setText( qtr("Preamp\n") + psz_val + qtr("dB") ); + if( p_aout ) + { + delCallbacks( p_aout ); + var_SetFloat( p_aout, "equalizer-preamp", f ); + addCallbacks( p_aout ); + vlc_object_release( p_aout ); + } + config_PutFloat( p_intf, "equalizer-preamp", f ); +} + +void Equalizer::setBand() +{ + char psz_values[102]; memset( psz_values, 0, 102 ); + + /**\todo smoothing */ + + for( int i = 0 ; i< BANDS ; i++ ) + { + char psz_val[5]; + float f_val = (float)( 400 - bands[i]->value() ) / 10 - 20 ; + sprintf( psz_values, "%s %f", psz_values, f_val ); + sprintf( psz_val, "%.1f", f_val ); + band_texts[i]->setText( band_frequencies[i] + "\n" + psz_val + "dB" ); + } + aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf, + VLC_OBJECT_AOUT, FIND_ANYWHERE); + if( p_aout ) + { + delCallbacks( p_aout ); + var_SetString( p_aout, "equalizer-bands", psz_values ); + addCallbacks( p_aout ); + vlc_object_release( p_aout ); + } +} +void Equalizer::setValues( char *psz_bands, float f_preamp ) +{ + char *p = psz_bands; + for( int i = 0; i < 10; i++ ) + { + char psz_val[5]; + + float f = strtof( p, &p ); + int i_val= (int)( ( f + 20 ) * 10 ); + bands[i]->setValue( 400 - i_val ); + + sprintf( psz_val, "%.1f", f ); + band_texts[i]->setText( band_frequencies[i] + "\n" + psz_val + "dB" ); + + if( p == NULL ) break; + p++; + if( *p == 0 ) break; + } + char psz_val[5]; + int i_val = (int)( ( f_preamp + 20 ) * 10 ); + sprintf( psz_val, "%.1f", f_preamp ); + ui.preampSlider->setValue( 400 - i_val ); + ui.preampLabel->setText( qtr("Preamp\n") + psz_val + qtr("dB") ); +} + +void Equalizer::setPreset( int preset ) +{ + aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf, + VLC_OBJECT_AOUT, FIND_ANYWHERE); + + char psz_values[102]; memset( psz_values, 0, 102 ); + for( int i = 0 ; i< 10 ;i++ ) + sprintf( psz_values, "%s %.1f", psz_values, + eqz_preset_10b[preset]->f_amp[i] ); + + if( p_aout ) + { + delCallbacks( p_aout ); + var_SetString( p_aout, "equalizer-bands", psz_values ); + var_SetFloat( p_aout, "equalizer-preamp", + eqz_preset_10b[preset]->f_preamp ); + addCallbacks( p_aout ); + vlc_object_release( p_aout ); + } + config_PutPsz( p_intf, "equalizer-bands", psz_values ); + config_PutFloat( p_intf, "equalizer-preamp", + eqz_preset_10b[preset]->f_preamp ); + + setValues( psz_values, eqz_preset_10b[preset]->f_preamp ); +} + +void Equalizer::delCallbacks( aout_instance_t *p_aout ) +{ +// var_DelCallback( p_aout, "equalizer-bands", EqzCallback, this ); +// var_DelCallback( p_aout, "equalizer-preamp", EqzCallback, this ); +} + +void Equalizer::addCallbacks( aout_instance_t *p_aout ) +{ +// var_AddCallback( p_aout, "equalizer-bands", EqzCallback, this ); +// var_AddCallback( p_aout, "equalizer-preamp", EqzCallback, this ); +} + + diff --git a/modules/gui/qt4/components/equalizer.hpp b/modules/gui/qt4/components/equalizer.hpp new file mode 100644 index 0000000000..7b940d5d61 --- /dev/null +++ b/modules/gui/qt4/components/equalizer.hpp @@ -0,0 +1,58 @@ +/***************************************************************************** + * preferences_tree.hpp : Tree of modules for preferences + **************************************************************************** + * Copyright (C) 2006 the VideoLAN team + * $Id: preferences.hpp 16643 2006-09-13 12:45:46Z zorglub $ + * + * Authors: Clément Stenac + * + * 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef _EQUALIZER_H_ +#define _EQUALIZER_H_ + +#include +#include +#include "ui/equalizer.h" + +#define BANDS 10 + +class Equalizer: public QWidget +{ + Q_OBJECT +public: + Equalizer( intf_thread_t *, QWidget * ); + virtual ~Equalizer(); + +private: + Ui::EqualizerWidget ui; + QSlider *bands[BANDS]; + QLabel *band_texts[BANDS]; + + void delCallbacks( aout_instance_t * ); + void addCallbacks( aout_instance_t * ); + void setValues( char *, float ); + + intf_thread_t *p_intf; +private slots: + void enable(); + void set2Pass(); + void setPreamp(); + void setBand(); + void setPreset(int); +}; + +#endif diff --git a/modules/gui/qt4/ui/equalizer.ui b/modules/gui/qt4/ui/equalizer.ui index 2011cf0a57..06827013c2 100644 --- a/modules/gui/qt4/ui/equalizer.ui +++ b/modules/gui/qt4/ui/equalizer.ui @@ -85,7 +85,7 @@ 6 - + Preamp