extrapanel.cpp 38.1 KB
Newer Older
1
2
3
4
/*****************************************************************************
 * extrapanel.cpp : wxWindows plugin for vlc
 *****************************************************************************
 * Copyright (C) 2000-2004, 2003 VideoLAN
5
 * $Id$
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 *
 * Authors: Clment Stenac <zorglub@videolan.org>
 *
 * 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.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
 *****************************************************************************/

/*****************************************************************************
 * Preamble
 *****************************************************************************/
#include <vlc/vlc.h>
#include <vlc/aout.h>
#include <aout_internal.h>
#include <vlc/vout.h>
#include <vlc/intf.h>

#include <math.h>

#include "wxwindows.h"

/*****************************************************************************
 * Local class declarations.
 *****************************************************************************/

/* FIXME */
#define SMOOTH_TIP N_( "If this setting is not zero, the bands will move " \
                "together when you move one. The higher the value is, the " \
                "more correlated their movement will be." )

46
47
48
49
50
51
52
static int IntfBandsCallback( vlc_object_t *, char const *,
                              vlc_value_t, vlc_value_t, void * );
static int IntfPreampCallback( vlc_object_t *, char const *,
                               vlc_value_t, vlc_value_t, void * );
static void ChangeFiltersString( intf_thread_t *, aout_instance_t *,
                                 char *, vlc_bool_t );
static void ChangeVFiltersString( intf_thread_t *, char *, vlc_bool_t );
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149


/* IDs for the controls and the menu commands */
enum
{
    Notebook_Event,

    Adjust_Event,
    RestoreDefaults_Event,

    Hue_Event,
    Contrast_Event,
    Brightness_Event,
    Saturation_Event,
    Gamma_Event,
    Ratio_Event,

    FiltersInfo_Event,

    Filter0_Event, Filter1_Event, Filter2_Event, Filter3_Event, Filter4_Event,
    Filter5_Event, Filter6_Event, Filter7_Event, Filter8_Event, Filter9_Event,

    EqEnable_Event,
    Eq2Pass_Event,
    EqRestore_Event,

    Smooth_Event,

    Preamp_Event,

    Band0_Event,Band1_Event,Band2_Event,Band3_Event,Band4_Event,
    Band5_Event,Band6_Event,Band7_Event,Band8_Event,Band9_Event,

    NormVol_Event, NVSlider_Event, HeadPhone_Event
};

BEGIN_EVENT_TABLE( ExtraPanel, wxPanel )
    EVT_IDLE( ExtraPanel::OnIdle )

    /* Equalizer */
    EVT_CHECKBOX( EqEnable_Event, ExtraPanel::OnEnableEqualizer )
    EVT_CHECKBOX( Eq2Pass_Event, ExtraPanel::OnEq2Pass )
    EVT_BUTTON( EqRestore_Event, ExtraPanel::OnEqRestore )

    EVT_COMMAND_SCROLL( Preamp_Event, ExtraPanel::OnPreamp )
    EVT_COMMAND_SCROLL( Smooth_Event, ExtraPanel::OnEqSmooth )

    EVT_COMMAND_SCROLL(Band0_Event, ExtraPanel::OnChangeEqualizer)
    EVT_COMMAND_SCROLL(Band1_Event, ExtraPanel::OnChangeEqualizer)
    EVT_COMMAND_SCROLL(Band2_Event, ExtraPanel::OnChangeEqualizer)
    EVT_COMMAND_SCROLL(Band3_Event, ExtraPanel::OnChangeEqualizer)
    EVT_COMMAND_SCROLL(Band4_Event, ExtraPanel::OnChangeEqualizer)
    EVT_COMMAND_SCROLL(Band5_Event, ExtraPanel::OnChangeEqualizer)
    EVT_COMMAND_SCROLL(Band6_Event, ExtraPanel::OnChangeEqualizer)
    EVT_COMMAND_SCROLL(Band7_Event, ExtraPanel::OnChangeEqualizer)
    EVT_COMMAND_SCROLL(Band8_Event, ExtraPanel::OnChangeEqualizer)
    EVT_COMMAND_SCROLL(Band9_Event, ExtraPanel::OnChangeEqualizer)

    /* Video */
    EVT_CHECKBOX( Adjust_Event, ExtraPanel::OnEnableAdjust )
    EVT_BUTTON( RestoreDefaults_Event, ExtraPanel::OnRestoreDefaults )

    EVT_COMMAND_SCROLL(Hue_Event, ExtraPanel::OnAdjustUpdate)
    EVT_COMMAND_SCROLL(Contrast_Event, ExtraPanel::OnAdjustUpdate)
    EVT_COMMAND_SCROLL(Brightness_Event, ExtraPanel::OnAdjustUpdate)
    EVT_COMMAND_SCROLL(Saturation_Event, ExtraPanel::OnAdjustUpdate)
    EVT_COMMAND_SCROLL(Gamma_Event, ExtraPanel::OnAdjustUpdate)

    EVT_BUTTON( FiltersInfo_Event, ExtraPanel::OnFiltersInfo )

    EVT_CHECKBOX( Filter0_Event, ExtraPanel::OnSelectFilter )
    EVT_CHECKBOX( Filter1_Event, ExtraPanel::OnSelectFilter )
    EVT_CHECKBOX( Filter2_Event, ExtraPanel::OnSelectFilter )
    EVT_CHECKBOX( Filter3_Event, ExtraPanel::OnSelectFilter )
    EVT_CHECKBOX( Filter4_Event, ExtraPanel::OnSelectFilter )
    EVT_CHECKBOX( Filter5_Event, ExtraPanel::OnSelectFilter )
    EVT_CHECKBOX( Filter6_Event, ExtraPanel::OnSelectFilter )
    EVT_CHECKBOX( Filter7_Event, ExtraPanel::OnSelectFilter )
    EVT_CHECKBOX( Filter8_Event, ExtraPanel::OnSelectFilter )
    EVT_CHECKBOX( Filter9_Event, ExtraPanel::OnSelectFilter )

    /* Audio */
    EVT_CHECKBOX( NormVol_Event, ExtraPanel::OnNormvol )
    EVT_CHECKBOX( HeadPhone_Event, ExtraPanel::OnHeadphone )

    EVT_COMMAND_SCROLL( NVSlider_Event, ExtraPanel::OnNormvolSlider )

