X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Fextended_panels.cpp;h=25583c00d4d0d8ebf685923628006d45dde11b94;hb=72fdb18beab6d029a4ff3aa25d27f2a3dafad5a5;hp=eb8a996338a737b0576d69b847e1897d80ebd880;hpb=e2e6f592915ef9d8c25bfba133ae0f9455a93f94;p=vlc diff --git a/modules/gui/qt4/components/extended_panels.cpp b/modules/gui/qt4/components/extended_panels.cpp old mode 100644 new mode 100755 index eb8a996338..25583c00d4 --- 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,11 +31,13 @@ #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 @@ -40,8 +45,6 @@ #include #include -#include -#include #if 0 class ConfClickHandler : public QObject @@ -88,10 +91,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 +107,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 +183,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 +205,51 @@ 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::cropChange() +{ + char *psz_crop; + unsigned int height, width; //TODO set the variables if vout exists... + + p_vout = ( vout_thread_t * )vlc_object_find( p_intf, + VLC_OBJECT_VOUT, FIND_CHILD ); + if( p_vout ) + { + height = p_vout->i_window_height; + width = p_vout->i_window_width; + sprintf( psz_crop,"%ix%i+%i+%i", + width - ui.cropLeftPx->value() - ui.cropRightPx->value(), + height - ui.cropBotPx->value() - ui.cropTopPx->value(), + ui.cropLeftPx->value(), + ui.cropTopPx->value() ); + + // var_Set( p_vout, "crop-geometry", qtu( qs_crop ) ); + } + +} + void ExtVideo::ChangeVFiltersString( char *psz_name, vlc_bool_t 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 +270,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 +287,9 @@ 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 ) + return; free( psz_parser ); } else @@ -328,7 +367,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 +385,7 @@ void ExtVideo::initComboBoxItems( QObject *widget ) else { msg_Err( p_intf, "Couldn't find option \"%s\".", - option.toStdString().c_str() ); + qtu( option ) ); } } @@ -359,7 +398,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 +408,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 ); } @@ -417,7 +456,7 @@ void ExtVideo::setWidgetValue( QObject *widget ) sprintf( 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 +470,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 +478,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 +492,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 +531,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 +548,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 +595,211 @@ 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 ) + { + 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 ); + 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 **********************************************************************/ @@ -866,7 +1110,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] ); @@ -947,6 +1191,180 @@ 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 ); + updateButton->setText( "u" ); + updateButton->setToolTip( qtr( "Force update of the values in this dialog" ) ); + 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 ) ); + BUTTONACT( updateButton, 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 **********************************************************************/