X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Fextended_panels.cpp;h=018a697f0bdd94018434d10c4cb127c06a1471c8;hb=19933fe7a674ee6d1253821a656507a6a712f8d0;hp=eb8a996338a737b0576d69b847e1897d80ebd880;hpb=e2e6f592915ef9d8c25bfba133ae0f9455a93f94;p=vlc diff --git a/modules/gui/qt4/components/extended_panels.cpp b/modules/gui/qt4/components/extended_panels.cpp index eb8a996338..018a697f0b 100644 --- a/modules/gui/qt4/components/extended_panels.cpp +++ b/modules/gui/qt4/components/extended_panels.cpp @@ -1,7 +1,7 @@ /***************************************************************************** * extended_panels.cpp : Extended controls panels **************************************************************************** - * Copyright ( C ) 2006-2007 the VideoLAN team + * Copyright (C) 2006-2007 the VideoLAN team * $Id$ * * Authors: Clément Stenac @@ -21,6 +21,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif #include #include @@ -28,20 +31,19 @@ #include #include #include +#include #include "components/extended_panels.hpp" #include "dialogs/preferences.hpp" #include "dialogs_provider.hpp" #include "qt4.hpp" +#include "input_manager.hpp" -#include "../../audio_filter/equalizer_presets.h" #include #include #include #include -#include -#include #if 0 class ConfClickHandler : public QObject @@ -88,10 +90,10 @@ QString OptionFromWidgetName( QObject *obj ) return option; } -ExtVideo::ExtVideo( intf_thread_t *_p_intf, QWidget *_parent ) : - QWidget( _parent ) , p_intf( _p_intf ) +ExtVideo::ExtVideo( intf_thread_t *_p_intf, QTabWidget *_parent ) : + p_intf( _p_intf ) { - ui.setupUi( this ); + ui.setupUi( _parent ); #define SETUP_VFILTER( widget ) \ { \ @@ -104,12 +106,12 @@ ExtVideo::ExtVideo( intf_thread_t *_p_intf, QWidget *_parent ) : if( p_obj ) \ { \ vlc_object_release( p_obj ); \ - if( checkbox ) checkbox->setCheckState( Qt::Checked ); \ + if( checkbox ) checkbox->setChecked( true ); \ else groupbox->setChecked( true ); \ } \ else \ { \ - if( checkbox ) checkbox->setCheckState( Qt::Unchecked ); \ + if( checkbox ) checkbox->setChecked( false ); \ else groupbox->setChecked( false ); \ } \ } \ @@ -180,6 +182,11 @@ ExtVideo::ExtVideo( intf_thread_t *_p_intf, QWidget *_parent ) : SETUP_VFILTER_OPTION( wallRowsSpin, valueChanged( int ) ) SETUP_VFILTER_OPTION( wallColsSpin, valueChanged( int ) ) + SETUP_VFILTER( panoramix ) + SETUP_VFILTER_OPTION( panoramixRowsSpin, valueChanged( int ) ) + SETUP_VFILTER_OPTION( panoramixColsSpin, valueChanged( int ) ) + + SETUP_VFILTER( erase ) SETUP_VFILTER_OPTION( eraseMaskText, editingFinished() ) SETUP_VFILTER_OPTION( eraseYSpin, valueChanged( int ) ) @@ -197,21 +204,42 @@ ExtVideo::ExtVideo( intf_thread_t *_p_intf, QWidget *_parent ) : #undef SETUP_VFILTER #undef SETUP_VFILTER_OPTION + + CONNECT( ui.cropTopPx, valueChanged( int ), this, cropChange() ); + CONNECT( ui.cropBotPx, valueChanged( int ), this, cropChange() ); + CONNECT( ui.cropLeftPx, valueChanged( int ), this, cropChange() ); + CONNECT( ui.cropRightPx, valueChanged( int ), this, cropChange() ); + CONNECT( ui.topBotCropSync, toggled( bool ), + ui.cropBotPx, setDisabled( bool ) ); + CONNECT( ui.leftRightCropSync, toggled( bool ), + ui.cropRightPx, setDisabled( bool ) ); } ExtVideo::~ExtVideo() { } -void ExtVideo::ChangeVFiltersString( char *psz_name, vlc_bool_t b_add ) +void ExtVideo::cropChange() +{ + p_vout = ( vout_thread_t * )vlc_object_find( p_intf, + VLC_OBJECT_VOUT, FIND_CHILD ); + if( p_vout ) + { + var_SetInteger( p_vout, "crop-top", ui.cropTopPx->value() ); + var_SetInteger( p_vout, "crop-bottom", ui.cropBotPx->value() ); + var_SetInteger( p_vout, "crop-left", ui.cropLeftPx->value() ); + var_SetInteger( p_vout, "crop-right", ui.cropRightPx->value() ); + } +} + +void ExtVideo::ChangeVFiltersString( char *psz_name, bool b_add ) { - vout_thread_t *p_vout; char *psz_parser, *psz_string; const char *psz_filter_type; /* Please leave p_libvlc_global. This is where cached modules are * stored. We're not trying to find a module instance. */ - module_t *p_obj = module_FindName( p_intf, psz_name ); + module_t *p_obj = module_Find( p_intf, psz_name ); if( !p_obj ) { msg_Err( p_intf, "Unable to find filter module \"%s\n.", psz_name ); @@ -232,11 +260,11 @@ void ExtVideo::ChangeVFiltersString( char *psz_name, vlc_bool_t b_add ) } else { - vlc_object_release( p_obj ); + module_Put( p_obj ); msg_Err( p_intf, "Unknown video filter type." ); return; } - vlc_object_release( p_obj ); + module_Put( p_obj ); psz_string = config_GetPsz( p_intf, psz_filter_type ); @@ -249,8 +277,12 @@ void ExtVideo::ChangeVFiltersString( char *psz_name, vlc_bool_t b_add ) if( !psz_parser ) { psz_parser = psz_string; - asprintf( &psz_string, ( *psz_string ) ? "%s:%s" : "%s%s", - psz_string, psz_name ); + if( asprintf( &psz_string, ( *psz_string ) ? "%s:%s" : "%s%s", + psz_string, psz_name ) == -1 ) + { + free( psz_parser ); + return; + } free( psz_parser ); } else @@ -328,7 +360,7 @@ void ExtVideo::initComboBoxItems( QObject *widget ) if( !combobox ) return; QString option = OptionFromWidgetName( widget ); module_config_t *p_item = config_FindConfig( VLC_OBJECT( p_intf ), - option.toStdString().c_str() ); + qtu( option ) ); if( p_item ) { int i_type = p_item->i_type & CONFIG_ITEM; @@ -346,7 +378,7 @@ void ExtVideo::initComboBoxItems( QObject *widget ) else { msg_Err( p_intf, "Couldn't find option \"%s\".", - option.toStdString().c_str() ); + qtu( option ) ); } } @@ -359,7 +391,7 @@ void ExtVideo::setWidgetValue( QObject *widget ) vlc_object_t *p_obj = ( vlc_object_t * ) vlc_object_find_name( p_intf->p_libvlc, - module.toStdString().c_str(), + qtu( module ), FIND_CHILD ); int i_type; vlc_value_t val; @@ -369,27 +401,27 @@ void ExtVideo::setWidgetValue( QObject *widget ) #if 0 msg_Dbg( p_intf, "Module instance %s not found, looking in config values.", - module.toStdString().c_str() ); + qtu( module ) ); #endif - i_type = config_GetType( p_intf, option.toStdString().c_str() ) & 0xf0; + i_type = config_GetType( p_intf, qtu( option ) ) & 0xf0; switch( i_type ) { case VLC_VAR_INTEGER: case VLC_VAR_BOOL: - val.i_int = config_GetInt( p_intf, option.toStdString().c_str() ); + val.i_int = config_GetInt( p_intf, qtu( option ) ); break; case VLC_VAR_FLOAT: - val.f_float = config_GetFloat( p_intf, option.toStdString().c_str() ); + val.f_float = config_GetFloat( p_intf, qtu( option ) ); break; case VLC_VAR_STRING: - val.psz_string = config_GetPsz( p_intf, option.toStdString().c_str() ); + val.psz_string = config_GetPsz( p_intf, qtu( option ) ); break; } } else { - i_type = var_Type( p_obj, option.toStdString().c_str() ) & 0xf0; - var_Get( p_obj, option.toStdString().c_str(), &val ); + i_type = var_Type( p_obj, qtu( option ) ) & 0xf0; + var_Get( p_obj, qtu( option ), &val ); vlc_object_release( p_obj ); } @@ -414,10 +446,10 @@ void ExtVideo::setWidgetValue( QObject *widget ) else if( lineedit ) { char str[30]; - sprintf( str, "%06X", val.i_int ); + snprintf( str, sizeof(str), "%06X", val.i_int ); lineedit->setText( str ); } - else if( combobox ) combobox->setCurrentIndex( + else if( combobox ) combobox->setCurrentIndex( combobox->findData( val.i_int ) ); else msg_Warn( p_intf, "Oops %s %s %d", __FILE__, __func__, __LINE__ ); } @@ -431,7 +463,7 @@ void ExtVideo::setWidgetValue( QObject *widget ) else if( i_type == VLC_VAR_STRING ) { if( lineedit ) lineedit->setText( qfu( val.psz_string ) ); - else if( combobox ) combobox->setCurrentIndex( + else if( combobox ) combobox->setCurrentIndex( combobox->findData( qfu( val.psz_string ) ) ); else msg_Warn( p_intf, "Oops %s %s %d", __FILE__, __func__, __LINE__ ); free( val.psz_string ); @@ -439,8 +471,8 @@ void ExtVideo::setWidgetValue( QObject *widget ) else msg_Err( p_intf, "Module %s's %s variable is of an unsupported type ( %d )", - module.toStdString().c_str(), - option.toStdString().c_str(), + qtu( module ), + qtu( option ), i_type ); } @@ -453,21 +485,21 @@ void ExtVideo::updateFilterOptions() vlc_object_t *p_obj = ( vlc_object_t * ) vlc_object_find_name( p_intf->p_libvlc, - module.toStdString().c_str(), + qtu( module ), FIND_CHILD ); if( !p_obj ) { - msg_Err( p_intf, "Module %s not found.", module.toStdString().c_str() ); + msg_Err( p_intf, "Module %s not found.", qtu( module ) ); return; } - int i_type = var_Type( p_obj, option.toStdString().c_str() ); + int i_type = var_Type( p_obj, qtu( option ) ); bool b_is_command = ( i_type & VLC_VAR_ISCOMMAND ); if( !b_is_command ) { msg_Warn( p_intf, "Module %s's %s variable isn't a command. You'll need to restart the filter to take change into account.", - module.toStdString().c_str(), - option.toStdString().c_str() ); + qtu( module ), + qtu( option ) ); /* FIXME: restart automatically somewhere near the end of this function */ } @@ -492,13 +524,13 @@ void ExtVideo::updateFilterOptions() else if( lineedit ) i_int = lineedit->text().toInt( NULL,16 ); else if( combobox ) i_int = combobox->itemData( combobox->currentIndex() ).toInt(); else msg_Warn( p_intf, "Oops %s %s %d", __FILE__, __func__, __LINE__ ); - config_PutInt( p_intf, option.toStdString().c_str(), i_int ); + config_PutInt( p_intf, qtu( option ), i_int ); if( b_is_command ) { if( i_type == VLC_VAR_INTEGER ) - var_SetInteger( p_obj, option.toStdString().c_str(), i_int ); + var_SetInteger( p_obj, qtu( option ), i_int ); else - var_SetBool( p_obj, option.toStdString().c_str(), i_int ); + var_SetBool( p_obj, qtu( option ), i_int ); } } else if( i_type == VLC_VAR_FLOAT ) @@ -509,27 +541,27 @@ void ExtVideo::updateFilterOptions() else if( doublespinbox ) f_float = doublespinbox->value(); else if( lineedit ) f_float = lineedit->text().toDouble(); else msg_Warn( p_intf, "Oops %s %s %d", __FILE__, __func__, __LINE__ ); - config_PutFloat( p_intf, option.toStdString().c_str(), f_float ); + config_PutFloat( p_intf, qtu( option ), f_float ); if( b_is_command ) - var_SetFloat( p_obj, option.toStdString().c_str(), f_float ); + var_SetFloat( p_obj, qtu( option ), f_float ); } else if( i_type == VLC_VAR_STRING ) { char *psz_string = NULL; if( lineedit ) psz_string = strdup( qtu( lineedit->text() ) ); - else if( combobox ) psz_string = strdup( qtu( combobox->itemData( - combobox->currentIndex() ).toString() ) ); + else if( combobox ) psz_string = strdup( qtu( combobox->itemData( + combobox->currentIndex() ).toString() ) ); else msg_Warn( p_intf, "Oops %s %s %d", __FILE__, __func__, __LINE__ ); - config_PutPsz( p_intf, option.toStdString().c_str(), psz_string ); + config_PutPsz( p_intf, qtu( option ), psz_string ); if( b_is_command ) - var_SetString( p_obj, option.toStdString().c_str(), psz_string ); + var_SetString( p_obj, qtu( option ), psz_string ); free( psz_string ); } else msg_Err( p_intf, "Module %s's %s variable is of an unsupported type ( %d )", - module.toStdString().c_str(), - option.toStdString().c_str(), + qtu( module ), + qtu( option ), i_type ); vlc_object_release( p_obj ); @@ -556,6 +588,209 @@ void ExtVideo::gotoConf( QObject* src ) } #endif +/********************************************************************** + * v4l2 controls + **********************************************************************/ + +ExtV4l2::ExtV4l2( intf_thread_t *_p_intf, QWidget *_parent ) + : QWidget( _parent ), p_intf( _p_intf ) +{ + ui.setupUi( this ); + + BUTTONACT( ui.refresh, Refresh() ); + + box = NULL; +} + +ExtV4l2::~ExtV4l2() +{ + if( box ) + delete box; +} + +void ExtV4l2::showEvent( QShowEvent *event ) +{ + QWidget::showEvent( event ); + Refresh(); +} + +void ExtV4l2::Refresh( void ) +{ + vlc_object_t *p_obj = (vlc_object_t*)vlc_object_find_name( p_intf, "v4l2", FIND_ANYWHERE ); + ui.help->hide(); + if( box ) + { + ui.vboxLayout->removeWidget( box ); + delete box; + box = NULL; + } + if( p_obj ) + { + vlc_value_t val, text, name; + int i_ret = var_Change( p_obj, "controls", VLC_VAR_GETCHOICES, + &val, &text ); + if( i_ret < 0 ) + { + msg_Err( p_intf, "Oops, v4l2 object doesn't have a 'controls' variable." ); + ui.help->show(); + vlc_object_release( p_obj ); + return; + } + + box = new QGroupBox( this ); + ui.vboxLayout->addWidget( box ); + QVBoxLayout *layout = new QVBoxLayout( box ); + box->setLayout( layout ); + + for( int i = 0; i < val.p_list->i_count; i++ ) + { + const char *psz_var = text.p_list->p_values[i].psz_string; + var_Change( p_obj, psz_var, VLC_VAR_GETTEXT, &name, NULL ); + const char *psz_label = name.psz_string; + msg_Dbg( p_intf, "v4l2 control \"%x\": %s (%s)", + val.p_list->p_values[i].i_int, psz_var, name.psz_string ); + + int i_type = var_Type( p_obj, psz_var ); + switch( i_type & VLC_VAR_TYPE ) + { + case VLC_VAR_INTEGER: + { + QLabel *label = new QLabel( psz_label, box ); + QHBoxLayout *hlayout = new QHBoxLayout(); + hlayout->addWidget( label ); + int i_val = var_GetInteger( p_obj, psz_var ); + if( i_type & VLC_VAR_HASCHOICE ) + { + QComboBox *combobox = new QComboBox( box ); + combobox->setObjectName( psz_var ); + + vlc_value_t val2, text2; + var_Change( p_obj, psz_var, VLC_VAR_GETCHOICES, + &val2, &text2 ); + for( int j = 0; j < val2.p_list->i_count; j++ ) + { + combobox->addItem( + text2.p_list->p_values[j].psz_string, + val2.p_list->p_values[j].i_int ); + if( i_val == val2.p_list->p_values[j].i_int ) + combobox->setCurrentIndex( j ); + } + var_Change( p_obj, psz_var, VLC_VAR_FREELIST, + &val2, &text2 ); + + CONNECT( combobox, currentIndexChanged( int ), this, + ValueChange( int ) ); + hlayout->addWidget( combobox ); + } + else + { + QSlider *slider = new QSlider( box ); + slider->setObjectName( psz_var ); + slider->setOrientation( Qt::Horizontal ); + vlc_value_t val2; + var_Change( p_obj, psz_var, VLC_VAR_GETMIN, + &val2, NULL ); + slider->setMinimum( val2.i_int ); + var_Change( p_obj, psz_var, VLC_VAR_GETMAX, + &val2, NULL ); + slider->setMaximum( val2.i_int ); + var_Change( p_obj, psz_var, VLC_VAR_GETSTEP, + &val2, NULL ); + slider->setSingleStep( val2.i_int ); + slider->setValue( i_val ); + + CONNECT( slider, valueChanged( int ), this, + ValueChange( int ) ); + hlayout->addWidget( slider ); + } + layout->addLayout( hlayout ); + break; + } + case VLC_VAR_BOOL: + { + QCheckBox *button = new QCheckBox( psz_label, box ); + button->setObjectName( psz_var ); + button->setChecked( var_GetBool( p_obj, psz_var ) ); + + CONNECT( button, clicked( bool ), this, + ValueChange( bool ) ); + layout->addWidget( button ); + break; + } + case VLC_VAR_VOID: + { + if( i_type & VLC_VAR_ISCOMMAND ) + { + QPushButton *button = new QPushButton( psz_label, box ); + button->setObjectName( psz_var ); + + CONNECT( button, clicked( bool ), this, + ValueChange( bool ) ); + layout->addWidget( button ); + } + else + { + QLabel *label = new QLabel( psz_label, box ); + layout->addWidget( label ); + } + break; + } + default: + msg_Warn( p_intf, "Unhandled var type for %s", psz_var ); + break; + } + free( name.psz_string ); + } + var_Change( p_obj, "controls", VLC_VAR_FREELIST, &val, &text ); + vlc_object_release( p_obj ); + } + else + { + msg_Dbg( p_intf, "Couldn't find v4l2 instance" ); + ui.help->show(); + } +} + +void ExtV4l2::ValueChange( bool value ) +{ + ValueChange( (int)value ); +} + +void ExtV4l2::ValueChange( int value ) +{ + QObject *s = sender(); + vlc_object_t *p_obj = (vlc_object_t*)vlc_object_find_name( p_intf, "v4l2", FIND_ANYWHERE ); + if( p_obj ) + { + char *psz_var = strdup( qtu( s->objectName() ) ); + int i_type = var_Type( p_obj, psz_var ); + switch( i_type & VLC_VAR_TYPE ) + { + case VLC_VAR_INTEGER: + if( i_type & VLC_VAR_HASCHOICE ) + { + QComboBox *combobox = qobject_cast( s ); + value = combobox->itemData( value ).toInt(); + } + var_SetInteger( p_obj, psz_var, value ); + break; + case VLC_VAR_BOOL: + var_SetBool( p_obj, psz_var, value ); + break; + case VLC_VAR_VOID: + var_SetVoid( p_obj, psz_var ); + break; + } + free( psz_var ); + vlc_object_release( p_obj ); + } + else + { + msg_Warn( p_intf, "Oops, v4l2 object isn't available anymore" ); + Refresh(); + } +} + /********************************************************************** * Equalizer **********************************************************************/ @@ -573,22 +808,15 @@ Equalizer::Equalizer( intf_thread_t *_p_intf, QWidget *_parent ) : smallFont.setPointSize( smallFont.pointSize() - 3 ); ui.setupUi( this ); - presetsComboBox = ui.presetsCombo; - ui.preampLabel->setFont( smallFont ); - ui.preampSlider->setMaximum( 400 ); - for( int i = 0 ; i < NB_PRESETS ; i ++ ) - { - ui.presetsCombo->addItem( qtr( preset_list_text[i] ), - QVariant( i ) ); - } - CONNECT( ui.presetsCombo, activated( int ), this, setPreset( int ) ); - - BUTTONACT( ui.enableCheck, enable() ); - BUTTONACT( ui.eq2PassCheck, set2Pass() ); - CONNECT( ui.preampSlider, valueChanged( int ), this, setPreamp() ); + /* Setup of presetsComboBox */ + presetsComboBox = ui.presetsCombo; + CONNECT( presetsComboBox, currentIndexChanged( int ), + this, updateUISliderValues( int ) ); + CONNECT( presetsComboBox, activated( int ), this, setCorePreset( int ) ); + /* Add the sliders for the Bands */ QGridLayout *grid = new QGridLayout( ui.frame ); grid->setMargin( 0 ); for( int i = 0 ; i < BANDS ; i++ ) @@ -596,26 +824,53 @@ Equalizer::Equalizer( intf_thread_t *_p_intf, QWidget *_parent ) : bands[i] = new QSlider( Qt::Vertical ); bands[i]->setMaximum( 400 ); bands[i]->setValue( 200 ); - CONNECT( bands[i], valueChanged( int ), this, setBand() ); + CONNECT( bands[i], valueChanged( int ), this, setCoreBands() ); + band_texts[i] = new QLabel( band_frequencies[i] + "\n0.0dB" ); band_texts[i]->setFont( smallFont ); + grid->addWidget( bands[i], 0, i ); grid->addWidget( band_texts[i], 1, i ); } - /* Write down initial values */ + /* Add the listed presets */ + for( int i = 0 ; i < NB_PRESETS ; i ++ ) + { + presetsComboBox->addItem( qtr( preset_list_text[i] ), + QVariant( preset_list[i] ) ); + } + + /* Connects */ + BUTTONACT( ui.enableCheck, enable() ); + BUTTONACT( ui.eq2PassCheck, set2Pass() ); + CONNECT( ui.preampSlider, valueChanged( int ), this, setPreamp() ); + + /* Do the update from the value of the core */ + updateUIFromCore(); +} + +Equalizer::~Equalizer() +{ +} + +/* Write down initial values */ +void Equalizer::updateUIFromCore() +{ + char *psz_af;//, *psz_bands; Don't use it ? + float f_preamp; + int i_preset; + aout_instance_t *p_aout = ( aout_instance_t * )vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE ); - char *psz_af; - char *psz_bands; - float f_preamp; if( p_aout ) { psz_af = var_GetNonEmptyString( p_aout, "audio-filter" ); if( var_GetBool( p_aout, "equalizer-2pass" ) ) ui.eq2PassCheck->setChecked( true ); - psz_bands = var_GetNonEmptyString( p_aout, "equalizer-bands" ); +// psz_bands = var_GetNonEmptyString( p_aout, "equalizer-bands" ); f_preamp = var_GetFloat( p_aout, "equalizer-preamp" ); + i_preset = presetsComboBox->findData( QVariant( + var_GetString( p_aout, "equalizer-preset" ) ) ); vlc_object_release( p_aout ); } else @@ -623,36 +878,42 @@ Equalizer::Equalizer( intf_thread_t *_p_intf, QWidget *_parent ) : psz_af = config_GetPsz( p_intf, "audio-filter" ); if( config_GetInt( p_intf, "equalizer-2pass" ) ) ui.eq2PassCheck->setChecked( true ); - psz_bands = config_GetPsz( p_intf, "equalizer-bands" ); +// psz_bands = config_GetPsz( p_intf, "equalizer-bands" ); f_preamp = config_GetFloat( p_intf, "equalizer-preamp" ); + i_preset = presetsComboBox->findData( QVariant( + config_GetPsz( p_intf, "equalizer-preset" ) ) ); } if( psz_af && strstr( psz_af, "equalizer" ) != NULL ) ui.enableCheck->setChecked( true ); - free( psz_af ); enable( ui.enableCheck->isChecked() ); - setValues( psz_bands, f_preamp ); -} + presetsComboBox->setCurrentIndex( i_preset ); -Equalizer::~Equalizer() -{ + free( psz_af ); } +/* Functin called when enableButton is toggled */ void Equalizer::enable() { bool en = ui.enableCheck->isChecked(); aout_EnableFilter( VLC_OBJECT( p_intf ), "equalizer", - en ? VLC_TRUE : VLC_FALSE ); + en ? true : false ); // aout_EnableFilter( VLC_OBJECT( p_intf ), "upmixer", -// en ? VLC_TRUE : VLC_FALSE ); +// en ? true : false ); // aout_EnableFilter( VLC_OBJECT( p_intf ), "vsurround", -// en ? VLC_TRUE : VLC_FALSE ); - enable( en ); +// en ? true : false ); + enable( en ); + + if( presetsComboBox->currentIndex() < 0 ) + presetsComboBox->setCurrentIndex( 0 ); + } void Equalizer::enable( bool en ) { ui.eq2PassCheck->setEnabled( en ); + presetsComboBox->setEnabled( en ); + ui.presetLabel->setEnabled( en ); ui.preampLabel->setEnabled( en ); ui.preampSlider->setEnabled( en ); for( int i = 0 ; i< BANDS; i++ ) @@ -661,11 +922,12 @@ void Equalizer::enable( bool en ) } } +/* Function called when the set2Pass button is activated */ 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(); + bool b_2p = ui.eq2PassCheck->isChecked(); if( p_aout == NULL ) config_PutInt( p_intf, "equalizer-2pass", b_2p ); @@ -675,105 +937,126 @@ void Equalizer::set2Pass() 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; + p_aout->pp_inputs[i]->b_restart = true; } vlc_object_release( p_aout ); } } +/* Function called when the preamp slider is moved */ void Equalizer::setPreamp() { - float f= ( float )( ui.preampSlider->value() ) /10 - 20; - char psz_val[5]; + const float f = ( float )( ui.preampSlider->value() ) /10 - 20; 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" ) ); + ui.preampLabel->setText( qtr( "Preamp\n" ) + QString::number( f, 'f', 1 ) + + qtr( "dB" ) ); if( p_aout ) { - delCallbacks( p_aout ); + //delCallbacks( p_aout ); var_SetFloat( p_aout, "equalizer-preamp", f ); - addCallbacks( p_aout ); + //addCallbacks( p_aout ); vlc_object_release( p_aout ); } config_PutFloat( p_intf, "equalizer-preamp", f ); } -void Equalizer::setBand() +void Equalizer::setCoreBands() { - char psz_values[102]; memset( psz_values, 0, 102 ); - /**\todo smoothing */ - for( int i = 0 ; i< BANDS ; i++ ) + QString values; + for( int i = 0; i < BANDS; i++ ) { - char psz_val[5]; - float f_val = ( float )( bands[i]->value() ) / 10 - 20 ; - sprintf( psz_values, "%s %f", psz_values, f_val ); - sprintf( psz_val, "% 5.1f", f_val ); - band_texts[i]->setText( band_frequencies[i] + "\n" + psz_val + "dB" ); + const float f_val = (float)( bands[i]->value() ) / 10 - 20; + QString val = QString("%1").arg( f_val, 5, 'f', 1 ); + + band_texts[i]->setText( band_frequencies[i] + "\n" + val + "dB" ); + values += " " + val; } + const char *psz_values = values.toAscii().constData(); + aout_instance_t *p_aout= ( aout_instance_t * )vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE ); if( p_aout ) { - delCallbacks( p_aout ); + //delCallbacks( p_aout ); var_SetString( p_aout, "equalizer-bands", psz_values ); - addCallbacks( p_aout ); + //addCallbacks( p_aout ); vlc_object_release( p_aout ); } } -void Equalizer::setValues( char *psz_bands, float f_preamp ) + +void Equalizer::updateUISliderValues( int i_preset ) { - char *p = psz_bands; + if( i_preset < 0 ) return; + + char *p = createValuesFromPreset( i_preset ); + char *psz = p; + float f_preamp = eqz_preset_10b[i_preset]->f_preamp; + if ( p ) { - for( int i = 0; i < 10; i++ ) + for( int i = 0; i < BANDS; i++ ) { - char psz_val[5]; - float f = strtof( p, &p ); - int i_val= ( int )( ( f + 20 ) * 10 ); - bands[i]->setValue( i_val ); - sprintf( psz_val, "% 5.1f", f ); - band_texts[i]->setText( band_frequencies[i] + "\n" + psz_val + - "dB" ); - if( p == NULL || *p == '\0' ) break; + const float f = us_strtod(p, &p ); + + bands[i]->setValue( (int)( ( f + 20 ) * 10 ) ); + + band_texts[i]->setText( band_frequencies[i] + "\n" + + QString("%1").arg( f, 5, 'f', 1 ) + "dB" ); + if( p == NULL || *p == '\0' ) + break; p++; - if( *p == '\0' ) break; + if( *p == '\0' ) + break; } + free( psz ); } - char psz_val[5]; - int i_val = ( int )( ( f_preamp + 20 ) * 10 ); - sprintf( psz_val, "%.1f", f_preamp ); - ui.preampSlider->setValue( i_val ); - ui.preampLabel->setText( qtr( "Preamp\n" ) + psz_val + qtr( "dB" ) ); + ui.preampSlider->setValue( (int)( ( f_preamp + 20 ) * 10 ) ); + ui.preampLabel->setText( qtr( "Preamp\n" ) + + QString::number( f_preamp, 'f', 1 ) + qtr( "dB" ) ); } -void Equalizer::setPreset( int preset ) +char * Equalizer::createValuesFromPreset( int i_preset ) { - aout_instance_t *p_aout= ( aout_instance_t * )vlc_object_find( p_intf, - VLC_OBJECT_AOUT, FIND_ANYWHERE ); + char *psz_values; + QString values; + + /* Create the QString in Qt */ + for( int i = 0 ; i< BANDS ;i++ ) + values += QString( " %1" ).arg( eqz_preset_10b[i_preset]->f_amp[i] ); - 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] ); + /* Convert it to char * */ + if( !asprintf( &psz_values, "%s", values.toAscii().constData() ) ) + return NULL; + return psz_values; +} + +void Equalizer::setCorePreset( int i_preset ) +{ + char *psz_values = createValuesFromPreset( i_preset ); + if( !psz_values ) return ; + + 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-preset" , preset_list[i_preset] ); + var_SetString( p_aout, "equalizer-bands", psz_values ); var_SetFloat( p_aout, "equalizer-preamp", - eqz_preset_10b[preset]->f_preamp ); + eqz_preset_10b[i_preset]->f_preamp ); addCallbacks( p_aout ); vlc_object_release( p_aout ); } config_PutPsz( p_intf, "equalizer-bands", psz_values ); + config_PutPsz( p_intf, "equalizer-preset", preset_list[i_preset] ); config_PutFloat( p_intf, "equalizer-preamp", - eqz_preset_10b[preset]->f_preamp ); - - setValues( psz_values, eqz_preset_10b[preset]->f_preamp ); + eqz_preset_10b[i_preset]->f_preamp ); } static int PresetCallback( vlc_object_t *p_this, char const *psz_cmd, @@ -781,7 +1064,8 @@ static int PresetCallback( vlc_object_t *p_this, char const *psz_cmd, { char *psz_preset = newval.psz_string; Equalizer *eq = ( Equalizer * )p_data; - eq->presetsComboBox->setCurrentIndex( eq->presetsComboBox->findText( qfu( psz_preset ) ) ); + int i_preset = eq->presetsComboBox->findData( QVariant( psz_preset ) ); + eq->presetsComboBox->setCurrentIndex( i_preset ); return VLC_SUCCESS; } @@ -820,7 +1104,7 @@ Spatializer::Spatializer( intf_thread_t *_p_intf, QWidget *_parent ) : QGridLayout *layout = new QGridLayout( this ); layout->setMargin( 0 ); - enableCheck = new QCheckBox( qfu( "Enable spatializer" ) ); + enableCheck = new QCheckBox( qtr( "Enable spatializer" ) ); layout->addWidget( enableCheck, 0, 0, 1, NUM_SP_CTRL ); for( int i = 0 ; i < NUM_SP_CTRL ; i++ ) @@ -866,7 +1150,7 @@ Spatializer::Spatializer( intf_thread_t *_p_intf, QWidget *_parent ) : } else { - psz_af = config_GetPsz( p_aout, "audio-filter" ); + psz_af = config_GetPsz( p_intf, "audio-filter" ); for( int i = 0; i < NUM_SP_CTRL ; i++ ) { controlVars[i] = config_GetFloat( p_intf, psz_control_names[i] ); @@ -887,7 +1171,7 @@ void Spatializer::enable() { bool en = enableCheck->isChecked(); aout_EnableFilter( VLC_OBJECT( p_intf ), "spatializer", - en ? VLC_TRUE : VLC_FALSE ); + en ? true : false ); enable( en ); } @@ -907,16 +1191,13 @@ void Spatializer::setInitValues() void Spatializer::setValues( float *controlVars ) { - char psz_val[5]; - char var_name[5]; aout_instance_t *p_aout= ( aout_instance_t * ) vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE ); for( int i = 0 ; i < NUM_SP_CTRL ; i++ ) { - float f= ( float )( spatCtrl[i]->value() ); - sprintf( psz_val, "%.1f", f ); - ctrl_readout[i]->setText( psz_val ); + float f = (float)( spatCtrl[i]->value() ); + ctrl_readout[i]->setText( QString::number( f, 'f', 1 ) ); } if( p_aout ) { @@ -947,6 +1228,179 @@ void Spatializer::addCallbacks( aout_instance_t *p_aout ) // var_AddCallback( p_aout, "Spatializer-preamp", EqzCallback, this ); } +#include +#include + +SyncControls::SyncControls( intf_thread_t *_p_intf, QWidget *_parent ) : + QWidget( _parent ) , p_intf( _p_intf ) +{ + QGroupBox *AVBox, *subsBox; + + QToolButton *moinsAV, *plusAV; + QToolButton *moinssubs, *plussubs; + QToolButton *moinssubSpeed, *plussubSpeed; + + QToolButton *updateButton; + + QGridLayout *mainLayout = new QGridLayout( this ); + + /* AV sync */ + AVBox = new QGroupBox( qtr( "Audio/Video" ) ); + QGridLayout *AVLayout = new QGridLayout( AVBox ); + + moinsAV = new QToolButton; + moinsAV->setToolButtonStyle( Qt::ToolButtonTextOnly ); + moinsAV->setAutoRaise( true ); + moinsAV->setText( "-" ); + AVLayout->addWidget( moinsAV, 0, 1, 1, 1 ); + + plusAV = new QToolButton; + plusAV->setToolButtonStyle( Qt::ToolButtonTextOnly ); + plusAV->setAutoRaise( true ); + plusAV->setText( "+" ); + AVLayout->addWidget( plusAV, 0, 3, 1, 1 ); + + QLabel *AVLabel = new QLabel; + AVLabel->setText( qtr( "Advance of audio over video:" ) ); + AVLayout->addWidget( AVLabel, 0, 0, 1, 1 ); + + AVSpin = new QDoubleSpinBox; + AVSpin->setAlignment( Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter ); + AVSpin->setDecimals( 3 ); + AVSpin->setMinimum( -100 ); + AVSpin->setMaximum( 100 ); + AVSpin->setSingleStep( 0.1 ); + AVSpin->setToolTip( qtr( "A positive value means that\n" + "the audio is ahead of the video" ) ); + AVSpin->setSuffix( "s" ); + AVLayout->addWidget( AVSpin, 0, 2, 1, 1 ); + mainLayout->addWidget( AVBox, 1, 0, 1, 5 ); + + + /* Subs */ + subsBox = new QGroupBox( qtr( "Subtitles/Video" ) ); + QGridLayout *subsLayout = new QGridLayout( subsBox ); + + moinssubs = new QToolButton; + moinssubs->setToolButtonStyle( Qt::ToolButtonTextOnly ); + moinssubs->setAutoRaise( true ); + moinssubs->setText( "-" ); + subsLayout->addWidget( moinssubs, 0, 1, 1, 1 ); + + plussubs = new QToolButton; + plussubs->setToolButtonStyle( Qt::ToolButtonTextOnly ); + plussubs->setAutoRaise( true ); + plussubs->setText( "+" ); + subsLayout->addWidget( plussubs, 0, 3, 1, 1 ); + + QLabel *subsLabel = new QLabel; + subsLabel->setText( qtr( "Advance of subtitles over video:" ) ); + subsLayout->addWidget( subsLabel, 0, 0, 1, 1 ); + + subsSpin = new QDoubleSpinBox; + subsSpin->setAlignment( Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter ); + subsSpin->setDecimals( 3 ); + subsSpin->setMinimum( -100 ); + subsSpin->setMaximum( 100 ); + subsSpin->setSingleStep( 0.1 ); + subsSpin->setToolTip( qtr( "A positive value means that\n" + "the subtitles are ahead of the video" ) ); + subsSpin->setSuffix( "s" ); + subsLayout->addWidget( subsSpin, 0, 2, 1, 1 ); + + + moinssubSpeed = new QToolButton; + moinssubSpeed->setToolButtonStyle( Qt::ToolButtonTextOnly ); + moinssubSpeed->setAutoRaise( true ); + moinssubSpeed->setText( "-" ); + subsLayout->addWidget( moinssubSpeed, 1, 1, 1, 1 ); + + plussubSpeed = new QToolButton; + plussubSpeed->setToolButtonStyle( Qt::ToolButtonTextOnly ); + plussubSpeed->setAutoRaise( true ); + plussubSpeed->setText( "+" ); + subsLayout->addWidget( plussubSpeed, 1, 3, 1, 1 ); + + QLabel *subSpeedLabel = new QLabel; + subSpeedLabel->setText( qtr( "Speed of the subtitles:" ) ); + subsLayout->addWidget( subSpeedLabel, 1, 0, 1, 3 ); + + subSpeedSpin = new QDoubleSpinBox; + subSpeedSpin->setAlignment( Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter ); + subSpeedSpin->setDecimals( 3 ); + subSpeedSpin->setMinimum( 1 ); + subSpeedSpin->setMaximum( 100 ); + subSpeedSpin->setSingleStep( 0.2 ); + subsLayout->addWidget( subSpeedSpin, 1, 2, 1, 1 ); + + mainLayout->addWidget( subsBox, 2, 0, 2, 5 ); + + updateButton = new QToolButton; + updateButton->setAutoRaise( true ); + mainLayout->addWidget( updateButton, 0, 4, 1, 1 ); + + + /* Various Connects */ + CONNECT( moinsAV, clicked(), AVSpin, stepDown () ); + CONNECT( plusAV, clicked(), AVSpin, stepUp () ); + CONNECT( moinssubs, clicked(), subsSpin, stepDown () ); + CONNECT( plussubs, clicked(), subsSpin, stepUp () ); + CONNECT( moinssubSpeed, clicked(), subSpeedSpin, stepDown () ); + CONNECT( plussubSpeed, clicked(), subSpeedSpin, stepUp () ); + CONNECT( AVSpin, valueChanged ( double ), this, advanceAudio( double ) ) ; + CONNECT( subsSpin, valueChanged ( double ), this, advanceSubs( double ) ) ; + CONNECT( subSpeedSpin, valueChanged ( double ), + this, adjustSubsSpeed( double ) ); + BUTTON_SET_ACT_I( updateButton, "", update, + qtr( "Force update of this dialog's values" ), update() ); + + /* Set it */ + update(); +} + +void SyncControls::update() +{ + int64_t i_delay; + if( THEMIM->getInput() ) + { + i_delay = var_GetTime( THEMIM->getInput(), "spu-delay" ); + AVSpin->setValue( ( (double)i_delay ) / 1000000 ); + i_delay = var_GetTime( THEMIM->getInput(), "audio-delay" ); + subsSpin->setValue( ( (double)i_delay ) / 1000000 ); + subSpeedSpin->setValue( var_GetFloat( THEMIM->getInput(), "sub-fps" ) ); + } +} + +void SyncControls::advanceAudio( double f_advance ) +{ + if( THEMIM->getInput() ) + { + int64_t i_delay = var_GetTime( THEMIM->getInput(), "audio-delay" ); + i_delay += f_advance * 1000000; + var_SetTime( THEMIM->getInput(), "audio-delay", i_delay ); + msg_Dbg( p_intf, "I am advancing Audio %d", f_advance ); + } +} + +void SyncControls::advanceSubs( double f_advance ) +{ + if( THEMIM->getInput() ) + { + int64_t i_delay = var_GetTime( THEMIM->getInput(), "spu-delay" ); + i_delay += f_advance * 1000000; + var_SetTime( THEMIM->getInput(), "spu-delay", i_delay ); + msg_Dbg( p_intf, "I am advancing subtitles %d", f_advance ); + } +} + +void SyncControls::adjustSubsSpeed( double f_fps ) +{ + if( THEMIM->getInput() ) + { + var_SetFloat( THEMIM->getInput(), "sub-fps", f_fps ); + } +} + /********************************************************************** * Video filters / Adjust **********************************************************************/