END_EVENT_TABLE()

struct filter {
    char *psz_filter;
    char *psz_name;
    char *psz_help;
};

static const struct filter vfilters[] =
{
150
    { "clone", "Image clone", "Creates several clones of the image" },
151
152
    { "distort", "Distortion", "Adds distorsion effects" },
    { "invert", "Image inversion" , "Inverts the image colors" },
153
    { "crop", "Image cropping", "Crops the image" },
154
    { "motionblur", "Blurring", "Creates a motion blurring on the image" },
155
156
    { "transform", "Transformation", "Rotates or flips the image" },
    { NULL, NULL, NULL } /* Do not remove this line */
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
};

/*****************************************************************************
 * Constructor.
 *****************************************************************************/
ExtraPanel::ExtraPanel( intf_thread_t *_p_intf, wxWindow *_p_parent ):
        wxPanel( _p_parent , -1, wxDefaultPosition, wxDefaultSize )
{

    p_intf = _p_intf;
    p_parent = _p_parent;
    SetAutoLayout( TRUE );

    wxBoxSizer *extra_sizer = new wxBoxSizer( wxHORIZONTAL );

    notebook = new wxNotebook( this, Notebook_Event );

    wxNotebookSizer *notebook_sizer = new wxNotebookSizer( notebook );

    notebook->AddPage( VideoPanel( notebook ), wxU(_("Video")) );
    notebook->AddPage( EqzPanel( notebook ), wxU(_("Equalizer")) );
    notebook->AddPage( AudioPanel( notebook ), wxU(_("Audio")) );

    extra_sizer->Add( notebook_sizer, 1, wxEXPAND, 0 );

    SetSizerAndFit( extra_sizer );
    extra_sizer->Layout();
}

ExtraPanel::~ExtraPanel()
{
}

