extrapanel.cpp
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:39k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * extrapanel.cpp : wxWindows plugin for vlc
  3.  *****************************************************************************
  4.  * Copyright (C) 2000-2004, 2003 VideoLAN
  5.  * $Id: extrapanel.cpp 9133 2004-11-04 13:37:17Z zorglub $
  6.  *
  7.  * Authors: Cl閙ent Stenac <zorglub@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <vlc/vlc.h>
  27. #include <vlc/aout.h>
  28. #include <aout_internal.h>
  29. #include <vlc/vout.h>
  30. #include <vlc/intf.h>
  31. #include <math.h>
  32. #include "wxwindows.h"
  33. /*****************************************************************************
  34.  * Local class declarations.
  35.  *****************************************************************************/
  36. /* FIXME */
  37. #define SMOOTH_TIP N_( "If this setting is not zero, the bands will move " 
  38.                 "together when you move one. The higher the value is, the " 
  39.                 "more correlated their movement will be." )
  40. static int IntfBandsCallback( vlc_object_t *, char const *,
  41.                               vlc_value_t, vlc_value_t, void * );
  42. static int IntfPreampCallback( vlc_object_t *, char const *,
  43.                                vlc_value_t, vlc_value_t, void * );
  44. static void ChangeFiltersString( intf_thread_t *, aout_instance_t *,
  45.                                  char *, vlc_bool_t );
  46. static void ChangeVFiltersString( intf_thread_t *, char *, vlc_bool_t );
  47. /* IDs for the controls and the menu commands */
  48. enum
  49. {
  50.     Notebook_Event,
  51.     Adjust_Event,
  52.     RestoreDefaults_Event,
  53.     Hue_Event,
  54.     Contrast_Event,
  55.     Brightness_Event,
  56.     Saturation_Event,
  57.     Gamma_Event,
  58.     Ratio_Event,
  59.     FiltersInfo_Event,
  60.     Filter0_Event, Filter1_Event, Filter2_Event, Filter3_Event, Filter4_Event,
  61.     Filter5_Event, Filter6_Event, Filter7_Event, Filter8_Event, Filter9_Event,
  62.     EqEnable_Event,
  63.     Eq2Pass_Event,
  64.     EqRestore_Event,
  65.     Smooth_Event,
  66.     Preamp_Event,
  67.     Band0_Event,Band1_Event,Band2_Event,Band3_Event,Band4_Event,
  68.     Band5_Event,Band6_Event,Band7_Event,Band8_Event,Band9_Event,
  69.     NormVol_Event, NVSlider_Event, HeadPhone_Event
  70. };
  71. BEGIN_EVENT_TABLE( ExtraPanel, wxPanel )
  72.     EVT_IDLE( ExtraPanel::OnIdle )
  73.     /* Equalizer */
  74.     EVT_CHECKBOX( EqEnable_Event, ExtraPanel::OnEnableEqualizer )
  75.     EVT_CHECKBOX( Eq2Pass_Event, ExtraPanel::OnEq2Pass )
  76.     EVT_BUTTON( EqRestore_Event, ExtraPanel::OnEqRestore )
  77.     EVT_COMMAND_SCROLL( Preamp_Event, ExtraPanel::OnPreamp )
  78.     EVT_COMMAND_SCROLL( Smooth_Event, ExtraPanel::OnEqSmooth )
  79.     EVT_COMMAND_SCROLL(Band0_Event, ExtraPanel::OnChangeEqualizer)
  80.     EVT_COMMAND_SCROLL(Band1_Event, ExtraPanel::OnChangeEqualizer)
  81.     EVT_COMMAND_SCROLL(Band2_Event, ExtraPanel::OnChangeEqualizer)
  82.     EVT_COMMAND_SCROLL(Band3_Event, ExtraPanel::OnChangeEqualizer)
  83.     EVT_COMMAND_SCROLL(Band4_Event, ExtraPanel::OnChangeEqualizer)
  84.     EVT_COMMAND_SCROLL(Band5_Event, ExtraPanel::OnChangeEqualizer)
  85.     EVT_COMMAND_SCROLL(Band6_Event, ExtraPanel::OnChangeEqualizer)
  86.     EVT_COMMAND_SCROLL(Band7_Event, ExtraPanel::OnChangeEqualizer)
  87.     EVT_COMMAND_SCROLL(Band8_Event, ExtraPanel::OnChangeEqualizer)
  88.     EVT_COMMAND_SCROLL(Band9_Event, ExtraPanel::OnChangeEqualizer)
  89.     /* Video */
  90.     EVT_CHECKBOX( Adjust_Event, ExtraPanel::OnEnableAdjust )
  91.     EVT_BUTTON( RestoreDefaults_Event, ExtraPanel::OnRestoreDefaults )
  92.     EVT_COMMAND_SCROLL(Hue_Event, ExtraPanel::OnAdjustUpdate)
  93.     EVT_COMMAND_SCROLL(Contrast_Event, ExtraPanel::OnAdjustUpdate)
  94.     EVT_COMMAND_SCROLL(Brightness_Event, ExtraPanel::OnAdjustUpdate)
  95.     EVT_COMMAND_SCROLL(Saturation_Event, ExtraPanel::OnAdjustUpdate)
  96.     EVT_COMMAND_SCROLL(Gamma_Event, ExtraPanel::OnAdjustUpdate)
  97.     EVT_BUTTON( FiltersInfo_Event, ExtraPanel::OnFiltersInfo )
  98.     EVT_CHECKBOX( Filter0_Event, ExtraPanel::OnSelectFilter )
  99.     EVT_CHECKBOX( Filter1_Event, ExtraPanel::OnSelectFilter )
  100.     EVT_CHECKBOX( Filter2_Event, ExtraPanel::OnSelectFilter )
  101.     EVT_CHECKBOX( Filter3_Event, ExtraPanel::OnSelectFilter )
  102.     EVT_CHECKBOX( Filter4_Event, ExtraPanel::OnSelectFilter )
  103.     EVT_CHECKBOX( Filter5_Event, ExtraPanel::OnSelectFilter )
  104.     EVT_CHECKBOX( Filter6_Event, ExtraPanel::OnSelectFilter )
  105.     EVT_CHECKBOX( Filter7_Event, ExtraPanel::OnSelectFilter )
  106.     EVT_CHECKBOX( Filter8_Event, ExtraPanel::OnSelectFilter )
  107.     EVT_CHECKBOX( Filter9_Event, ExtraPanel::OnSelectFilter )
  108.     /* Audio */
  109.     EVT_CHECKBOX( NormVol_Event, ExtraPanel::OnNormvol )
  110.     EVT_CHECKBOX( HeadPhone_Event, ExtraPanel::OnHeadphone )
  111.     EVT_COMMAND_SCROLL( NVSlider_Event, ExtraPanel::OnNormvolSlider )
  112. END_EVENT_TABLE()
  113. struct filter {
  114.     char *psz_filter;
  115.     char *psz_name;
  116.     char *psz_help;
  117. };
  118. static const struct filter vfilters[] =
  119. {
  120.     { "clone", "Image clone", "Creates several clones of the image" },
  121.     { "distort", "Distortion", "Adds distorsion effects" },
  122.     { "invert", "Image inversion" , "Inverts the image colors" },
  123.     { "crop", "Image cropping", "Crops the image" },
  124.     { "motionblur", "Blurring", "Creates a motion blurring on the image" },
  125.     { "transform", "Transformation", "Rotates or flips the image" },
  126.     { NULL, NULL, NULL } /* Do not remove this line */
  127. };
  128. /*****************************************************************************
  129.  * Constructor.
  130.  *****************************************************************************/
  131. ExtraPanel::ExtraPanel( intf_thread_t *_p_intf, wxWindow *_p_parent ):
  132.         wxPanel( _p_parent , -1, wxDefaultPosition, wxDefaultSize )
  133. {
  134.     p_intf = _p_intf;
  135.     p_parent = _p_parent;
  136.     SetAutoLayout( TRUE );
  137.     wxBoxSizer *extra_sizer = new wxBoxSizer( wxHORIZONTAL );
  138.     notebook = new wxNotebook( this, Notebook_Event );
  139.     wxNotebookSizer *notebook_sizer = new wxNotebookSizer( notebook );
  140.     notebook->AddPage( VideoPanel( notebook ), wxU(_("Video")) );
  141.     notebook->AddPage( EqzPanel( notebook ), wxU(_("Equalizer")) );
  142.     notebook->AddPage( AudioPanel( notebook ), wxU(_("Audio")) );
  143.     extra_sizer->Add( notebook_sizer, 1, wxEXPAND, 0 );
  144.     SetSizerAndFit( extra_sizer );
  145.     extra_sizer->Layout();
  146. }
  147. ExtraPanel::~ExtraPanel()
  148. {
  149. }
  150. /* Video Panel constructor */
  151. wxPanel *ExtraPanel::VideoPanel( wxWindow *parent )
  152. {
  153.     char *psz_filters;
  154.     wxPanel *panel = new wxPanel( parent, -1 );
  155.     wxBoxSizer *panel_sizer = new wxBoxSizer( wxHORIZONTAL );
  156.     /* Create static box to surround the adjust controls */
  157.     wxStaticBox *adjust_box =
  158.            new wxStaticBox( panel, -1, wxU(_("Adjust Image")) );
  159.     wxStaticBoxSizer *adjust_sizer =
  160.         new wxStaticBoxSizer( adjust_box, wxVERTICAL );
  161.     adjust_sizer->SetMinSize( -1, 50 );
  162.     /* Create flex grid */
  163.     wxFlexGridSizer *adjust_gridsizer =
  164.         new wxFlexGridSizer( 6, 2, 0, 0);
  165.     adjust_gridsizer->AddGrowableCol(1);
  166.     /* Create the adjust button */
  167.     wxCheckBox * adjust_check = new wxCheckBox( panel, Adjust_Event,
  168.                                                  wxU(_("Enable")));
  169.     /* Create the restore to defaults button */
  170.     restoredefaults_button =
  171.         new wxButton( panel, RestoreDefaults_Event,
  172.         wxU(_("Restore Defaults")), wxDefaultPosition);
  173.     wxStaticText *hue_text = new wxStaticText( panel, -1,
  174.                                        wxU(_("Hue")) );
  175.     hue_slider = new wxSlider ( panel, Hue_Event, 0, 0,
  176.                                 360, wxDefaultPosition, wxDefaultSize );
  177.     wxStaticText *contrast_text = new wxStaticText( panel, -1,
  178.                                        wxU(_("Contrast")) );
  179.     contrast_slider = new wxSlider ( panel, Contrast_Event, 0, 0,
  180.                                 200, wxDefaultPosition, wxDefaultSize);
  181.     wxStaticText *brightness_text = new wxStaticText( panel, -1,
  182.                                        wxU(_("Brightness")) );
  183.     brightness_slider = new wxSlider ( panel, Brightness_Event, 0, 0,
  184.                            200, wxDefaultPosition, wxDefaultSize) ;
  185.     wxStaticText *saturation_text = new wxStaticText( panel, -1,
  186.                                           wxU(_("Saturation")) );
  187.     saturation_slider = new wxSlider ( panel, Saturation_Event, 0, 0,
  188.                            300, wxDefaultPosition, wxDefaultSize );
  189.     wxStaticText *gamma_text = new wxStaticText( panel, -1,
  190.                                           wxU(_("Gamma")) );
  191.     gamma_slider = new wxSlider ( panel, Gamma_Event, 0, 0,
  192.                            100, wxDefaultPosition, wxDefaultSize );
  193.     adjust_gridsizer->Add( adjust_check, 1, wxEXPAND|wxALL, 2 );
  194.     adjust_gridsizer->Add( restoredefaults_button, 1, wxEXPAND|wxALL, 2 );
  195.     adjust_gridsizer->Add( hue_text, 1, wxEXPAND|wxALL, 2 );
  196.     adjust_gridsizer->Add( hue_slider, 1, wxEXPAND|wxALL, 2 );
  197.     adjust_gridsizer->Add( contrast_text, 1, wxEXPAND|wxALL, 2 );
  198.     adjust_gridsizer->Add( contrast_slider, 1, wxEXPAND|wxALL, 2 );
  199.     adjust_gridsizer->Add( brightness_text, 1, wxEXPAND|wxALL, 2 );
  200.     adjust_gridsizer->Add( brightness_slider, 1, wxEXPAND|wxALL, 2 );
  201.     adjust_gridsizer->Add( saturation_text, 1, wxEXPAND|wxALL, 2 );
  202.     adjust_gridsizer->Add( saturation_slider, 1, wxEXPAND|wxALL, 2 );
  203.     adjust_gridsizer->Add( gamma_text, 1, wxEXPAND|wxALL, 2 );
  204.     adjust_gridsizer->Add( gamma_slider, 1, wxEXPAND|wxALL, 2 );
  205.     adjust_sizer->Add( adjust_gridsizer, 1, wxEXPAND|wxALL, 2);
  206.     panel_sizer->Add( adjust_sizer , 1, wxTOP, 2 );
  207. #if 0
  208.     /* Create sizer to surround the other controls */
  209.     wxBoxSizer *other_sizer = new wxBoxSizer( wxVERTICAL );
  210.     wxStaticBox *video_box =
  211.             new wxStaticBox( panel, -1, wxU(_("Video Options")) );
  212.     /* Create the sizer for the frame */
  213.     wxStaticBoxSizer *video_sizer =
  214.        new wxStaticBoxSizer( video_box, wxVERTICAL );
  215.     video_sizer->SetMinSize( -1, 50 );
  216.     static const wxString ratio_array[] =
  217.     {
  218.         wxT("4:3"),
  219.         wxT("16:9"),
  220.     };
  221.     wxBoxSizer *ratio_sizer = new wxBoxSizer( wxHORIZONTAL );
  222.     wxStaticText *ratio_text = new wxStaticText( panel, -1,
  223.                                           wxU(_("Aspect Ratio")) );
  224.     ratio_combo = new wxComboBox( panel, Ratio_Event, wxT(""),
  225.                                   wxDefaultPosition, wxSize( 80 , -1),
  226.                                   WXSIZEOF(ratio_array), ratio_array,
  227.                                   0 );
  228.     ratio_sizer->Add( ratio_text, 0, wxALL, 2 );
  229.     ratio_sizer->Add( ratio_combo, 0, wxALL, 2 );
  230.     ratio_sizer->Layout();
  231.     video_sizer->Add( ratio_sizer  , 0 , wxALL , 2 );
  232.     video_sizer->Layout();
  233. #endif
  234.     wxStaticBox *filter_box =
  235.                   new wxStaticBox( panel, -1, wxU(_("Video Filters")) );
  236.     wxStaticBoxSizer *filter_sizer =
  237.                    new wxStaticBoxSizer( filter_box, wxHORIZONTAL );
  238.     wxBoxSizer *t_col_sizer = new wxBoxSizer( wxVERTICAL );
  239.     for( int i = 0 ; vfilters[i].psz_filter != NULL ; i++ )
  240.     {
  241.         wxCheckBox *box = new wxCheckBox( panel, Filter0_Event + i,
  242.                                           wxU( _( vfilters[i].psz_name ) ) );
  243.         t_col_sizer->Add( box, 0, wxALL, 4 );
  244.         box->SetToolTip( wxU( _( vfilters[i].psz_help ) ) );
  245.     }
  246.     filter_sizer->Add( t_col_sizer );
  247.     filter_sizer->Add( new wxButton( panel, FiltersInfo_Event,
  248.                             wxU(_("More info" ) ) ), 0, wxALL, 4 );
  249. #if 0
  250.     other_sizer->Add( video_sizer, 0, wxALL | wxEXPAND , 0);
  251.     other_sizer->Add( filter_sizer, 0, wxALL | wxEXPAND , 0);
  252.     other_sizer->Layout();
  253.     panel_sizer->Add(other_sizer , 1 );
  254. #endif
  255.     panel_sizer->Add( filter_sizer, 1, wxTOP|wxLEFT, 2 );
  256.     panel->SetSizerAndFit( panel_sizer );
  257.     /* Layout the whole panel */
  258.     panel_sizer->Layout();
  259.     panel_sizer->SetSizeHints( panel );
  260.     /* Write down initial values */
  261.     psz_filters = config_GetPsz( p_intf, "filter" );
  262.     if( psz_filters && strstr( psz_filters, "adjust" ) )
  263.     {
  264.         adjust_check->SetValue( 1 );
  265.         restoredefaults_button->Enable();
  266.         saturation_slider->Enable();
  267.         contrast_slider->Enable();
  268.         brightness_slider->Enable();
  269.         hue_slider->Enable();
  270.         gamma_slider->Enable();
  271.     }
  272.     else
  273.     {
  274.         adjust_check->SetValue( 0 );
  275.         restoredefaults_button->Disable();
  276.         saturation_slider->Disable();
  277.         contrast_slider->Disable();
  278.         brightness_slider->Disable();
  279.         hue_slider->Disable();
  280.         gamma_slider->Disable();
  281.     }
  282.     if( psz_filters ) free( psz_filters );
  283.     int i_value = config_GetInt( p_intf, "hue" );
  284.     if( i_value > 0 && i_value < 360 )
  285.         hue_slider->SetValue( i_value );
  286.     float f_value;
  287.     f_value = config_GetFloat( p_intf, "saturation" );
  288.     if( f_value > 0 && f_value < 5 )
  289.         saturation_slider->SetValue( (int)(100 * f_value) );
  290.     f_value = config_GetFloat( p_intf, "contrast" );
  291.     if( f_value > 0 && f_value < 4 )
  292.         contrast_slider->SetValue( (int)(100 * f_value) );
  293.     f_value = config_GetFloat( p_intf, "brightness" );
  294.     if( f_value > 0 && f_value < 2 )
  295.         brightness_slider->SetValue( (int)(100 * f_value) );
  296.     f_value = config_GetFloat( p_intf, "gamma" );
  297.     if( f_value > 0 && f_value < 10 )
  298.         gamma_slider->SetValue( (int)(10 * f_value) );
  299.     return panel;
  300. }
  301. /* Audio panel constructor */
  302. wxPanel *ExtraPanel::AudioPanel( wxWindow *parent )
  303. {
  304.     char *psz_filters;
  305.     wxPanel *panel = new wxPanel( parent, -1 );
  306.     wxBoxSizer *panel_sizer = new wxBoxSizer( wxHORIZONTAL );
  307.     /* Create static box to surround the adjust controls */
  308.     wxStaticBox *filter_box =
  309.            new wxStaticBox( panel, -1, wxU(_("Audio filters")) );
  310.     wxStaticBoxSizer *filter_sizer =
  311.         new wxStaticBoxSizer( filter_box, wxVERTICAL );
  312.     filter_sizer->SetMinSize( -1, 50 );
  313.     wxCheckBox * headphone_check = new wxCheckBox( panel, HeadPhone_Event,
  314.                                     wxU(_("Headphone virtualization")));
  315.     headphone_check->SetToolTip( wxU(_("This filter gives the feeling of a "
  316.              "5.1 speaker set when using a headphone." ) ) );
  317.     wxCheckBox * normvol_check = new wxCheckBox( panel, NormVol_Event,
  318.                                     wxU(_("Volume normalization")));
  319.     normvol_check->SetToolTip( wxU(_("This filter prevents the audio output "
  320.                          "power from going over a defined value." ) ) );
  321.     wxStaticText *normvol_label = new wxStaticText( panel, -1,
  322.                                    wxU( _("Maximum level") ) );
  323.     wxSlider *normvol_slider = new wxSlider ( panel, NVSlider_Event, 20, 5,
  324.                            100, wxDefaultPosition, wxSize( 100, -1 ) );
  325.     filter_sizer->Add( headphone_check, 0, wxALL, 4 );
  326.     filter_sizer->Add( normvol_check, 0, wxALL, 4 );
  327.     filter_sizer->Add( normvol_label, 0, wxALL, 4 );
  328.     filter_sizer->Add( normvol_slider, 0, wxALL, 4 );
  329.     panel_sizer->Add( filter_sizer, 1, wxTOP, 2 );
  330.     panel->SetSizerAndFit( panel_sizer );
  331.     panel_sizer->Layout();
  332.     panel_sizer->SetSizeHints( panel );
  333.     /* Write down initial values */
  334.     psz_filters = config_GetPsz( p_intf, "audio-filter" );
  335.     if( psz_filters )
  336.     {
  337.         headphone_check->SetValue( strstr( psz_filters, "headphone" ) );
  338.         normvol_check->SetValue( strstr( psz_filters, "normvol" ) );
  339.         free( psz_filters );
  340.     }
  341.     else
  342.     {
  343.         headphone_check->SetValue( 0 );
  344.         normvol_check->SetValue( 0 );
  345.     }
  346.     return panel;
  347. }
  348. static const wxString band_frequencies[] =
  349. {
  350.     wxT(" 60 Hz"),
  351.     wxT("170 Hz"),
  352.     wxT("310 Hz"),
  353.     wxT("600 Hz"),
  354.     wxT(" 1 kHz"),
  355.     wxT(" 3 kHz"),
  356.     wxT(" 6 kHz"),
  357.     wxT("12 kHz"),
  358.     wxT("14 kHz"),
  359.     wxT("16 kHz")
  360. };
  361. /* Equalizer Panel constructor */
  362. wxPanel *ExtraPanel::EqzPanel( wxWindow *parent )
  363. {
  364.     wxPanel *panel = new wxPanel( parent, -1 );
  365.     wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );
  366.     /* Create static box to surround the adjust controls */
  367.     wxBoxSizer *top_sizer =
  368.         new wxBoxSizer( wxHORIZONTAL );
  369.     /* Create the enable button */
  370.     eq_chkbox =  new wxCheckBox( panel, EqEnable_Event,
  371.                             wxU(_("Enable") ) );
  372.     eq_chkbox->SetToolTip( wxU(_("Enable the equalizer. You can either "
  373.     "manually change the bands or use a preset (Audio Menu->Equalizer)." ) ) );
  374.     top_sizer->Add( eq_chkbox, 0, wxALL, 2 );
  375.     eq_2p_chkbox =  new wxCheckBox( panel, Eq2Pass_Event,
  376.                             wxU(_("2 Pass") ) );
  377.     eq_2p_chkbox->SetToolTip( wxU(_("If you enable this settting, the "
  378.      "equalizer filter will be applied twice. The effect will be sharper.") ) );
  379.     top_sizer->Add( eq_2p_chkbox, 0, wxALL, 2 );
  380.     top_sizer->Add( 0, 0, 1, wxALL, 2 );
  381.     top_sizer->Add( new wxButton( panel, EqRestore_Event,
  382.                                   wxU( _("Restore Defaults") ) ),
  383.     0, wxALL, 2 );
  384.     top_sizer->Add( 0, 0, 1, wxALL, 2 );
  385.     wxStaticText *smooth_text = new wxStaticText( panel, -1, wxU( "Smooth :" ));
  386.     smooth_text->SetToolTip( wxU( SMOOTH_TIP ) );
  387.     top_sizer->Add( smooth_text, 0, wxALL, 2 );
  388.     smooth_slider =new wxSlider( panel, Smooth_Event, 0, 0, 10 ,
  389.                     wxDefaultPosition, wxSize( 100, -1 ) );
  390.     smooth_slider->SetToolTip( wxU( SMOOTH_TIP ) );
  391.     top_sizer->Add( smooth_slider, 0, wxALL, 2 );
  392.     i_smooth = 0;
  393.     /* Create flex grid */
  394.     wxFlexGridSizer *eq_gridsizer =
  395.         new wxFlexGridSizer( 2, 12, 0, 0);
  396.     eq_gridsizer->AddGrowableRow( 0 );
  397.     eq_gridsizer->AddGrowableCol( 1 );
  398.     preamp_slider = new wxSlider( panel, Preamp_Event, 80, 0, 400,
  399.                     wxDefaultPosition, wxSize( -1 , 90 ) , wxSL_VERTICAL );
  400.     eq_gridsizer->Add( preamp_slider, 1, wxEXPAND|wxALL, 2 );
  401.     eq_gridsizer->Add( 0, 0, 1, wxALL, 2 );
  402.     for( int i = 0 ; i < 10 ; i++ )
  403.     {
  404.         band_sliders[i] = new wxSlider( panel, Band0_Event + i, 200, 0, 400,
  405.                     wxDefaultPosition, wxSize( -1 , 90 ) , wxSL_VERTICAL );
  406.         i_values[i] = 200;
  407.         eq_gridsizer->Add( band_sliders[i], 1, wxEXPAND|wxALL, 2 );
  408.     }
  409.     preamp_text = new wxStaticText( panel, -1, wxT( "Preampn12.0dB" ) );
  410.     wxFont font= preamp_text->GetFont();
  411.     font.SetPointSize(7);
  412.     preamp_text->SetFont( font );
  413.     eq_gridsizer->Add( preamp_text, wxALL, 2 );
  414.     eq_gridsizer->Add( 0, 0, 1 );
  415.     for( int i = 0 ; i < 10 ; i++ )
  416.     {
  417.         band_texts[i] = new wxStaticText( panel, -1,
  418.                                 band_frequencies[i] + wxU("n0.0dB" ) ) ;
  419.         eq_gridsizer->Add( band_texts[i], 1, wxEXPAND|wxALL, 2 );
  420.         wxFont font= band_texts[i]->GetFont();
  421.         font.SetPointSize(7);
  422.         band_texts[i]->SetFont( font );
  423.     }
  424.     panel_sizer->Add( top_sizer , 0 , wxTOP | wxEXPAND, 5 );
  425.     panel_sizer->Add( eq_gridsizer , 0 , wxEXPAND, 0 );
  426.     panel->SetSizer( panel_sizer );
  427.     panel_sizer->Layout();
  428.     panel_sizer->SetSizeHints( panel );
  429.     CheckAout();
  430.     return panel;
  431. }
  432. /*******************************************************
  433.  * Event handlers
  434.  *******************************************************/
  435. /* Keep aout up to date and update the bands if needed */
  436. void ExtraPanel::OnIdle( wxIdleEvent &event )
  437. {
  438.     CheckAout();
  439.     if( b_update == VLC_TRUE )
  440.     {
  441.         if( b_my_update == VLC_TRUE )
  442.         {
  443.             b_update = b_my_update = VLC_FALSE;
  444.             return;
  445.         }
  446.         char *p = psz_bands;
  447.         for( int i = 0; i < 10; i++ )
  448.         {
  449.                 float f;
  450.                 char psz_val[5];
  451.                 int i_val;
  452.                 /* Read dB -20/20*/
  453.                 f = strtof( p, &p );
  454.                 i_val= (int)( ( f + 20 ) * 10 );
  455.                 band_sliders[i]->SetValue( 400 - i_val );
  456.                 i_values[i] = 400 - i_val;
  457.                 sprintf( psz_val, "%.1f", f );
  458.                 band_texts[i]->SetLabel( band_frequencies[i] + wxT("n") +
  459.                                                 wxU( psz_val ) + wxT("dB") );
  460.                 if( p == NULL )
  461.                 {
  462.                     break;
  463.                 }
  464.                 p++;
  465.                 if( *p == 0 )
  466.                     break;
  467.         }
  468.         char psz_val[5];
  469.         int i_val = (int)( ( f_preamp + 20 ) * 10 );
  470.         sprintf( psz_val, "%.1f", f_preamp );
  471.         preamp_slider->SetValue( 400 - i_val );
  472.         const wxString preamp = wxT("Preampn");
  473.         preamp_text->SetLabel( preamp + wxU( psz_val ) + wxT( "dB" ) );
  474.         eq_chkbox->SetValue( TRUE );
  475.         b_update = VLC_FALSE;
  476.     }
  477. }
  478. /*************************
  479.  *  Equalizer Panel events
  480.  *************************/
  481. void ExtraPanel::OnEnableEqualizer( wxCommandEvent &event )
  482. {
  483.     aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
  484.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE);
  485.     ChangeFiltersString( p_intf,p_aout, "equalizer",
  486.                          event.IsChecked() ? VLC_TRUE : VLC_FALSE );
  487.     if( p_aout != NULL )
  488.         vlc_object_release( p_aout );
  489. }
  490. void ExtraPanel::OnEqRestore( wxCommandEvent &event )
  491. {
  492.     aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
  493.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE);
  494.     if( p_aout == NULL )
  495.     {
  496.         vlc_value_t val;
  497.         vlc_bool_t b_previous = eq_chkbox->IsChecked();
  498.         val.f_float = 12.0;
  499.         IntfPreampCallback( NULL, NULL, val,val, this );
  500.         config_PutFloat( p_intf, "equalizer-preamp", 12.0 );
  501.         val.psz_string = strdup( "0 0 0 0 0 0 0 0 0 0" );
  502.         IntfBandsCallback( NULL, NULL, val,val, this );
  503.         config_PutPsz( p_intf, "equalizer-bands",
  504.                                 "0 0 0 0 0 0 0 0 0 0");
  505.         config_PutPsz( p_intf, "equalizer-preset","flat" );
  506.         eq_chkbox->SetValue( b_previous );
  507.     }
  508.     else
  509.     {
  510.         var_SetFloat( p_aout, "equalizer-preamp", 12.0 );
  511.         config_PutFloat( p_intf, "equalizer-preamp", 12.0 );
  512.         var_SetString( p_aout, "equalizer-bands",
  513.                                 "0 0 0 0 0 0 0 0 0 0");
  514.         config_PutPsz( p_intf, "equalizer-bands",
  515.                                 "0 0 0 0 0 0 0 0 0 0");
  516.         var_SetString( p_aout , "equalizer-preset" , "flat" );
  517.         config_PutPsz( p_intf, "equalizer-preset","flat" );
  518.         vlc_object_release( p_aout );
  519.     }
  520. }
  521. void ExtraPanel::OnEq2Pass( wxCommandEvent &event )
  522. {
  523.     aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
  524.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE);
  525.     vlc_bool_t b_2p = event.IsChecked() ? VLC_TRUE : VLC_FALSE;
  526.     if( p_aout == NULL )
  527.     {
  528.         config_PutInt( p_intf, "equalizer-2pass", b_2p );
  529.     }
  530.     else
  531.     {
  532.         var_SetBool( p_aout, "equalizer-2pass", b_2p );
  533.         config_PutInt( p_intf, "equalizer-2pass", b_2p );
  534.         if( eq_chkbox->IsChecked() )
  535.         {
  536.             for( int i = 0; i < p_aout->i_nb_inputs; i++ )
  537.             {
  538.                 p_aout->pp_inputs[i]->b_restart = VLC_TRUE;
  539.             }
  540.         }
  541.         vlc_object_release( p_aout );
  542.     }
  543. }
  544. void ExtraPanel::OnEqSmooth( wxScrollEvent &event )
  545. {
  546.     /* Max smoothing : 70% */
  547.     i_smooth = event.GetPosition() * 7;
  548. }
  549. void ExtraPanel::OnPreamp( wxScrollEvent &event )
  550. {
  551.     float f= (float)( 400 - event.GetPosition() ) / 10 - 20 ;
  552.     char psz_val[5];
  553.     aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
  554.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE);
  555.     sprintf( psz_val, "%.1f", f );
  556.     const wxString preamp = wxT("Preampn");
  557.     preamp_text->SetLabel( preamp + wxU( psz_val ) + wxT( "dB" ) );
  558.     if( p_aout == NULL )
  559.     {
  560.         config_PutFloat( p_intf, "equalizer-preamp", f );
  561.     }
  562.     else
  563.     {
  564.         var_SetFloat( p_aout, "equalizer-preamp", f );
  565.         config_PutFloat( p_intf, "equalizer-preamp", f );
  566.         b_my_update = VLC_TRUE;
  567.         vlc_object_release( p_aout );
  568.     }
  569. }
  570. void ExtraPanel::OnChangeEqualizer( wxScrollEvent &event )
  571. {
  572.     aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
  573.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE);
  574.     char psz_values[102];
  575.     memset( psz_values, 0, 102 );
  576.     /* Smoothing */
  577.     int i_diff = event.GetPosition() - i_values[  event.GetId() - Band0_Event ];
  578.     i_values[ event.GetId() - Band0_Event] = event.GetPosition();
  579.     for( int i = event.GetId() + 1 ; i <= Band9_Event ; i++ )
  580.     {
  581.         int i_new = band_sliders[ i-Band0_Event ]->GetValue() +
  582.            (int)( i_diff * pow( (float)i_smooth / 100 , i- event.GetId() ) ) ;
  583.         if( i_new < 0 ) i_new = 0;
  584.         if( i_new > 400 ) i_new = 400;
  585.         band_sliders[ i-Band0_Event ]->SetValue( i_new );
  586.     }
  587.     for( int i = Band0_Event ; i < event.GetId() ; i++ )
  588.     {
  589.         int i_new =   band_sliders[ i-Band0_Event ]->GetValue() +
  590.            (int)( i_diff * pow( (float)i_smooth / 100 , event.GetId() - i  ) );
  591.         if( i_new < 0 ) i_new = 0;
  592.         if( i_new > 400 ) i_new = 400;
  593.         band_sliders[ i-Band0_Event ]->SetValue( i_new );
  594.     }
  595.     /* Write the new bands values */
  596.     for( int i = 0 ; i < 10 ; i++ )
  597.     {
  598.         char psz_val[5];
  599.         float f_val = (float)( 400 - band_sliders[i]->GetValue() ) / 10- 20 ;
  600.         sprintf( psz_values, "%s %f", psz_values, f_val );
  601.         sprintf( psz_val, "%.1f", f_val );
  602.         band_texts[i]->SetLabel( band_frequencies[i] + wxT("n") +
  603.                         wxU( psz_val ) + wxT("dB" ) );
  604.     }
  605.     if( p_aout == NULL )
  606.     {
  607.         config_PutPsz( p_intf, "equalizer-bands", psz_values );
  608.     }
  609.     else
  610.     {
  611.         var_SetString( p_aout, "equalizer-bands", psz_values );
  612.         config_PutPsz( p_intf, "equalizer-bands", psz_values );
  613.         b_my_update = VLC_TRUE;
  614.         vlc_object_release( p_aout );
  615.     }
  616. }
  617. /***********************
  618.  * Audio Panel events
  619.  ***********************/
  620. void ExtraPanel::OnHeadphone( wxCommandEvent &event )
  621. {
  622.     aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
  623.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE);
  624.     ChangeFiltersString( p_intf , p_aout, "headphone",
  625.                          event.IsChecked() ? VLC_TRUE : VLC_FALSE );
  626.     if( p_aout != NULL )
  627.         vlc_object_release( p_aout );
  628. }
  629. void ExtraPanel::OnNormvol( wxCommandEvent &event )
  630. {
  631.     aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
  632.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE);
  633.     ChangeFiltersString( p_intf , p_aout, "normvol",
  634.                          event.IsChecked() ? VLC_TRUE : VLC_FALSE );
  635.     if( p_aout != NULL )
  636.         vlc_object_release( p_aout );
  637. }
  638. void ExtraPanel::OnNormvolSlider( wxScrollEvent &event )
  639. {
  640.     aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
  641.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE);
  642.     if( p_aout != NULL )
  643.     {
  644.         var_SetFloat( p_aout, "norm-max-level", (float)event.GetPosition()/10 );
  645.         vlc_object_release( p_aout );
  646.     }
  647.     else
  648.     {
  649.         config_PutFloat( p_intf, "norm-max-level",
  650.                         (float)event.GetPosition()/10 );
  651.     }
  652. }
  653. /***********************
  654.  *  Video Panel events
  655.  ***********************/
  656. void ExtraPanel::OnEnableAdjust(wxCommandEvent& event)
  657. {
  658.     ChangeVFiltersString( p_intf,  "adjust",
  659.                           event.IsChecked() ? VLC_TRUE : VLC_FALSE );
  660.     if( event.IsChecked() )
  661.     {
  662.         restoredefaults_button->Enable();
  663.         brightness_slider->Enable();
  664.         saturation_slider->Enable();
  665.         contrast_slider->Enable();
  666.         hue_slider->Enable();
  667.         gamma_slider->Enable();
  668.     }
  669.     else
  670.     {
  671.         restoredefaults_button->Disable();
  672.         brightness_slider->Disable();
  673.         saturation_slider->Disable();
  674.         contrast_slider->Disable();
  675.         hue_slider->Disable();
  676.         gamma_slider->Disable();
  677.     }
  678. }
  679. void ExtraPanel::OnRestoreDefaults( wxCommandEvent &event)
  680. {
  681.     hue_slider->SetValue(0);
  682.     saturation_slider->SetValue(100);
  683.     brightness_slider->SetValue(100);
  684.     contrast_slider->SetValue(100),
  685.     gamma_slider->SetValue(10);
  686.     wxScrollEvent *hscroll_event = new wxScrollEvent(0, Hue_Event, 0);
  687.     OnAdjustUpdate(*hscroll_event);
  688.     wxScrollEvent *sscroll_event = new wxScrollEvent(0, Saturation_Event, 100);
  689.     OnAdjustUpdate(*sscroll_event);
  690.     wxScrollEvent *bscroll_event = new wxScrollEvent(0, Brightness_Event, 100);
  691.     OnAdjustUpdate(*bscroll_event);
  692.     wxScrollEvent *cscroll_event = new wxScrollEvent(0, Contrast_Event, 100);
  693.     OnAdjustUpdate(*cscroll_event);
  694.     wxScrollEvent *gscroll_event = new wxScrollEvent(0, Gamma_Event, 10);
  695.     OnAdjustUpdate(*gscroll_event);
  696. }
  697. void ExtraPanel::OnAdjustUpdate( wxScrollEvent &event)
  698. {
  699.     vout_thread_t *p_vout = (vout_thread_t *)vlc_object_find(p_intf,
  700.                                  VLC_OBJECT_VOUT, FIND_ANYWHERE);
  701.     if( p_vout == NULL )
  702.     {
  703.         switch( event.GetId() )
  704.         {
  705.             case Hue_Event:
  706.                 config_PutInt( p_intf , "hue" , event.GetPosition() );
  707.                 break;
  708.             case Saturation_Event:
  709.                 config_PutFloat( p_intf , "saturation" ,
  710.                                 (float)event.GetPosition()/100 );
  711.                 break;
  712.             case Brightness_Event:
  713.                 config_PutFloat( p_intf , "brightness" ,
  714.                                 (float)event.GetPosition()/100 );
  715.                 break;
  716.             case Contrast_Event:
  717.                 config_PutFloat( p_intf , "contrast" ,
  718.                                 (float)event.GetPosition()/100 );
  719.                 break;
  720.             case Gamma_Event:
  721.                 config_PutFloat( p_intf , "gamma" ,
  722.                                 (float)event.GetPosition()/10 );
  723.                 break;
  724.         }
  725.     }
  726.     else
  727.     {
  728.         vlc_value_t val;
  729.         switch( event.GetId() )
  730.         {
  731.             case Hue_Event:
  732.                 val.i_int = event.GetPosition();
  733.                 var_Set( p_vout, "hue", val );
  734.                 config_PutInt( p_intf , "hue" , event.GetPosition() );
  735.                 break;
  736.             case Saturation_Event:
  737.                 val.f_float = (float)event.GetPosition() / 100;
  738.                 var_Set( p_vout, "saturation", val );
  739.                 config_PutFloat( p_intf , "saturation" ,
  740.                                 (float)event.GetPosition()/100 );
  741.                 break;
  742.             case Brightness_Event:
  743.                 val.f_float = (float)event.GetPosition() / 100;
  744.                 var_Set( p_vout, "brightness", val );
  745.                 config_PutFloat( p_intf , "brightness" ,
  746.                                 (float)event.GetPosition()/100 );
  747.                 break;
  748.             case Contrast_Event:
  749.                 val.f_float = (float)event.GetPosition() / 100;
  750.                 var_Set( p_vout, "contrast", val );
  751.                 config_PutFloat( p_intf , "contrast" ,
  752.                                 (float)event.GetPosition()/100 );
  753.                 break;
  754.             case Gamma_Event:
  755.                 val.f_float = (float)event.GetPosition() / 10;
  756.                 var_Set( p_vout, "gamma", val );
  757.                 config_PutFloat( p_intf , "gamma" ,
  758.                                 (float)event.GetPosition()/10 );
  759.                 break;
  760.         }
  761.         vlc_object_release(p_vout);
  762.     }
  763. }
  764. /* FIXME */
  765. void ExtraPanel::OnRatio( wxCommandEvent& event )
  766. {
  767.    config_PutPsz( p_intf, "aspect-ratio", ratio_combo->GetValue().mb_str() );
  768. }
  769. void ExtraPanel::OnSelectFilter(wxCommandEvent& event)
  770. {
  771.     int i_filter = event.GetId() - Filter0_Event ;
  772.     if( vfilters[i_filter].psz_filter  )
  773.     {
  774.         ChangeVFiltersString( p_intf, vfilters[i_filter].psz_filter ,
  775.                               event.IsChecked() ? VLC_TRUE : VLC_FALSE );
  776.     }
  777. }
  778. void ExtraPanel::OnFiltersInfo(wxCommandEvent& event)
  779. {
  780.     wxMessageBox( wxU( _("Select the video effects filters to apply. "
  781.                   "You must restart the stream for these settings to "
  782.                   "take effect.n"
  783.                   "To configure the filters, go to the Preferences, "
  784.                   "and go to Modules/Video Filters. "
  785.                   "You can then configure each filter.n"
  786.                   "If you want fine control over the filters ( to choose "
  787.                   "the order in which they are applied ), you need to enter "
  788.                   "manually a filters string (Preferences / General / Video)."
  789.                   ) ),
  790.                     wxU( _("More information" ) ), wxOK | wxICON_INFORMATION,
  791.                     this->p_parent );
  792. }
  793. /**********************************
  794.  * Other functions
  795.  **********************************/
  796. void ExtraPanel::CheckAout()
  797. {
  798.     aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
  799.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE);
  800.     if( p_aout != NULL )
  801.     {
  802.         if( p_aout != p_intf->p_sys->p_aout )
  803.         {
  804.             /* We want to know if someone changes the bands */
  805.             if( var_AddCallback( p_aout, "equalizer-bands",
  806.                                     IntfBandsCallback, this ) )
  807.             {
  808.                 /* The variable does not exist yet, wait */
  809.                 vlc_object_release( p_aout );
  810.                 return;
  811.             }
  812.             if( var_AddCallback( p_aout, "equalizer-preamp",
  813.                                     IntfPreampCallback, this )  )
  814.             {
  815.                 vlc_object_release( p_aout );
  816.                 return;
  817.             }
  818.             /* Ok, we have our variables, make a first update round */
  819.             p_intf->p_sys->p_aout = p_aout;
  820.             f_preamp = var_GetFloat( p_aout, "equalizer-preamp" );
  821.             psz_bands = var_GetString( p_aout, "equalizer-bands" );
  822.             b_update = VLC_TRUE;
  823.         }
  824.         vlc_object_release( p_aout );
  825.     }
  826. }
  827. static void ChangeVFiltersString( intf_thread_t *p_intf,
  828.                                  char *psz_name, vlc_bool_t b_add )
  829. {
  830.     vout_thread_t *p_vout;
  831.     char *psz_parser, *psz_string;
  832.     psz_string = config_GetPsz( p_intf, "filter" );
  833.     if( !psz_string ) psz_string = strdup("");
  834.     psz_parser = strstr( psz_string, psz_name );
  835.     if( b_add )
  836.     {
  837.         if( !psz_parser )
  838.         {
  839.             psz_parser = psz_string;
  840.             asprintf( &psz_string, (*psz_string) ? "%s:%s" : "%s%s",
  841.                             psz_string, psz_name );
  842.             free( psz_parser );
  843.         }
  844.         else
  845.         {
  846.             return;
  847.         }
  848.     }
  849.     else
  850.     {
  851.         if( psz_parser )
  852.         {
  853.             memmove( psz_parser, psz_parser + strlen(psz_name) +
  854.                             (*(psz_parser + strlen(psz_name)) == ':' ? 1 : 0 ),
  855.                             strlen(psz_parser + strlen(psz_name)) + 1 );
  856.             /* Remove trailing : : */
  857.             if( *(psz_string+strlen(psz_string ) -1 ) == ':' )
  858.             {
  859.                 *(psz_string+strlen(psz_string ) -1 ) = '';
  860.             }
  861.          }
  862.          else
  863.          {
  864.              free( psz_string );
  865.              return;
  866.          }
  867.     }
  868.     /* Vout is not kept, so put that in the config */
  869.     config_PutPsz( p_intf, "filter", psz_string );
  870.     /* Try to set on the fly */
  871.     p_vout = (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
  872.                                               FIND_ANYWHERE );
  873.     if( p_vout )
  874.     {
  875.         var_SetString( p_vout, "filter", psz_string );
  876.         vlc_object_release( p_vout );
  877.     }
  878.     free( psz_string );
  879. }
  880. static void ChangeFiltersString( intf_thread_t *p_intf,
  881.                                  aout_instance_t * p_aout,
  882.                                  char *psz_name, vlc_bool_t b_add )
  883. {
  884.     char *psz_parser, *psz_string;
  885.     if( p_aout )
  886.     {
  887.         psz_string = var_GetString( p_aout, "audio-filter" );
  888.     }
  889.     else
  890.     {
  891.         psz_string = config_GetPsz( p_intf, "audio-filter" );
  892.     }
  893.     if( !psz_string ) psz_string = strdup("");
  894.     psz_parser = strstr( psz_string, psz_name );
  895.     if( b_add )
  896.     {
  897.         if( !psz_parser )
  898.         {
  899.             psz_parser = psz_string;
  900.             asprintf( &psz_string, (*psz_string) ? "%s,%s" : "%s%s",
  901.                             psz_string, psz_name );
  902.             free( psz_parser );
  903.         }
  904.         else
  905.         {
  906.             return;
  907.         }
  908.     }
  909.     else
  910.     {
  911.         if( psz_parser )
  912.         {
  913.             memmove( psz_parser, psz_parser + strlen(psz_name) +
  914.                             (*(psz_parser + strlen(psz_name)) == ',' ? 1 : 0 ),
  915.                             strlen(psz_parser + strlen(psz_name)) + 1 );
  916.             if( *(psz_string+strlen(psz_string ) -1 ) == ',' )
  917.             {
  918.                 *(psz_string+strlen(psz_string ) -1 ) = '';
  919.             }
  920.          }
  921.          else
  922.          {
  923.              free( psz_string );
  924.              return;
  925.          }
  926.     }
  927.     if( p_aout == NULL )
  928.     {
  929.         config_PutPsz( p_intf, "audio-filter", psz_string );
  930.     }
  931.     else
  932.     {
  933.         var_SetString( p_aout, "audio-filter", psz_string );
  934.         for( int i = 0; i < p_aout->i_nb_inputs; i++ )
  935.         {
  936.             p_aout->pp_inputs[i]->b_restart = VLC_TRUE;
  937.         }
  938.     }
  939.     free( psz_string );
  940. }
  941. static int IntfBandsCallback( vlc_object_t *p_this, char const *psz_cmd,
  942.                           vlc_value_t oldval, vlc_value_t newval, void *param )
  943. {
  944.     ExtraPanel *p_panel = (ExtraPanel *)param;
  945.     p_panel->psz_bands = strdup( newval.psz_string );
  946.     p_panel->b_update = VLC_TRUE;
  947.     return VLC_SUCCESS;
  948. }
  949. static int IntfPreampCallback( vlc_object_t *p_this, char const *psz_cmd,
  950.                           vlc_value_t oldval, vlc_value_t newval, void *param )
  951. {
  952.     ExtraPanel *p_panel = (ExtraPanel *)param;
  953.     p_panel->f_preamp = newval.f_float;
  954.     p_panel->b_update = VLC_TRUE;
  955.     return VLC_SUCCESS;
  956. }
  957. #if 0
  958. /**********************************************************************
  959.  * A small window to contain the extrapanel in its undocked state
  960.  **********************************************************************/
  961. BEGIN_EVENT_TABLE(ExtraWindow, wxFrame)
  962. END_EVENT_TABLE()
  963. ExtraWindow::ExtraWindow( intf_thread_t *_p_intf, wxWindow *p_parent,
  964.                           wxPanel *_extra_panel ):
  965.        wxFrame( p_parent, -1, wxU(_("Extended controls")), wxDefaultPosition,
  966.                  wxDefaultSize, wxDEFAULT_FRAME_STYLE )
  967. {
  968.         fprintf(stderr,"Creating extrawindown");
  969.     p_intf = _p_intf;
  970.     SetIcon( *p_intf->p_sys->p_icon );
  971.     wxBoxSizer *window_sizer = new wxBoxSizer( wxVERTICAL );
  972.     SetSizer( window_sizer );
  973. //    panel = new ExtraPanel(  p_intf, this );//_extra_panel;
  974.     panel = _extra_panel;
  975.     window_sizer->Add( panel );
  976.     window_sizer->Layout();
  977.     window_sizer->Fit( this );
  978.     Show();
  979. }
  980. ExtraWindow::~ExtraWindow()
  981. {
  982.     delete panel;
  983. }
  984. #endif