X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Fextended_panels.cpp;h=1d71c52e212d5d7ef358070d2c01a4b5228a8c42;hb=42fef87c4f281f304b7d56c0cbfde0b7d1912ab6;hp=3c6aab706a7da6c453cf1ad64f964b2842db2dd9;hpb=96495216bb7b86db5c500820adf779890d1049b1;p=vlc diff --git a/modules/gui/qt4/components/extended_panels.cpp b/modules/gui/qt4/components/extended_panels.cpp index 3c6aab706a..1d71c52e21 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 @@ -34,15 +37,13 @@ #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 @@ -89,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 ) \ { \ @@ -181,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 ) ) @@ -198,15 +204,36 @@ 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; @@ -250,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 @@ -329,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; @@ -347,7 +378,7 @@ void ExtVideo::initComboBoxItems( QObject *widget ) else { msg_Err( p_intf, "Couldn't find option \"%s\".", - option.toStdString().c_str() ); + qtu( option ) ); } } @@ -360,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; @@ -370,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 ); } @@ -415,7 +446,7 @@ 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( @@ -440,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 ); } @@ -454,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 */ } @@ -493,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 ) @@ -510,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() ) ); + 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 ); @@ -595,7 +626,6 @@ void ExtV4l2::Refresh( void ) } if( p_obj ) { - msg_Dbg( p_intf, "Found v4l2 instance" ); vlc_value_t val, text, name; int i_ret = var_Change( p_obj, "controls", VLC_VAR_GETCHOICES, &val, &text ); @@ -689,12 +719,20 @@ void ExtV4l2::Refresh( void ) } case VLC_VAR_VOID: { - QPushButton *button = new QPushButton( psz_label, box ); - button->setObjectName( psz_var ); + 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 ); + CONNECT( button, clicked( bool ), this, + ValueChange( bool ) ); + layout->addWidget( button ); + } + else + { + QLabel *label = new QLabel( psz_label, box ); + layout->addWidget( label ); + } break; } default: @@ -711,7 +749,6 @@ void ExtV4l2::Refresh( void ) msg_Dbg( p_intf, "Couldn't find v4l2 instance" ); ui.help->show(); } - } void ExtV4l2::ValueChange( bool value ) @@ -725,7 +762,7 @@ void ExtV4l2::ValueChange( int value ) vlc_object_t *p_obj = (vlc_object_t*)vlc_object_find_name( p_intf, "v4l2", FIND_ANYWHERE ); if( p_obj ) { - char *psz_var = strdup( s->objectName().toStdString().c_str() ); + char *psz_var = strdup( qtu( s->objectName() ) ); int i_type = var_Type( p_obj, psz_var ); switch( i_type & VLC_VAR_TYPE ) { @@ -771,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++ ) @@ -794,26 +824,52 @@ 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 */ - aout_instance_t *p_aout = ( aout_instance_t * )vlc_object_find( p_intf, - VLC_OBJECT_AOUT, FIND_ANYWHERE ); + /* 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; - char *psz_bands; float f_preamp; + int i_preset; + + aout_instance_t *p_aout = ( aout_instance_t * )vlc_object_find( p_intf, + VLC_OBJECT_AOUT, FIND_ANYWHERE ); 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" ); 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 @@ -821,36 +877,41 @@ 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" ); 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++ ) @@ -859,11 +920,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 ); @@ -873,105 +935,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; - 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] ); + /* Create the QString in Qt */ + for( int i = 0 ; i< BANDS ;i++ ) + values += QString( " %1" ).arg( eqz_preset_10b[i_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, @@ -979,7 +1062,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; } @@ -1018,7 +1102,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++ ) @@ -1064,7 +1148,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] ); @@ -1085,7 +1169,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 ); } @@ -1105,16 +1189,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 ) { @@ -1145,6 +1226,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 **********************************************************************/