/* Video Panel constructor */
wxPanel *ExtraPanel::VideoPanel( wxWindow *parent )
{
    char *psz_filters;

    wxPanel *panel = new wxPanel( parent, -1 );
    wxBoxSizer *panel_sizer = new wxBoxSizer( wxHORIZONTAL );

    /* Create static box to surround the adjust controls */
    wxStaticBox *adjust_box =
           new wxStaticBox( panel, -1, wxU(_("Adjust Image")) );
    wxStaticBoxSizer *adjust_sizer =
        new wxStaticBoxSizer( adjust_box, wxVERTICAL );
    adjust_sizer->SetMinSize( -1, 50 );

    /* Create flex grid */
    wxFlexGridSizer *adjust_gridsizer =
        new wxFlexGridSizer( 6, 2, 0, 0);
    adjust_gridsizer->AddGrowableCol(1);

    /* Create the adjust button */
    wxCheckBox * adjust_check = new wxCheckBox( panel, Adjust_Event,
                                                 wxU(_("Enable")));

    /* Create the restore to defaults button */
    restoredefaults_button =
        new wxButton( panel, RestoreDefaults_Event,
        wxU(_("Restore Defaults")), wxDefaultPosition);

    wxStaticText *hue_text = new wxStaticText( panel, -1,
                                       wxU(_("Hue")) );
    hue_slider = new wxSlider ( panel, Hue_Event, 0, 0,
                                360, wxDefaultPosition, wxDefaultSize );

    wxStaticText *contrast_text = new wxStaticText( panel, -1,
                                       wxU(_("Contrast")) );
    contrast_slider = new wxSlider ( panel, Contrast_Event, 0, 0,
                                200, wxDefaultPosition, wxDefaultSize);

    wxStaticText *brightness_text = new wxStaticText( panel, -1,
                                       wxU(_("Brightness")) );
    brightness_slider = new wxSlider ( panel, Brightness_Event, 0, 0,
                           200, wxDefaultPosition, wxDefaultSize) ;

    wxStaticText *saturation_text = new wxStaticText( panel, -1,
                                          wxU(_("Saturation")) );
    saturation_slider = new wxSlider ( panel, Saturation_Event, 0, 0,
                           300, wxDefaultPosition, wxDefaultSize );

    wxStaticText *gamma_text = new wxStaticText( panel, -1,
                                          wxU(_("Gamma")) );
    gamma_slider = new wxSlider ( panel, Gamma_Event, 0, 0,
                           100, wxDefaultPosition, wxDefaultSize );

244
245
246
247
248
249
250
251
252
253
254
255
    adjust_gridsizer->Add( adjust_check, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( restoredefaults_button, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( hue_text, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( hue_slider, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( contrast_text, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( contrast_slider, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( brightness_text, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( brightness_slider, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( saturation_text, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( saturation_slider, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( gamma_text, 1, wxEXPAND|wxALL, 2 );
    adjust_gridsizer->Add( gamma_slider, 1, wxEXPAND|wxALL, 2 );
256

257
    adjust_sizer->Add( adjust_gridsizer, 1, wxEXPAND|wxALL, 2);
258

259
    panel_sizer->Add( adjust_sizer , 1, wxTOP, 2 );
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286

#if 0
    /* Create sizer to surround the other controls */
    wxBoxSizer *other_sizer = new wxBoxSizer( wxVERTICAL );

    wxStaticBox *video_box =
            new wxStaticBox( panel, -1, wxU(_("Video Options")) );
    /* Create the sizer for the frame */
    wxStaticBoxSizer *video_sizer =
       new wxStaticBoxSizer( video_box, wxVERTICAL );
    video_sizer->SetMinSize( -1, 50 );

    static const wxString ratio_array[] =
    {
        wxT("4:3"),
        wxT("16:9"),
    };

    wxBoxSizer *ratio_sizer = new wxBoxSizer( wxHORIZONTAL );
    wxStaticText *ratio_text = new wxStaticText( panel, -1,
                                          wxU(_("Aspect Ratio")) );

    ratio_combo = new wxComboBox( panel, Ratio_Event, wxT(""),
                                  wxDefaultPosition, wxSize( 80 , -1),
                                  WXSIZEOF(ratio_array), ratio_array,
                                  0 );

287
288
    ratio_sizer->Add( ratio_text, 0, wxALL, 2 );
    ratio_sizer->Add( ratio_combo, 0, wxALL, 2 );
289
290
    ratio_sizer->Layout();

291
    video_sizer->Add( ratio_sizer  , 0 , wxALL , 2 );
292
293
    video_sizer->Layout();
#endif
294

295
296
297
298
299
300
301
302
303
304
305
    wxStaticBox *filter_box =
                  new wxStaticBox( panel, -1, wxU(_("Video Filters")) );
    wxStaticBoxSizer *filter_sizer =
                   new wxStaticBoxSizer( filter_box, wxHORIZONTAL );

    wxBoxSizer *t_col_sizer = new wxBoxSizer( wxVERTICAL );


    for( int i = 0 ; vfilters[i].psz_filter != NULL ; i++ )
    {
        wxCheckBox *box = new wxCheckBox( panel, Filter0_Event + i,
Anil Daoud's avatar
Anil Daoud committed
306
                                          wxU( _( vfilters[i].psz_name ) ) );
307
        t_col_sizer->Add( box, 0, wxALL, 4 );
Anil Daoud's avatar
Anil Daoud committed
308
        box->SetToolTip( wxU( _( vfilters[i].psz_help ) ) );
309
310
311
312
    }

    filter_sizer->Add( t_col_sizer );
    filter_sizer->Add( new wxButton( panel, FiltersInfo_Event,
313
                            wxU(_("More info" ) ) ), 0, wxALL, 4 );
314
315
316
317
318
319
320
#if 0
    other_sizer->Add( video_sizer, 0, wxALL | wxEXPAND , 0);
    other_sizer->Add( filter_sizer, 0, wxALL | wxEXPAND , 0);
    other_sizer->Layout();
    panel_sizer->Add(other_sizer , 1 );
#endif

321
    panel_sizer->Add( filter_sizer, 1, wxTOP|wxLEFT, 2 );
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396

    panel->SetSizerAndFit( panel_sizer );

    /* Layout the whole panel */
    panel_sizer->Layout();

    panel_sizer->SetSizeHints( panel );

    /* Write down initial values */
    psz_filters = config_GetPsz( p_intf, "filter" );
    if( psz_filters && strstr( psz_filters, "adjust" ) )
    {
        adjust_check->SetValue( 1 );
        restoredefaults_button->Enable();
        saturation_slider->Enable();
        contrast_slider->Enable();
        brightness_slider->Enable();
        hue_slider->Enable();
        gamma_slider->Enable();
    }
    else
    {
        adjust_check->SetValue( 0 );
        restoredefaults_button->Disable();
        saturation_slider->Disable();
        contrast_slider->Disable();
        brightness_slider->Disable();
        hue_slider->Disable();
        gamma_slider->Disable();
    }
    if( psz_filters ) free( psz_filters );

    int i_value = config_GetInt( p_intf, "hue" );
    if( i_value > 0 && i_value < 360 )
        hue_slider->SetValue( i_value );
    float f_value;
    f_value = config_GetFloat( p_intf, "saturation" );
    if( f_value > 0 && f_value < 5 )
        saturation_slider->SetValue( (int)(100 * f_value) );
    f_value = config_GetFloat( p_intf, "contrast" );
    if( f_value > 0 && f_value < 4 )
        contrast_slider->SetValue( (int)(100 * f_value) );
    f_value = config_GetFloat( p_intf, "brightness" );
    if( f_value > 0 && f_value < 2 )
        brightness_slider->SetValue( (int)(100 * f_value) );
    f_value = config_GetFloat( p_intf, "gamma" );
    if( f_value > 0 && f_value < 10 )
        gamma_slider->SetValue( (int)(10 * f_value) );

    return panel;
}

/* Audio panel constructor */
wxPanel *ExtraPanel::AudioPanel( wxWindow *parent )
{
    char *psz_filters;

    wxPanel *panel = new wxPanel( parent, -1 );
    wxBoxSizer *panel_sizer = new wxBoxSizer( wxHORIZONTAL );

    /* Create static box to surround the adjust controls */
    wxStaticBox *filter_box =
           new wxStaticBox( panel, -1, wxU(_("Audio filters")) );
    wxStaticBoxSizer *filter_sizer =
        new wxStaticBoxSizer( filter_box, wxVERTICAL );
    filter_sizer->SetMinSize( -1, 50 );

    wxCheckBox * headphone_check = new wxCheckBox( panel, HeadPhone_Event,
                                    wxU(_("Headphone virtualization")));
    headphone_check->SetToolTip( wxU(_("This filter gives the feeling of a "
             "5.1 speaker set when using a headphone." ) ) );

    wxCheckBox * normvol_check = new wxCheckBox( panel, NormVol_Event,
                                    wxU(_("Volume normalization")));
    normvol_check->SetToolTip( wxU(_("This filter prevents the audio output "
Felix Paul Kühne's avatar
Felix Paul Kühne committed
397
                         "power from going over a defined value." ) ) );
398
399
400
401
402
403
404

    wxStaticText *normvol_label = new wxStaticText( panel, -1,
                                   wxU( _("Maximum level") ) );

    wxSlider *normvol_slider = new wxSlider ( panel, NVSlider_Event, 20, 5,
                           100, wxDefaultPosition, wxSize( 100, -1 ) );

405
406
407
408
    filter_sizer->Add( headphone_check, 0, wxALL, 4 );
    filter_sizer->Add( normvol_check, 0, wxALL, 4 );
    filter_sizer->Add( normvol_label, 0, wxALL, 4 );
    filter_sizer->Add( normvol_slider, 0, wxALL, 4 );
409

410
    panel_sizer->Add( filter_sizer, 1, wxTOP, 2 );
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
    panel->SetSizerAndFit( panel_sizer );
    panel_sizer->Layout();
    panel_sizer->SetSizeHints( panel );

    /* Write down initial values */
    psz_filters = config_GetPsz( p_intf, "audio-filter" );
    if( psz_filters )
    {
        headphone_check->SetValue( strstr( psz_filters, "headphone" ) );
        normvol_check->SetValue( strstr( psz_filters, "normvol" ) );
        free( psz_filters );
    }
    else
    {
        headphone_check->SetValue( 0 );
        normvol_check->SetValue( 0 );
    }

    return panel;
}


static const wxString band_frequencies[] =
{
    wxT(" 60 Hz"),
    wxT("170 Hz"),
    wxT("310 Hz"),
    wxT("600 Hz"),
    wxT(" 1 kHz"),
    wxT(" 3 kHz"),
    wxT(" 6 kHz"),
    wxT("12 kHz"),
    wxT("14 kHz"),
    wxT("16 kHz")
};

/* Equalizer Panel constructor */
wxPanel *ExtraPanel::EqzPanel( wxWindow *parent )
{
    wxPanel *panel = new wxPanel( parent, -1 );
    wxBoxSizer *panel_sizer = new wxBoxSizer( wxVERTICAL );

    /* Create static box to surround the adjust controls */
    wxBoxSizer *top_sizer =
        new wxBoxSizer( wxHORIZONTAL );

    /* Create the enable button */
    eq_chkbox =  new wxCheckBox( panel, EqEnable_Event,
                            wxU(_("Enable") ) );
    eq_chkbox->SetToolTip( wxU(_("Enable the equalizer. You can either "
    "manually change the bands or use a preset (Audio Menu->Equalizer)." ) ) );
462
    top_sizer->Add( eq_chkbox, 0, wxALL, 2 );
463
464
465
466
467

    eq_2p_chkbox =  new wxCheckBox( panel, Eq2Pass_Event,
                            wxU(_("2 Pass") ) );

    eq_2p_chkbox->SetToolTip( wxU(_("If you enable this settting, the "
Felix Paul Kühne's avatar
Felix Paul Kühne committed
468
     "equalizer filter will be applied twice. The effect will be sharper.") ) );
469

470
    top_sizer->Add( eq_2p_chkbox, 0, wxALL, 2 );
471

472
    top_sizer->Add( 0, 0, 1, wxALL, 2 );
473
474

    top_sizer->Add( new wxButton( panel, EqRestore_Event,
475
                                  wxU( _("Restore Defaults") ) ),
476
477
		    0, wxALL, 2 );
    top_sizer->Add( 0, 0, 1, wxALL, 2 );
478
479
480

    wxStaticText *smooth_text = new wxStaticText( panel, -1, wxU( "Smooth :" ));
    smooth_text->SetToolTip( wxU( SMOOTH_TIP ) );
481
    top_sizer->Add( smooth_text, 0, wxALL, 2 );
482
483
484
485

    smooth_slider =new wxSlider( panel, Smooth_Event, 0, 0, 10 ,
                    wxDefaultPosition, wxSize( 100, -1 ) );
    smooth_slider->SetToolTip( wxU( SMOOTH_TIP ) );
486
    top_sizer->Add( smooth_slider, 0, wxALL, 2 );
Mark Moriarty's avatar
Mark Moriarty committed
487
488
    i_smooth = 0;
 
489
490
491
492
493
494
495
496
    /* Create flex grid */
    wxFlexGridSizer *eq_gridsizer =
        new wxFlexGridSizer( 2, 12, 0, 0);
    eq_gridsizer->AddGrowableRow( 0 );
    eq_gridsizer->AddGrowableCol( 1 );

    preamp_slider = new wxSlider( panel, Preamp_Event, 200, 0, 400,
                    wxDefaultPosition, wxSize( -1 , 90 ) , wxSL_VERTICAL );
497
    eq_gridsizer->Add( preamp_slider, 1, wxEXPAND|wxALL, 2 );
498

499
    eq_gridsizer->Add( 0, 0, 1, wxALL, 2 );
500
501
502
503
504
505
506

    for( int i = 0 ; i < 10 ; i++ )
    {
        band_sliders[i] = new wxSlider( panel, Band0_Event + i, 200, 0, 400,
                    wxDefaultPosition, wxSize( -1 , 90 ) , wxSL_VERTICAL );

        i_values[i] = 200;
507
        eq_gridsizer->Add( band_sliders[i], 1, wxEXPAND|wxALL, 2 );
508
509
510
511
512
513
    }

    preamp_text = new wxStaticText( panel, -1, wxT( "Preamp\n0.0dB" ) );
    wxFont font= preamp_text->GetFont();
    font.SetPointSize(7);
    preamp_text->SetFont( font );
514
    eq_gridsizer->Add( preamp_text, wxALL, 2 );
515

516
    eq_gridsizer->Add( 0, 0, 1 );
517
518
519
520
521

    for( int i = 0 ; i < 10 ; i++ )
    {
        band_texts[i] = new wxStaticText( panel, -1,
                                band_frequencies[i] + wxU("\n0.0dB" ) ) ;
522
        eq_gridsizer->Add( band_texts[i], 1, wxEXPAND|wxALL, 2 );
523
524
525
526
527
        wxFont font= band_texts[i]->GetFont();
        font.SetPointSize(7);
        band_texts[i]->SetFont( font );
    }

528
529
    panel_sizer->Add( top_sizer , 0 , wxTOP | wxEXPAND, 5 );
    panel_sizer->Add( eq_gridsizer , 0 , wxEXPAND, 0 );
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568

    panel->SetSizer( panel_sizer );

    panel_sizer->Layout();

    panel_sizer->SetSizeHints( panel );

    CheckAout();
    return panel;
}

/*******************************************************
 * Event handlers
 *******************************************************/

/* Keep aout up to date and update the bands if needed */
void ExtraPanel::OnIdle( wxIdleEvent &event )
{
    CheckAout();
    if( b_update == VLC_TRUE )
    {
        if( b_my_update == VLC_TRUE )
        {
            b_update = b_my_update = VLC_FALSE;
            return;
        }
        char *p = psz_bands;
        for( int i = 0; i < 10; i++ )
        {
                float f;
                char psz_val[5];
                int i_val;
                /* Read dB -20/20*/
                f = strtof( p, &p );
                i_val= (int)( ( f + 20 ) * 10 );
                band_sliders[i]->SetValue( 400 - i_val );
                i_values[i] = 400 - i_val;
                sprintf( psz_val, "%.1f", f );
                band_texts[i]->SetLabel( band_frequencies[i] + wxT("\n") +
Anil Daoud's avatar
Anil Daoud committed
569
                                                wxU( psz_val ) + wxT("dB") );
570
571
572
573
574
575
576
577
578
579
580
581
582
                if( p == NULL )
                {
                    break;
                }
                p++;
                if( *p == 0 )
                    break;
        }
        char psz_val[5];
        int i_val = (int)( ( f_preamp + 20 ) * 10 );
        sprintf( psz_val, "%.1f", f_preamp );
        preamp_slider->SetValue( 400 - i_val );
        const wxString preamp = wxT("Preamp\n");
Anil Daoud's avatar
Anil Daoud committed
583
        preamp_text->SetLabel( preamp + wxU( psz_val ) + wxT( "dB" ) );
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
        eq_chkbox->SetValue( TRUE );
        b_update = VLC_FALSE;
    }
}

/*************************
 *  Equalizer Panel events
 *************************/
void ExtraPanel::OnEnableEqualizer( wxCommandEvent &event )
{
    aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
                                 VLC_OBJECT_AOUT, FIND_ANYWHERE);
    ChangeFiltersString( p_intf,p_aout, "equalizer",
                         event.IsChecked() ? VLC_TRUE : VLC_FALSE );
    if( p_aout != NULL )
        vlc_object_release( p_aout );
}

void ExtraPanel::OnEqRestore( wxCommandEvent &event )
{
    aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
                                 VLC_OBJECT_AOUT, FIND_ANYWHERE);
    if( p_aout == NULL )
    {
zorglub's avatar
zorglub committed
608
609
610
611
612
613
614
        vlc_value_t val;
        vlc_bool_t b_previous = eq_chkbox->IsChecked();
        val.f_float = 12.0;
        IntfPreampCallback( NULL, NULL, val,val, this );
        config_PutFloat( p_intf, "equalizer-preamp", 12.0 );
        val.psz_string = strdup( "0 0 0 0 0 0 0 0 0 0" );
        IntfBandsCallback( NULL, NULL, val,val, this );
615
        config_PutPsz( p_intf, "equalizer-bands",
zorglub's avatar
zorglub committed
616
617
618
                                "0 0 0 0 0 0 0 0 0 0");
        config_PutPsz( p_intf, "equalizer-preset","flat" );
        eq_chkbox->SetValue( b_previous );
619
620
621
622
623
    }
    else
    {
        var_SetFloat( p_aout, "equalizer-preamp", 0.0 );
        var_SetString( p_aout, "equalizer-bands",
zorglub's avatar
zorglub committed
624
625
                                "0 0 0 0 0 0 0 0 0 0");
        var_SetString( p_aout , "equalizer-preset" , "flat" );
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
        vlc_object_release( p_aout );
    }
}

void ExtraPanel::OnEq2Pass( wxCommandEvent &event )
{
    aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
                                 VLC_OBJECT_AOUT, FIND_ANYWHERE);

    vlc_bool_t b_2p = event.IsChecked() ? VLC_TRUE : VLC_FALSE;

    if( p_aout == NULL )
    {
        config_PutInt( p_intf, "equalizer-2pass", b_2p );
    }
    else
    {
        var_SetBool( p_aout, "equalizer-2pass", b_2p );
        if( eq_chkbox->IsChecked() )
        {
            for( int i = 0; i < p_aout->i_nb_inputs; i++ )
            {
                p_aout->pp_inputs[i]->b_restart = VLC_TRUE;
            }
        }
        vlc_object_release( p_aout );
    }
}

void ExtraPanel::OnEqSmooth( wxScrollEvent &event )
{
    /* Max smoothing : 70% */
    i_smooth = event.GetPosition() * 7;
}

void ExtraPanel::OnPreamp( wxScrollEvent &event )
{
    float f= (float)( 400 - event.GetPosition() ) / 10 - 20 ;
    char psz_val[5];

    aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
                                 VLC_OBJECT_AOUT, FIND_ANYWHERE);

    sprintf( psz_val, "%.1f", f );
    const wxString preamp = wxT("Preamp\n");
Anil Daoud's avatar
Anil Daoud committed
671
    preamp_text->SetLabel( preamp + wxU( psz_val ) + wxT( "dB" ) );
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720

    if( p_aout == NULL )
    {
        config_PutFloat( p_intf, "equalizer-preamp", f );
    }
    else
    {
        var_SetFloat( p_aout, "equalizer-preamp", f );
        b_my_update = VLC_TRUE;
        vlc_object_release( p_aout );
    }
}

void ExtraPanel::OnChangeEqualizer( wxScrollEvent &event )
{
    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 );

    /* Smoothing */
    int i_diff = event.GetPosition() - i_values[  event.GetId() - Band0_Event ];
    i_values[ event.GetId() - Band0_Event] = event.GetPosition();

    for( int i = event.GetId() + 1 ; i <= Band9_Event ; i++ )
    {
        int i_new = band_sliders[ i-Band0_Event ]->GetValue() +
           (int)( i_diff * pow( (float)i_smooth / 100 , i- event.GetId() ) ) ;
        if( i_new < 0 ) i_new = 0;
        if( i_new > 400 ) i_new = 400;
        band_sliders[ i-Band0_Event ]->SetValue( i_new );
    }
    for( int i = Band0_Event ; i < event.GetId() ; i++ )
    {
        int i_new =   band_sliders[ i-Band0_Event ]->GetValue() +
           (int)( i_diff * pow( (float)i_smooth / 100 , event.GetId() - i  ) );
        if( i_new < 0 ) i_new = 0;
        if( i_new > 400 ) i_new = 400;
        band_sliders[ i-Band0_Event ]->SetValue( i_new );
    }

    /* Write the new bands values */
    for( int i = 0 ; i < 10 ; i++ )
    {
        char psz_val[5];
        float f_val = (float)( 400 - band_sliders[i]->GetValue() ) / 10- 20 ;
        sprintf( psz_values, "%s %f", psz_values, f_val );
        sprintf( psz_val, "%.1f", f_val );
        band_texts[i]->SetLabel( band_frequencies[i] + wxT("\n") +
Anil Daoud's avatar
Anil Daoud committed
721
                        wxU( psz_val ) + wxT("dB" ) );
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
    }
    if( p_aout == NULL )
    {
        config_PutPsz( p_intf, "equalizer-bands", psz_values );
    }
    else
    {
        var_SetString( p_aout, "equalizer-bands", psz_values );
        b_my_update = VLC_TRUE;
        vlc_object_release( p_aout );
    }
}

/***********************
 * Audio Panel events
 ***********************/
void ExtraPanel::OnHeadphone( wxCommandEvent &event )
{
    aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
                                 VLC_OBJECT_AOUT, FIND_ANYWHERE);
    ChangeFiltersString( p_intf , p_aout, "headphone",
                         event.IsChecked() ? VLC_TRUE : VLC_FALSE );
    if( p_aout != NULL )
        vlc_object_release( p_aout );
}

void ExtraPanel::OnNormvol( wxCommandEvent &event )
{
    aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
                                 VLC_OBJECT_AOUT, FIND_ANYWHERE);
    ChangeFiltersString( p_intf , p_aout, "normvol",
                         event.IsChecked() ? VLC_TRUE : VLC_FALSE );
    if( p_aout != NULL )
        vlc_object_release( p_aout );
}

void ExtraPanel::OnNormvolSlider( wxScrollEvent &event )
{
    aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
                                 VLC_OBJECT_AOUT, FIND_ANYWHERE);
    if( p_aout != NULL )
    {
        var_SetFloat( p_aout, "norm-max-level", (float)event.GetPosition()/10 );
        vlc_object_release( p_aout );
    }
    else
    {
        config_PutFloat( p_intf, "norm-max-level",
                        (float)event.GetPosition()/10 );
    }
}
/***********************
 *  Video Panel events
 ***********************/
void ExtraPanel::OnEnableAdjust(wxCommandEvent& event)
{
    ChangeVFiltersString( p_intf,  "adjust",
                          event.IsChecked() ? VLC_TRUE : VLC_FALSE );

    if( event.IsChecked() )
    {
        restoredefaults_button->Enable();
        brightness_slider->Enable();
        saturation_slider->Enable();
        contrast_slider->Enable();
        hue_slider->Enable();
        gamma_slider->Enable();
    }
    else
    {
        restoredefaults_button->Disable();
        brightness_slider->Disable();
        saturation_slider->Disable();
        contrast_slider->Disable();
        hue_slider->Disable();
        gamma_slider->Disable();
    }
}

void ExtraPanel::OnRestoreDefaults( wxCommandEvent &event)
{
    hue_slider->SetValue(0);
    saturation_slider->SetValue(100);
    brightness_slider->SetValue(100);
    contrast_slider->SetValue(100),
    gamma_slider->SetValue(10);

    wxScrollEvent *hscroll_event = new wxScrollEvent(0, Hue_Event, 0);
    OnAdjustUpdate(*hscroll_event);

    wxScrollEvent *sscroll_event = new wxScrollEvent(0, Saturation_Event, 100);
    OnAdjustUpdate(*sscroll_event);

    wxScrollEvent *bscroll_event = new wxScrollEvent(0, Brightness_Event, 100);
    OnAdjustUpdate(*bscroll_event);

    wxScrollEvent *cscroll_event = new wxScrollEvent(0, Contrast_Event, 100);
    OnAdjustUpdate(*cscroll_event);

    wxScrollEvent *gscroll_event = new wxScrollEvent(0, Gamma_Event, 10);
    OnAdjustUpdate(*gscroll_event);

}

void ExtraPanel::OnAdjustUpdate( wxScrollEvent &event)
{
    vout_thread_t *p_vout = (vout_thread_t *)vlc_object_find(p_intf,
                                 VLC_OBJECT_VOUT, FIND_ANYWHERE);
    if( p_vout == NULL )
zorglub's avatar
zorglub committed
831
    {
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
        switch( event.GetId() )
        {
            case Hue_Event:
                config_PutInt( p_intf , "hue" , event.GetPosition() );
                break;

            case Saturation_Event:
                config_PutFloat( p_intf , "saturation" ,
                                (float)event.GetPosition()/100 );
                break;

            case Brightness_Event:
                config_PutFloat( p_intf , "brightness" ,
                                (float)event.GetPosition()/100 );
                break;

            case Contrast_Event:
                config_PutFloat( p_intf , "contrast" ,
                                (float)event.GetPosition()/100 );
                break;

            case Gamma_Event:
                config_PutFloat( p_intf , "gamma" ,
                                (float)event.GetPosition()/10 );
                break;
        }
zorglub's avatar
zorglub committed
858
    }
859
860
861
862
863
864
865
866
    else
    {
        vlc_value_t val;
        switch( event.GetId() )
        {
            case Hue_Event:
                val.i_int = event.GetPosition();
                var_Set( p_vout, "hue", val );
867
                config_PutInt( p_intf , "hue" , event.GetPosition() );
868
869
870
871
872
                break;

            case Saturation_Event:
                val.f_float = (float)event.GetPosition() / 100;
                var_Set( p_vout, "saturation", val );
873
874
                config_PutFloat( p_intf , "saturation" ,
                                (float)event.GetPosition()/100 );
875
876
877
878
879
                break;

            case Brightness_Event:
                val.f_float = (float)event.GetPosition() / 100;
                var_Set( p_vout, "brightness", val );
880
881
                config_PutFloat( p_intf , "brightness" ,
                                (float)event.GetPosition()/100 );
882
883
884
885
886
                break;

            case Contrast_Event:
                val.f_float = (float)event.GetPosition() / 100;
                var_Set( p_vout, "contrast", val );
887
888
                config_PutFloat( p_intf , "contrast" ,
                                (float)event.GetPosition()/100 );
889
890
891
892
893
                break;

            case Gamma_Event:
                val.f_float = (float)event.GetPosition() / 10;
                var_Set( p_vout, "gamma", val );
894
895
                config_PutFloat( p_intf , "gamma" ,
                                (float)event.GetPosition()/10 );
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
                break;
        }
        vlc_object_release(p_vout);
    }
}

/* FIXME */
void ExtraPanel::OnRatio( wxCommandEvent& event )
{
   config_PutPsz( p_intf, "aspect-ratio", ratio_combo->GetValue().mb_str() );
}


void ExtraPanel::OnSelectFilter(wxCommandEvent& event)
{
    int i_filter = event.GetId() - Filter0_Event ;
    if( vfilters[i_filter].psz_filter  )
    {
        ChangeVFiltersString( p_intf, vfilters[i_filter].psz_filter ,
                              event.IsChecked() ? VLC_TRUE : VLC_FALSE );
    }
}

void ExtraPanel::OnFiltersInfo(wxCommandEvent& event)
{
    wxMessageBox( wxU( _("Select the video effects filters to apply. "
                  "You must restart the stream for these settings to "
                  "take effect.\n"
zorglub's avatar
zorglub committed
924
925
                  "To configure the filters, go to the Preferences, "
                  "and go to Modules/Video Filters. "
926
927
928
                  "You can then configure each filter.\n"
                  "If you want fine control over the filters ( to choose "
                  "the order in which they are applied ), you need to enter "
929
                  "manually a filters string (Preferences / General / Video)."
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
                  ) ),
                    wxU( _("More information" ) ), wxOK | wxICON_INFORMATION,
                    this->p_parent );
}
/**********************************
 * Other functions
 **********************************/
void ExtraPanel::CheckAout()
{
    aout_instance_t *p_aout= (aout_instance_t *)vlc_object_find(p_intf,
                                 VLC_OBJECT_AOUT, FIND_ANYWHERE);
    if( p_aout != NULL )
    {
        if( p_aout != p_intf->p_sys->p_aout )
        {
            /* We want to know if someone changes the bands */
            if( var_AddCallback( p_aout, "equalizer-bands",
                                    IntfBandsCallback, this ) )
            {
                /* The variable does not exist yet, wait */
                vlc_object_release( p_aout );
                return;
            }
            if( var_AddCallback( p_aout, "equalizer-preamp",
                                    IntfPreampCallback, this )  )
            {
                vlc_object_release( p_aout );
                return;
            }
            /* Ok, we have our variables, make a first update round */
            p_intf->p_sys->p_aout = p_aout;

            f_preamp = var_GetFloat( p_aout, "equalizer-preamp" );
            psz_bands = var_GetString( p_aout, "equalizer-bands" );
            b_update = VLC_TRUE;
        }
        vlc_object_release( p_aout );
    }
}


static void ChangeVFiltersString( intf_thread_t *p_intf,
                                 char *psz_name, vlc_bool_t b_add )
{
zorglub's avatar
zorglub committed
974
    vout_thread_t *p_vout;
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
    char *psz_parser, *psz_string;

    psz_string = config_GetPsz( p_intf, "filter" );

    if( !psz_string ) psz_string = strdup("");

    psz_parser = strstr( psz_string, psz_name );

    if( b_add )
    {
        if( !psz_parser )
        {
            psz_parser = psz_string;
            asprintf( &psz_string, (*psz_string) ? "%s:%s" : "%s%s",
                            psz_string, psz_name );
            free( psz_parser );
        }
        else
        {
            return;
        }
    }
    else
    {
        if( psz_parser )
        {