X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Fextended_panels.cpp;h=6adc33390761401128631a440a93a5fa037a1481;hb=37af31a84895992d0c3dacea5e2c9ec9bc696cdb;hp=e9c69182a82220a65a2a040be9854e7a09bee49d;hpb=4fa324127f5179a41d0bd38db414002afa9db73b;p=vlc diff --git a/modules/gui/qt4/components/extended_panels.cpp b/modules/gui/qt4/components/extended_panels.cpp index e9c69182a8..6adc333907 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 @@ -10,7 +10,7 @@ * 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. + * ( 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 @@ -28,6 +28,7 @@ #include #include #include +#include #include "components/extended_panels.hpp" #include "dialogs/preferences.hpp" @@ -41,12 +42,13 @@ #include #include +#include #if 0 class ConfClickHandler : public QObject { public: - ConfClickHandler( intf_thread_t *_p_intf, ExtVideo *_e ) : QObject (_e) { + ConfClickHandler( intf_thread_t *_p_intf, ExtVideo *_e ) : QObject ( _e ) { e = _e; p_intf = _p_intf; } virtual ~ConfClickHandler() {} @@ -67,7 +69,7 @@ private: QString ModuleFromWidgetName( QObject *obj ) { - return obj->objectName().replace("Enable",""); + return obj->objectName().replace( "Enable","" ); } QString OptionFromWidgetName( QObject *obj ) @@ -94,12 +96,12 @@ ExtVideo::ExtVideo( intf_thread_t *_p_intf, QWidget *_parent ) : #define SETUP_VFILTER( widget ) \ { \ - vlc_object_t *p_obj = (vlc_object_t *) \ + vlc_object_t *p_obj = ( vlc_object_t * ) \ vlc_object_find_name( p_intf->p_libvlc, \ #widget, \ FIND_CHILD ); \ - QCheckBox *checkbox = qobject_cast(ui.widget##Enable); \ - QGroupBox *groupbox = qobject_cast(ui.widget##Enable); \ + QCheckBox *checkbox = qobject_cast( ui.widget##Enable ); \ + QGroupBox *groupbox = qobject_cast( ui.widget##Enable ); \ if( p_obj ) \ { \ vlc_object_release( p_obj ); \ @@ -119,30 +121,30 @@ ExtVideo::ExtVideo( intf_thread_t *_p_intf, QWidget *_parent ) : CONNECT( ui.widget, signal, this, updateFilterOptions() ); SETUP_VFILTER( adjust ) - SETUP_VFILTER_OPTION( hueSlider, valueChanged(int) ) - SETUP_VFILTER_OPTION( contrastSlider, valueChanged(int) ) - SETUP_VFILTER_OPTION( brightnessSlider, valueChanged(int) ) - SETUP_VFILTER_OPTION( saturationSlider, valueChanged(int) ) - SETUP_VFILTER_OPTION( gammaSlider, valueChanged(int) ) - SETUP_VFILTER_OPTION( brightnessThresholdCheck, stateChanged(int) ) + SETUP_VFILTER_OPTION( hueSlider, valueChanged( int ) ) + SETUP_VFILTER_OPTION( contrastSlider, valueChanged( int ) ) + SETUP_VFILTER_OPTION( brightnessSlider, valueChanged( int ) ) + SETUP_VFILTER_OPTION( saturationSlider, valueChanged( int ) ) + SETUP_VFILTER_OPTION( gammaSlider, valueChanged( int ) ) + SETUP_VFILTER_OPTION( brightnessThresholdCheck, stateChanged( int ) ) SETUP_VFILTER( extract ) - SETUP_VFILTER_OPTION( extractComponentText, textChanged(QString) ) + SETUP_VFILTER_OPTION( extractComponentText, textChanged( QString ) ) SETUP_VFILTER( colorthres ) - SETUP_VFILTER_OPTION( colorthresColorText, textChanged(QString) ) - SETUP_VFILTER_OPTION( colorthresSaturationthresSlider, valueChanged(int) ) - SETUP_VFILTER_OPTION( colorthresSimilaritythresSlider, valueChanged(int) ) + SETUP_VFILTER_OPTION( colorthresColorText, textChanged( QString ) ) + SETUP_VFILTER_OPTION( colorthresSaturationthresSlider, valueChanged( int ) ) + SETUP_VFILTER_OPTION( colorthresSimilaritythresSlider, valueChanged( int ) ) SETUP_VFILTER( invert ) SETUP_VFILTER( gradient ) - SETUP_VFILTER_OPTION( gradientModeCombo, currentIndexChanged(QString) ) - SETUP_VFILTER_OPTION( gradientTypeCheck, stateChanged(int) ) - SETUP_VFILTER_OPTION( gradientCartoonCheck, stateChanged(int) ) + SETUP_VFILTER_OPTION( gradientModeCombo, currentIndexChanged( QString ) ) + SETUP_VFILTER_OPTION( gradientTypeCheck, stateChanged( int ) ) + SETUP_VFILTER_OPTION( gradientCartoonCheck, stateChanged( int ) ) SETUP_VFILTER( motionblur ) - SETUP_VFILTER_OPTION( blurFactorSlider, valueChanged(int) ) + SETUP_VFILTER_OPTION( blurFactorSlider, valueChanged( int ) ) SETUP_VFILTER( motiondetect ) @@ -151,48 +153,48 @@ ExtVideo::ExtVideo( intf_thread_t *_p_intf, QWidget *_parent ) : SETUP_VFILTER( psychedelic ) SETUP_VFILTER( sharpen ) - SETUP_VFILTER_OPTION( sharpenSigmaSlider, valueChanged(int) ) + SETUP_VFILTER_OPTION( sharpenSigmaSlider, valueChanged( int ) ) SETUP_VFILTER( ripple ) SETUP_VFILTER( wave ) SETUP_VFILTER( transform ) - SETUP_VFILTER_OPTION( transformTypeCombo, currentIndexChanged(QString) ) + SETUP_VFILTER_OPTION( transformTypeCombo, currentIndexChanged( QString ) ) SETUP_VFILTER( rotate ) - SETUP_VFILTER_OPTION( rotateAngleDial, valueChanged(int) ) + SETUP_VFILTER_OPTION( rotateAngleDial, valueChanged( int ) ) ui.rotateAngleDial->setWrapping( true ); ui.rotateAngleDial->setNotchesVisible( true ); SETUP_VFILTER( puzzle ) - SETUP_VFILTER_OPTION( puzzleRowsSpin, valueChanged(int) ) - SETUP_VFILTER_OPTION( puzzleColsSpin, valueChanged(int) ) - SETUP_VFILTER_OPTION( puzzleBlackSlotCheck, stateChanged(int) ) + SETUP_VFILTER_OPTION( puzzleRowsSpin, valueChanged( int ) ) + SETUP_VFILTER_OPTION( puzzleColsSpin, valueChanged( int ) ) + SETUP_VFILTER_OPTION( puzzleBlackSlotCheck, stateChanged( int ) ) SETUP_VFILTER( magnify ) SETUP_VFILTER( clone ) - SETUP_VFILTER_OPTION( cloneCountSpin, valueChanged(int) ) + SETUP_VFILTER_OPTION( cloneCountSpin, valueChanged( int ) ) SETUP_VFILTER( wall ) - SETUP_VFILTER_OPTION( wallRowsSpin, valueChanged(int) ) - SETUP_VFILTER_OPTION( wallColsSpin, valueChanged(int) ) + SETUP_VFILTER_OPTION( wallRowsSpin, valueChanged( int ) ) + SETUP_VFILTER_OPTION( wallColsSpin, valueChanged( int ) ) SETUP_VFILTER( erase ) SETUP_VFILTER_OPTION( eraseMaskText, editingFinished() ) - SETUP_VFILTER_OPTION( eraseYSpin, valueChanged(int) ) - SETUP_VFILTER_OPTION( eraseXSpin, valueChanged(int) ) + SETUP_VFILTER_OPTION( eraseYSpin, valueChanged( int ) ) + SETUP_VFILTER_OPTION( eraseXSpin, valueChanged( int ) ) SETUP_VFILTER( marq ) - SETUP_VFILTER_OPTION( marqMarqueeText, textChanged(QString) ) - SETUP_VFILTER_OPTION( marqPositionCombo, currentIndexChanged(QString) ) + SETUP_VFILTER_OPTION( marqMarqueeText, textChanged( QString ) ) + SETUP_VFILTER_OPTION( marqPositionCombo, currentIndexChanged( QString ) ) SETUP_VFILTER( logo ) SETUP_VFILTER_OPTION( logoFileText, editingFinished() ) - SETUP_VFILTER_OPTION( logoYSpin, valueChanged(int) ) - SETUP_VFILTER_OPTION( logoXSpin, valueChanged(int) ) - SETUP_VFILTER_OPTION( logoTransparencySlider, valueChanged(int) ) + SETUP_VFILTER_OPTION( logoYSpin, valueChanged( int ) ) + SETUP_VFILTER_OPTION( logoXSpin, valueChanged( int ) ) + SETUP_VFILTER_OPTION( logoTransparencySlider, valueChanged( int ) ) #undef SETUP_VFILTER #undef SETUP_VFILTER_OPTION @@ -206,42 +208,40 @@ void ExtVideo::ChangeVFiltersString( char *psz_name, vlc_bool_t b_add ) { vout_thread_t *p_vout; char *psz_parser, *psz_string; - - char *psz_filter_type; + 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. */ - vlc_object_t *p_obj = (vlc_object_t *) - vlc_object_find_name( p_intf->p_libvlc_global, psz_name, FIND_CHILD ); + module_t *p_obj = module_FindName( p_intf, psz_name ); if( !p_obj ) { msg_Err( p_intf, "Unable to find filter module \"%s\n.", psz_name ); return; } - if( module_IsCapable( (module_t*)p_obj, "video filter2" ) ) + if( module_IsCapable( p_obj, "video filter2" ) ) { psz_filter_type = "video-filter"; } - else if( module_IsCapable( (module_t*)p_obj, "video filter" ) ) + else if( module_IsCapable( p_obj, "video filter" ) ) { psz_filter_type = "vout-filter"; } - else if( module_IsCapable( (module_t*)p_obj, "sub filter" ) ) + else if( module_IsCapable( p_obj, "sub filter" ) ) { psz_filter_type = "sub-filter"; } 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 ); - if( !psz_string ) psz_string = strdup(""); + if( !psz_string ) psz_string = strdup( "" ); psz_parser = strstr( psz_string, psz_name ); @@ -250,7 +250,7 @@ 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", + asprintf( &psz_string, ( *psz_string ) ? "%s:%s" : "%s%s", psz_string, psz_name ); free( psz_parser ); } @@ -263,10 +263,10 @@ void ExtVideo::ChangeVFiltersString( char *psz_name, vlc_bool_t b_add ) { if( psz_parser ) { - if( *(psz_parser + strlen(psz_name)) == ':' ) + if( *( psz_parser + strlen( psz_name ) ) == ':' ) { - memmove( psz_parser, psz_parser + strlen(psz_name) + 1, - strlen(psz_parser + strlen(psz_name) + 1 ) + 1 ); + memmove( psz_parser, psz_parser + strlen( psz_name ) + 1, + strlen( psz_parser + strlen( psz_name ) + 1 ) + 1 ); } else { @@ -296,7 +296,7 @@ void ExtVideo::ChangeVFiltersString( char *psz_name, vlc_bool_t b_add ) ui.subpictureFilterText->setText( psz_string ); /* Try to set on the fly */ - p_vout = (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT, + p_vout = ( vout_thread_t * )vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); if( p_vout ) { @@ -315,20 +315,20 @@ void ExtVideo::updateFilters() QString module = ModuleFromWidgetName( sender() ); //std::cout << "Module name: " << module.toStdString() << std::endl; - QCheckBox *checkbox = qobject_cast(sender()); - QGroupBox *groupbox = qobject_cast(sender()); + QCheckBox *checkbox = qobject_cast( sender() ); + QGroupBox *groupbox = qobject_cast( sender() ); - ChangeVFiltersString( qtu(module), + ChangeVFiltersString( qtu( module ), checkbox ? checkbox->isChecked() : groupbox->isChecked() ); } void ExtVideo::initComboBoxItems( QObject *widget ) { - QComboBox *combobox = qobject_cast(widget); + QComboBox *combobox = qobject_cast( widget ); if( !combobox ) return; QString option = OptionFromWidgetName( widget ); - module_config_t *p_item = config_FindConfig( VLC_OBJECT(p_intf), + module_config_t *p_item = config_FindConfig( VLC_OBJECT( p_intf ), option.toStdString().c_str() ); if( p_item ) { @@ -337,9 +337,11 @@ void ExtVideo::initComboBoxItems( QObject *widget ) { if( i_type == CONFIG_ITEM_INTEGER || i_type == CONFIG_ITEM_BOOL ) - combobox->addItem( qfu( p_item->ppsz_list_text[i_index] ), p_item->pi_list[i_index] ); + combobox->addItem( qfu( p_item->ppsz_list_text[i_index] ), + p_item->pi_list[i_index] ); else if( i_type == CONFIG_ITEM_STRING ) - combobox->addItem( qfu( p_item->ppsz_list_text[i_index] ), p_item->ppsz_list[i_index] ); + combobox->addItem( qfu( p_item->ppsz_list_text[i_index] ), + p_item->ppsz_list[i_index] ); } } else @@ -356,7 +358,7 @@ void ExtVideo::setWidgetValue( QObject *widget ) QString option = OptionFromWidgetName( widget ); //std::cout << "Option name: " << option.toStdString() << std::endl; - vlc_object_t *p_obj = (vlc_object_t *) + vlc_object_t *p_obj = ( vlc_object_t * ) vlc_object_find_name( p_intf->p_libvlc, module.toStdString().c_str(), FIND_CHILD ); @@ -365,9 +367,11 @@ void ExtVideo::setWidgetValue( QObject *widget ) if( !p_obj ) { +#if 0 msg_Dbg( p_intf, "Module instance %s not found, looking in config values.", module.toStdString().c_str() ); +#endif i_type = config_GetType( p_intf, option.toStdString().c_str() ) & 0xf0; switch( i_type ) { @@ -392,13 +396,13 @@ void ExtVideo::setWidgetValue( QObject *widget ) /* Try to cast to all the widgets we're likely to encounter. Only * one of the casts is expected to work. */ - QSlider *slider = qobject_cast (widget); - QCheckBox *checkbox = qobject_cast (widget); - QSpinBox *spinbox = qobject_cast (widget); - QDoubleSpinBox *doublespinbox = qobject_cast(widget); - QDial *dial = qobject_cast (widget); - QLineEdit *lineedit = qobject_cast (widget); - QComboBox *combobox = qobject_cast (widget); + QSlider *slider = qobject_cast ( widget ); + QCheckBox *checkbox = qobject_cast ( widget ); + QSpinBox *spinbox = qobject_cast ( widget ); + QDoubleSpinBox *doublespinbox = qobject_cast( widget ); + QDial *dial = qobject_cast ( widget ); + QLineEdit *lineedit = qobject_cast ( widget ); + QComboBox *combobox = qobject_cast ( widget ); if( i_type == VLC_VAR_INTEGER || i_type == VLC_VAR_BOOL ) { @@ -407,7 +411,7 @@ void ExtVideo::setWidgetValue( QObject *widget ) else if( checkbox ) checkbox->setCheckState( val.i_int? Qt::Checked : Qt::Unchecked ); else if( spinbox ) spinbox->setValue( val.i_int ); - else if( dial ) dial->setValue( (540-val.i_int)%360 ); + else if( dial ) dial->setValue( ( 540-val.i_int )%360 ); else if( lineedit ) { char str[30]; @@ -421,13 +425,13 @@ void ExtVideo::setWidgetValue( QObject *widget ) else if( i_type == VLC_VAR_FLOAT ) { double f_float = 0; - if( slider ) slider->setValue( (int)(val.f_float*(double)slider->tickInterval())); /* hack alert! */ - else if( doublespinbox ) doublespinbox->setValue(val.f_float); + if( slider ) slider->setValue( ( int )( val.f_float*( double )slider->tickInterval() ) ); /* hack alert! */ + else if( doublespinbox ) doublespinbox->setValue( val.f_float ); else msg_Warn( p_intf, "Oops %s %s %d", __FILE__, __func__, __LINE__ ); } else if( i_type == VLC_VAR_STRING ) { - if( lineedit ) lineedit->setText( qfu(val.psz_string) ); + if( lineedit ) lineedit->setText( qfu( val.psz_string ) ); else if( combobox ) combobox->setCurrentIndex( combobox->findData( qfu( val.psz_string ) ) ); else msg_Warn( p_intf, "Oops %s %s %d", __FILE__, __func__, __LINE__ ); @@ -435,7 +439,7 @@ void ExtVideo::setWidgetValue( QObject *widget ) } else msg_Err( p_intf, - "Module %s's %s variable is of an unsupported type (%d)", + "Module %s's %s variable is of an unsupported type ( %d )", module.toStdString().c_str(), option.toStdString().c_str(), i_type ); @@ -448,7 +452,7 @@ void ExtVideo::updateFilterOptions() QString option = OptionFromWidgetName( sender() ); //std::cout << "Option name: " << option.toStdString() << std::endl; - vlc_object_t *p_obj = (vlc_object_t *) + vlc_object_t *p_obj = ( vlc_object_t * ) vlc_object_find_name( p_intf->p_libvlc, module.toStdString().c_str(), FIND_CHILD ); @@ -470,13 +474,13 @@ void ExtVideo::updateFilterOptions() /* Try to cast to all the widgets we're likely to encounter. Only * one of the casts is expected to work. */ - QSlider *slider = qobject_cast (sender()); - QCheckBox *checkbox = qobject_cast (sender()); - QSpinBox *spinbox = qobject_cast (sender()); - QDoubleSpinBox *doublespinbox = qobject_cast(sender()); - QDial *dial = qobject_cast (sender()); - QLineEdit *lineedit = qobject_cast (sender()); - QComboBox *combobox = qobject_cast (sender()); + QSlider *slider = qobject_cast ( sender() ); + QCheckBox *checkbox = qobject_cast ( sender() ); + QSpinBox *spinbox = qobject_cast ( sender() ); + QDoubleSpinBox *doublespinbox = qobject_cast( sender() ); + QDial *dial = qobject_cast ( sender() ); + QLineEdit *lineedit = qobject_cast ( sender() ); + QComboBox *combobox = qobject_cast ( sender() ); i_type &= 0xf0; if( i_type == VLC_VAR_INTEGER || i_type == VLC_VAR_BOOL ) @@ -485,9 +489,9 @@ void ExtVideo::updateFilterOptions() if( slider ) i_int = slider->value(); else if( checkbox ) i_int = checkbox->checkState() == Qt::Checked; else if( spinbox ) i_int = spinbox->value(); - else if( dial ) i_int = (540-dial->value())%360; - else if( lineedit ) i_int = lineedit->text().toInt(NULL,16); - else if( combobox ) i_int = combobox->itemData(combobox->currentIndex()).toInt(); + else if( dial ) i_int = ( 540-dial->value() )%360; + 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 ); if( b_is_command ) @@ -501,8 +505,8 @@ void ExtVideo::updateFilterOptions() else if( i_type == VLC_VAR_FLOAT ) { double f_float = 0; - if( slider ) f_float = (double)slider->value() - / (double)slider->tickInterval(); /* hack alert! */ + if( slider ) f_float = ( double )slider->value() + / ( double )slider->tickInterval(); /* hack alert! */ 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__ ); @@ -513,9 +517,9 @@ void ExtVideo::updateFilterOptions() 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())); + if( lineedit ) psz_string = strdup( qtu( lineedit->text() ) ); + 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 ); if( b_is_command ) @@ -524,7 +528,7 @@ void ExtVideo::updateFilterOptions() } else msg_Err( p_intf, - "Module %s's %s variable is of an unsupported type (%d)", + "Module %s's %s variable is of an unsupported type ( %d )", module.toStdString().c_str(), option.toStdString().c_str(), i_type ); @@ -535,8 +539,8 @@ void ExtVideo::updateFilterOptions() #if 0 void ExtVideo::gotoConf( QObject* src ) { -#define SHOWCONF(module) \ - if( src->objectName().contains(module) ) \ +#define SHOWCONF( module ) \ + if( src->objectName().contains( module ) ) \ { \ PrefsDialog::getInstance( p_intf )->showModulePrefs( module ); \ return; \ @@ -553,23 +557,221 @@ 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: + { + QPushButton *button = new QPushButton( psz_label, box ); + button->setObjectName( psz_var ); + + CONNECT( button, clicked( bool ), this, + ValueChange( bool ) ); + layout->addWidget( button ); + 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( s->objectName().toStdString().c_str() ); + 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 **********************************************************************/ static const QString band_frequencies[] = { - " 60Hz ", " 170 Hz " , " 310 Hz ", " 600 Hz ", " 1 kHz ", - " 3 kHz " , " 6 kHz ", " 12 kHz ", " 14 kHz ", " 16 kHz " + " 60 Hz ", " 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 ) { - QFont smallFont = QApplication::font( static_cast(0) ); + QFont smallFont = QApplication::font( static_cast( 0 ) ); smallFont.setPointSize( smallFont.pointSize() - 3 ); ui.setupUi( this ); + presetsComboBox = ui.presetsCombo; ui.preampLabel->setFont( smallFont ); ui.preampSlider->setMaximum( 400 ); @@ -583,7 +785,7 @@ Equalizer::Equalizer( intf_thread_t *_p_intf, QWidget *_parent ) : BUTTONACT( ui.enableCheck, enable() ); BUTTONACT( ui.eq2PassCheck, set2Pass() ); - CONNECT( ui.preampSlider, valueChanged(int), this, setPreamp() ); + CONNECT( ui.preampSlider, valueChanged( int ), this, setPreamp() ); QGridLayout *grid = new QGridLayout( ui.frame ); grid->setMargin( 0 ); @@ -592,7 +794,7 @@ 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, setBand() ); band_texts[i] = new QLabel( band_frequencies[i] + "\n0.0dB" ); band_texts[i]->setFont( smallFont ); grid->addWidget( bands[i], 0, i ); @@ -600,17 +802,17 @@ Equalizer::Equalizer( intf_thread_t *_p_intf, QWidget *_parent ) : } /* Write down initial values */ - aout_instance_t *p_aout = (aout_instance_t *)vlc_object_find(p_intf, - VLC_OBJECT_AOUT, FIND_ANYWHERE); - char *psz_af = NULL; + 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_GetString( p_aout, "audio-filter" ); + psz_af = var_GetNonEmptyString( p_aout, "audio-filter" ); if( var_GetBool( p_aout, "equalizer-2pass" ) ) ui.eq2PassCheck->setChecked( true ); - psz_bands = var_GetString( p_aout, "equalizer-bands" ); + psz_bands = var_GetNonEmptyString( p_aout, "equalizer-bands" ); f_preamp = var_GetFloat( p_aout, "equalizer-preamp" ); vlc_object_release( p_aout ); } @@ -624,6 +826,7 @@ Equalizer::Equalizer( intf_thread_t *_p_intf, QWidget *_parent ) : } if( psz_af && strstr( psz_af, "equalizer" ) != NULL ) ui.enableCheck->setChecked( true ); + free( psz_af ); enable( ui.enableCheck->isChecked() ); setValues( psz_bands, f_preamp ); @@ -638,7 +841,11 @@ void Equalizer::enable() bool en = ui.enableCheck->isChecked(); aout_EnableFilter( VLC_OBJECT( p_intf ), "equalizer", en ? VLC_TRUE : VLC_FALSE ); - enable( en ); +// aout_EnableFilter( VLC_OBJECT( p_intf ), "upmixer", +// en ? VLC_TRUE : VLC_FALSE ); +// aout_EnableFilter( VLC_OBJECT( p_intf ), "vsurround", +// en ? VLC_TRUE : VLC_FALSE ); + enable( en ); } void Equalizer::enable( bool en ) @@ -654,8 +861,8 @@ void Equalizer::enable( bool en ) void Equalizer::set2Pass() { - aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf, - VLC_OBJECT_AOUT, FIND_ANYWHERE); + 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 ) @@ -674,13 +881,13 @@ void Equalizer::set2Pass() void Equalizer::setPreamp() { - float f= (float)( ui.preampSlider->value() ) /10 - 20; + float f= ( float )( 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); + 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" ) + psz_val + qtr( "dB" ) ); if( p_aout ) { delCallbacks( p_aout ); @@ -700,13 +907,13 @@ void Equalizer::setBand() for( int i = 0 ; i< BANDS ; i++ ) { char psz_val[5]; - float f_val = (float)( bands[i]->value() ) / 10 - 20 ; + 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" ); } - aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf, - VLC_OBJECT_AOUT, FIND_ANYWHERE); + aout_instance_t *p_aout= ( aout_instance_t * )vlc_object_find( p_intf, + VLC_OBJECT_AOUT, FIND_ANYWHERE ); if( p_aout ) { delCallbacks( p_aout ); @@ -724,7 +931,7 @@ void Equalizer::setValues( char *psz_bands, float f_preamp ) { char psz_val[5]; float f = strtof( p, &p ); - int i_val= (int)( ( f + 20 ) * 10 ); + 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 + @@ -735,16 +942,16 @@ void Equalizer::setValues( char *psz_bands, float f_preamp ) } } char psz_val[5]; - int i_val = (int)( ( f_preamp + 20 ) * 10 ); + 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.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); + 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++ ) @@ -767,25 +974,179 @@ void Equalizer::setPreset( int preset ) setValues( psz_values, eqz_preset_10b[preset]->f_preamp ); } +static int PresetCallback( vlc_object_t *p_this, char const *psz_cmd, + vlc_value_t oldval, vlc_value_t newval, void *p_data ) +{ + char *psz_preset = newval.psz_string; + Equalizer *eq = ( Equalizer * )p_data; + eq->presetsComboBox->setCurrentIndex( eq->presetsComboBox->findText( qfu( psz_preset ) ) ); + return VLC_SUCCESS; +} + void Equalizer::delCallbacks( aout_instance_t *p_aout ) { -// var_DelCallback( p_aout, "equalizer-bands", EqzCallback, this ); -// var_DelCallback( p_aout, "equalizer-preamp", EqzCallback, this ); + //var_DelCallback( p_aout, "equalizer-bands", EqzCallback, this ); + //var_DelCallback( p_aout, "equalizer-preamp", EqzCallback, this ); + var_DelCallback( p_aout, "equalizer-preset", PresetCallback, 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 ); + //var_AddCallback( p_aout, "equalizer-bands", EqzCallback, this ); + //var_AddCallback( p_aout, "equalizer-preamp", EqzCallback, this ); + var_AddCallback( p_aout, "equalizer-preset", PresetCallback, this ); } +/********************************************************************** + * Audio filters + **********************************************************************/ /********************************************************************** - * Video filters / Adjust + * Spatializer **********************************************************************/ +static const char *psz_control_names[] = +{ + "Roomsize", "Width" , "Wet", "Dry", "Damp" +}; + +Spatializer::Spatializer( intf_thread_t *_p_intf, QWidget *_parent ) : + QWidget( _parent ) , p_intf( _p_intf ) +{ + QFont smallFont = QApplication::font( static_cast( 0 ) ); + smallFont.setPointSize( smallFont.pointSize() - 3 ); + + QGridLayout *layout = new QGridLayout( this ); + layout->setMargin( 0 ); + + enableCheck = new QCheckBox( qfu( "Enable spatializer" ) ); + layout->addWidget( enableCheck, 0, 0, 1, NUM_SP_CTRL ); + + for( int i = 0 ; i < NUM_SP_CTRL ; i++ ) + { + spatCtrl[i] = new QSlider( Qt::Vertical ); + if( i < 2 ) + { + spatCtrl[i]->setMaximum( 10 ); + spatCtrl[i]->setValue( 2 ); + } + else + { + spatCtrl[i]->setMaximum( 10 ); + spatCtrl[i]->setValue( 0 ); + spatCtrl[i]->setMinimum( -10 ); + } + oldControlVars[i] = spatCtrl[i]->value(); + CONNECT( spatCtrl[i], valueChanged( int ), this, setInitValues() ); + ctrl_texts[i] = new QLabel( qfu( psz_control_names[i] ) + "\n" ); + ctrl_texts[i]->setFont( smallFont ); + ctrl_readout[i] = new QLabel( "" ); + ctrl_readout[i]->setFont( smallFont ); + layout->addWidget( spatCtrl[i], 1, i ); + layout->addWidget( ctrl_readout[i], 2, i ); + layout->addWidget( ctrl_texts[i], 3, i ); + } + + BUTTONACT( enableCheck, enable() ); + + /* Write down initial values */ + aout_instance_t *p_aout = ( aout_instance_t * ) + vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE ); + char *psz_af; + + if( p_aout ) + { + psz_af = var_GetNonEmptyString( p_aout, "audio-filter" ); + for( int i = 0; i < NUM_SP_CTRL ; i++ ) + { + controlVars[i] = var_GetFloat( p_aout, psz_control_names[i] ); + } + vlc_object_release( p_aout ); + } + else + { + psz_af = config_GetPsz( p_aout, "audio-filter" ); + for( int i = 0; i < NUM_SP_CTRL ; i++ ) + { + controlVars[i] = config_GetFloat( p_intf, psz_control_names[i] ); + } + } + if( psz_af && strstr( psz_af, "spatializer" ) != NULL ) + enableCheck->setChecked( true ); + free( psz_af ); + enable( enableCheck->isChecked() ); + setValues( controlVars ); +} + +Spatializer::~Spatializer() +{ +} + +void Spatializer::enable() +{ + bool en = enableCheck->isChecked(); + aout_EnableFilter( VLC_OBJECT( p_intf ), "spatializer", + en ? VLC_TRUE : VLC_FALSE ); + enable( en ); +} + +void Spatializer::enable( bool en ) +{ + for( int i = 0 ; i< NUM_SP_CTRL; i++ ) + { + spatCtrl[i]->setEnabled( en ); + ctrl_texts[i]->setEnabled( en ); + ctrl_readout[i]->setEnabled( en ); + } +} +void Spatializer::setInitValues() +{ + setValues( controlVars ); +} + +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 ); + } + if( p_aout ) + { + for( int i = 0 ; i < NUM_SP_CTRL ; i++ ) + { + if( oldControlVars[i] != spatCtrl[i]->value() ) + { + var_SetFloat( p_aout, psz_control_names[i], + ( float )spatCtrl[i]->value() ); + config_PutFloat( p_intf, psz_control_names[i], + ( float ) spatCtrl[i]->value() ); + oldControlVars[i] = ( float ) spatCtrl[i]->value(); + } + } + vlc_object_release( p_aout ); + } + +} +void Spatializer::delCallbacks( aout_instance_t *p_aout ) +{ + // var_DelCallback( p_aout, "Spatializer-bands", EqzCallback, this ); + // var_DelCallback( p_aout, "Spatializer-preamp", EqzCallback, this ); +} + +void Spatializer::addCallbacks( aout_instance_t *p_aout ) +{ + // var_AddCallback( p_aout, "Spatializer-bands", EqzCallback, this ); + // var_AddCallback( p_aout, "Spatializer-preamp", EqzCallback, this ); +} /********************************************************************** - * Audio filters + * Video filters / Adjust **********************************************************************/ /**********************************************************************