#include <vlc_osd.h>
#include <iostream>
+#include <string.h>
#if 0
class ConfClickHandler : public QObject
} \
CONNECT( ui.widget##Enable, clicked(), this, updateFilters() );
#define SETUP_VFILTER_OPTION( widget, signal ) \
+ initComboBoxItems( ui.widget ); \
setWidgetValue( ui.widget ); \
CONNECT( ui.widget, signal, this, updateFilterOptions() );
SETUP_VFILTER_OPTION( brightnessThresholdCheck, stateChanged(int) )
SETUP_VFILTER( extract )
- SETUP_VFILTER_OPTION( extractRedSlider, valueChanged(int) )
- SETUP_VFILTER_OPTION( extractGreenSlider, valueChanged(int) )
- SETUP_VFILTER_OPTION( extractBlueSlider, valueChanged(int) )
+ SETUP_VFILTER_OPTION( extractComponentText, textChanged(QString) )
SETUP_VFILTER( colorthres )
- SETUP_VFILTER_OPTION( colorthresRedSlider, valueChanged(int) )
- SETUP_VFILTER_OPTION( colorthresGreenSlider, valueChanged(int) )
- SETUP_VFILTER_OPTION( colorthresBlueSlider, valueChanged(int) )
+ SETUP_VFILTER_OPTION( colorthresColorText, textChanged(QString) )
SETUP_VFILTER_OPTION( colorthresSaturationthresSlider, valueChanged(int) )
SETUP_VFILTER_OPTION( colorthresSimilaritythresSlider, valueChanged(int) )
SETUP_VFILTER_OPTION( gradientTypeCheck, stateChanged(int) )
SETUP_VFILTER_OPTION( gradientCartoonCheck, stateChanged(int) )
- SETUP_VFILTER( blur )
+ SETUP_VFILTER( motionblur )
SETUP_VFILTER_OPTION( blurFactorSlider, valueChanged(int) )
SETUP_VFILTER( motiondetect )
SETUP_VFILTER( rotate )
SETUP_VFILTER_OPTION( rotateAngleDial, valueChanged(int) )
+ ui.rotateAngleDial->setWrapping( true );
+ ui.rotateAngleDial->setNotchesVisible( true );
SETUP_VFILTER( puzzle )
SETUP_VFILTER_OPTION( puzzleRowsSpin, valueChanged(int) )
{
vout_thread_t *p_vout;
char *psz_parser, *psz_string;
+ const char *psz_filter_type;
- char *psz_filter_type;
- vlc_object_t *p_obj = (vlc_object_t *)
- vlc_object_find_name( p_intf->p_libvlc_global, psz_name, FIND_CHILD );
+ /* 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 );
if( !p_obj )
{
- msg_Err( p_intf, "Unable to find filter module." );
+ msg_Err( p_intf, "Unable to find filter module \"%s\n.", psz_name );
return;
}
- if( !strcmp( ((module_t*)p_obj)->psz_capability, "video filter2" ) )
+ if( module_IsCapable( p_obj, "video filter2" ) )
{
psz_filter_type = "video-filter";
}
- else if( !strcmp( ((module_t*)p_obj)->psz_capability, "video filter" ) )
+ else if( module_IsCapable( p_obj, "video filter" ) )
{
psz_filter_type = "vout-filter";
}
- else if( !strcmp( ((module_t*)p_obj)->psz_capability, "sub filter" ) )
+ else if( module_IsCapable( p_obj, "sub filter" ) )
{
psz_filter_type = "sub-filter";
}
: groupbox->isChecked() );
}
+void ExtVideo::initComboBoxItems( QObject *widget )
+{
+ QComboBox *combobox = qobject_cast<QComboBox*>(widget);
+ if( !combobox ) return;
+ QString option = OptionFromWidgetName( widget );
+ module_config_t *p_item = config_FindConfig( VLC_OBJECT(p_intf),
+ option.toStdString().c_str() );
+ if( p_item )
+ {
+ int i_type = p_item->i_type & CONFIG_ITEM;
+ for( int i_index = 0; i_index < p_item->i_list; i_index++ )
+ {
+ 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] );
+ else if( i_type == CONFIG_ITEM_STRING )
+ combobox->addItem( qfu( p_item->ppsz_list_text[i_index] ), p_item->ppsz_list[i_index] );
+ }
+ }
+ else
+ {
+ msg_Err( p_intf, "Couldn't find option \"%s\".",
+ option.toStdString().c_str() );
+ }
+}
+
void ExtVideo::setWidgetValue( QObject *widget )
{
QString module = ModuleFromWidgetName( widget->parent() );
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 )
{
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( val.i_int );
+ else if( dial ) dial->setValue( (540-val.i_int)%360 );
+ else if( lineedit )
+ {
+ char str[30];
+ sprintf( str, "%06X", val.i_int );
+ lineedit->setText( str );
+ }
+ else if( combobox ) combobox->setCurrentIndex(
+ combobox->findData( val.i_int ) );
else msg_Warn( p_intf, "Oops %s %s %d", __FILE__, __func__, __LINE__ );
}
else if( i_type == VLC_VAR_FLOAT )
}
else if( i_type == VLC_VAR_STRING )
{
- const char *psz_string = NULL;
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__ );
free( val.psz_string );
}
}
int i_type = var_Type( p_obj, option.toStdString().c_str() );
- if( !( i_type & VLC_VAR_ISCOMMAND ) )
+ bool b_is_command = ( i_type & VLC_VAR_ISCOMMAND );
+ if( !b_is_command )
{
- vlc_object_release( p_obj );
- msg_Err( p_intf, "Module %s's %s variable isn't a 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() );
- return;
+ /* FIXME: restart automatically somewhere near the end of this function */
}
/* Try to cast to all the widgets we're likely to encounter. Only
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 = dial->value();
- else if( lineedit ) i_int = lineedit->text().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( i_type == VLC_VAR_INTEGER )
- var_SetInteger( p_obj, option.toStdString().c_str(), i_int );
- else
- var_SetBool( p_obj, option.toStdString().c_str(), i_int );
+ if( b_is_command )
+ {
+ if( i_type == VLC_VAR_INTEGER )
+ var_SetInteger( p_obj, option.toStdString().c_str(), i_int );
+ else
+ var_SetBool( p_obj, option.toStdString().c_str(), i_int );
+ }
}
else if( i_type == VLC_VAR_FLOAT )
{
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 );
- var_SetFloat( p_obj, option.toStdString().c_str(), f_float );
+ if( b_is_command )
+ var_SetFloat( p_obj, option.toStdString().c_str(), f_float );
}
else if( i_type == VLC_VAR_STRING )
{
char *psz_string = NULL;
- if( lineedit ) psz_string = qtu(lineedit->text());
+ 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 );
- var_SetString( p_obj, option.toStdString().c_str(), psz_string );
+ if( b_is_command )
+ var_SetString( p_obj, option.toStdString().c_str(), psz_string );
+ free( psz_string );
}
else
msg_Err( p_intf,
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 ) :
smallFont.setPointSize( smallFont.pointSize() - 3 );
ui.setupUi( this );
+ presetsComboBox = ui.presetsCombo;
ui.preampLabel->setFont( smallFont );
ui.preampSlider->setMaximum( 400 );
/* 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;
+ 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 );
}
}
if( psz_af && strstr( psz_af, "equalizer" ) != NULL )
ui.enableCheck->setChecked( true );
+ free( psz_af );
enable( ui.enableCheck->isChecked() );
setValues( psz_bands, f_preamp );
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 )
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 );
+}
+
+/**********************************************************************
+ * Spatializer
+ **********************************************************************/
+static const char *psz_control_names[] =
+{
+ "Roomsize", "Width" , "Wet", "Dry", "Damp"
+};
+static const QString 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<QWidget*>(0) );
+ smallFont.setPointSize( smallFont.pointSize() - 3 );
+
+ ui.setupUi( this );
+
+ QGridLayout *grid = new QGridLayout( ui.frame );
+ grid->setMargin( 0 );
+
+ 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( control_names[i] + "\n" );
+ ctrl_texts[i]->setFont( smallFont );
+ ctrl_readout[i] = new QLabel( "" );
+ ctrl_readout[i]->setFont( smallFont );
+ grid->addWidget( spatCtrl[i], 0, i );
+ grid->addWidget( ctrl_readout[i],1,i);
+ grid->addWidget( ctrl_texts[i], 2, i );
+ }
+
+ BUTTONACT( ui.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 )
+ ui.enableCheck->setChecked( true );
+ free( psz_af );
+ enable( ui.enableCheck->isChecked() );
+ setValues( controlVars );
+
+}
+
+Spatializer::~Spatializer()
+{
}
+void Spatializer::enable()
+{
+ bool en = ui.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 );
+ }
+ // printf("set callback values %s %s %d\n", __FILE__,__func__,__LINE__);
+
+}
+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 );
+}
/**********************************************************************
* Video filters / Adjust