]> git.sesse.net Git - vlc/blob - modules/gui/macosx/AudioEffects.m
macosx: copyright fixes
[vlc] / modules / gui / macosx / AudioEffects.m
1 /*****************************************************************************
2  * AudioEffects.m: MacOS X interface module
3  *****************************************************************************
4  * Copyright (C) 2004-2011 VLC authors and VideoLAN
5  * $Id$
6  *
7  * Authors: Felix Paul Kühne <fkuehne -at- videolan -dot- org>
8  *          Jérôme Decoodt <djc@videolan.org>
9  *          
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
24  *****************************************************************************/
25
26 #ifdef HAVE_CONFIG_H
27 # import "config.h"
28 #endif
29
30 #import "intf.h"
31 #import "AudioEffects.h"
32 #import "../../audio_filter/equalizer_presets.h"
33 #import "CompatibilityFixes.h"
34
35 #import <vlc_common.h>
36 #import <vlc_aout_intf.h>
37
38 #import <math.h>
39
40 #pragma mark -
41 #pragma mark Initialization & Generic code
42
43 @implementation VLCAudioEffects
44 static VLCAudioEffects *_o_sharedInstance = nil;
45
46 + (VLCAudioEffects *)sharedInstance
47 {
48     return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
49 }
50
51 - (id)init
52 {
53     if (_o_sharedInstance) {
54         [self dealloc];
55     } else {
56         p_intf = VLCIntf;
57         o_eq_custom_presets = [[NSMutableArray alloc] init];
58         o_eq_custom_presetnames = [[NSMutableArray alloc] init];
59         _o_sharedInstance = [super init];
60     }
61     
62     return _o_sharedInstance;
63 }
64
65 - (void)dealloc
66 {
67     [o_eq_custom_presets release];
68     [o_eq_custom_presetnames release];
69
70     [super dealloc];
71 }
72
73 - (void)awakeFromNib
74 {
75     /* setup the user's language */
76     /* Equalizer */
77     [o_eq_enable_ckb setTitle:_NS("Enable")];
78     [o_eq_twopass_ckb setTitle:_NS("2 Pass")];
79     [o_eq_preamp_lbl setStringValue:_NS("Preamp")];
80     [self rebuildEqMenu];
81     [o_eqp_panel setTitle: _NS("New Preset Name")];
82     [o_eqp_ok_btn setTitle: _NS("OK")];
83     [o_eqp_cancel_btn setTitle: _NS("Cancel")];
84     [o_eqp_new_lbl setStringValue: _NS("New Preset Name")];
85     [o_eq_manage_panel setTitle: _NS("Manage Presets")];
86     [o_eq_manage_ok_btn setTitle: _NS("OK")];
87     [o_eq_manage_cancel_btn setTitle: _NS("Cancel")];
88     [o_eq_manage_rename_btn setTitle: _NS("Rename")];
89     [o_eq_manage_delete_btn setTitle: _NS("Delete")];
90
91     /* Compressor */
92     [o_comp_enable_ckb setTitle:_NS("Enable dynamic range compressor")];
93     [o_comp_reset_btn setTitle:_NS("Reset")];
94     [o_comp_band1_lbl setStringValue:_NS("RMS/peak")];;
95     [o_comp_band2_lbl setStringValue:_NS("Attack")];
96     [o_comp_band3_lbl setStringValue:_NS("Release")];
97     [o_comp_band4_lbl setStringValue:_NS("Threshold")];
98     [o_comp_band5_lbl setStringValue:_NS("Ratio")];
99     [o_comp_band6_lbl setStringValue:_NS("Knee radius")];
100     [o_comp_band7_lbl setStringValue:_NS("Makeup gain")];
101     
102     /* Spatializer */
103     [o_spat_enable_ckb setTitle:_NS("Enable Spatializer")];
104     [o_spat_reset_btn setTitle:_NS("Reset")];
105     [o_spat_band1_lbl setStringValue:_NS("Size")];
106     [o_spat_band2_lbl setStringValue:_NS("Width")];
107     [o_spat_band3_lbl setStringValue:_NS("Wet")];
108     [o_spat_band4_lbl setStringValue:_NS("Dry")];
109     [o_spat_band5_lbl setStringValue:_NS("Dump")];
110     
111     /* Filter */
112     [o_filter_headPhone_ckb setTitle:_NS("Headphone virtualization")];
113     [o_filter_normLevel_ckb setTitle:_NS("Volume normalization")];
114     [o_filter_normLevel_lbl setStringValue:_NS("Maximum level")];
115     
116     /* generic */
117     [[o_tableView tabViewItemAtIndex:[o_tableView indexOfTabViewItemWithIdentifier:@"equalizer"]] setLabel:_NS("Equalizer")];
118     [[o_tableView tabViewItemAtIndex:[o_tableView indexOfTabViewItemWithIdentifier:@"compressor"]] setLabel:_NS("Compressor")];
119     [[o_tableView tabViewItemAtIndex:[o_tableView indexOfTabViewItemWithIdentifier:@"spatializer"]] setLabel:_NS("Spatializer")];
120     [[o_tableView tabViewItemAtIndex:[o_tableView indexOfTabViewItemWithIdentifier:@"filter"]] setLabel:_NS("Filter")];
121     [o_window setTitle:_NS("Audio Effects")];
122     [o_window setExcludedFromWindowsMenu:YES];
123     if (OSX_LION)
124         [o_window setCollectionBehavior: NSWindowCollectionBehaviorFullScreenAuxiliary];
125
126     [self setupEqualizer];
127     [self resetCompressor];
128     [self resetSpatializer];
129     [self resetAudioFilters];
130 }
131
132 - (IBAction)toggleWindow:(id)sender
133 {
134     if( [o_window isVisible] )
135         [o_window orderOut:sender];
136     else
137         [o_window makeKeyAndOrderFront:sender];
138 }
139
140 - (void)setAudioFilter: (char *)psz_name on:(BOOL)b_on
141 {
142     char *psz_tmp;
143     audio_output_t * p_aout = getAout();
144     if( p_aout )
145         psz_tmp = var_GetNonEmptyString( p_aout, "audio-filter" );
146     else
147         psz_tmp = config_GetPsz( p_intf, "audio-filter" );        
148     
149     if( b_on )
150     {
151         if(! psz_tmp)
152             config_PutPsz( p_intf, "audio-filter", psz_name );
153         else if( (NSInteger)strstr( psz_tmp, psz_name ) == NO )
154         {
155             psz_tmp = (char *)[[NSString stringWithFormat: @"%s:%s", psz_tmp, psz_name] UTF8String];
156             config_PutPsz( p_intf, "audio-filter", psz_tmp );
157         }
158     } else {
159         if( psz_tmp )
160         {
161             psz_tmp = (char *)[[[NSString stringWithUTF8String: psz_tmp] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@":%s",psz_name]]] UTF8String];
162             psz_tmp = (char *)[[[NSString stringWithUTF8String: psz_tmp] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@"%s:",psz_name]]] UTF8String];
163             psz_tmp = (char *)[[[NSString stringWithUTF8String: psz_tmp] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithUTF8String:psz_name]]] UTF8String];
164             config_PutPsz( p_intf, "audio-filter", psz_tmp );
165         }
166     }
167
168     if( p_aout ) {
169         aout_EnableFilter( pl_Get( p_intf ), psz_name, b_on );
170         vlc_object_release( p_aout );
171     }
172 }
173
174 #pragma mark -
175 #pragma mark Equalizer
176 static bool GetEqualizerStatus( intf_thread_t *p_custom_intf,
177                              char *psz_name )
178 {
179     char *psz_parser, *psz_string = NULL;
180     vlc_object_t *p_object = VLC_OBJECT(getAout());
181     if( p_object == NULL )
182         p_object = vlc_object_hold(pl_Get( p_custom_intf ));
183     
184     psz_string = config_GetPsz( p_custom_intf, "audio-filter" );
185     
186     if(! psz_string )
187         psz_string = var_GetNonEmptyString( p_object, "audio-filter" );
188     
189     vlc_object_release( p_object );
190     
191     if( !psz_string ) return false;
192     
193     psz_parser = strstr( psz_string, psz_name );
194     
195     free( psz_string );
196     
197     if ( psz_parser )
198         return true;
199     else
200         return false;
201 }
202
203 - (void)setupEqualizer
204 {
205     vlc_object_t *p_object= VLC_OBJECT(getAout());
206     if( p_object == NULL )
207         p_object = vlc_object_hold(pl_Get( VLCIntf ));
208
209     if( p_object )
210     {
211         char *psz_preset;
212
213         var_Create( p_object, "equalizer-preset", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
214         psz_preset = var_GetNonEmptyString( p_object, "equalizer-preset" );
215
216         for( int i = 0 ; i < NB_PRESETS ; i++ )
217         {
218             if( strcmp( preset_list[i], psz_preset ) )
219                 continue;
220
221             [o_eq_presets_popup selectItemWithTag:i];
222
223             [o_eq_preamp_sld setFloatValue: eqz_preset_10b[i].f_preamp];
224             [self setBandSlidersValues: (float *)eqz_preset_10b[i].f_amp];
225
226             if( strcmp( psz_preset, "flat" ) )
227             {
228                 char psz_bands[100];
229
230                 snprintf( psz_bands, sizeof( psz_bands ),
231                          "%.1f %.1f %.1f %.1f %.1f %.1f %.1f "
232                          "%.1f %.1f %.1f",
233                          eqz_preset_10b[i].f_amp[0],
234                          eqz_preset_10b[i].f_amp[1],
235                          eqz_preset_10b[i].f_amp[2],
236                          eqz_preset_10b[i].f_amp[3],
237                          eqz_preset_10b[i].f_amp[4],
238                          eqz_preset_10b[i].f_amp[5],
239                          eqz_preset_10b[i].f_amp[6],
240                          eqz_preset_10b[i].f_amp[7],
241                          eqz_preset_10b[i].f_amp[8],
242                          eqz_preset_10b[i].f_amp[9] );
243                 
244                 var_Create( p_object, "equalizer-preamp", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT );
245                 var_Create( p_object, "equalizer-bands", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
246                 var_SetFloat( p_object, "equalizer-preamp", eqz_preset_10b[i].f_preamp );
247                 var_SetString( p_object, "equalizer-bands", psz_bands );
248             }
249         }
250         free( psz_preset );
251         vlc_object_release( p_object );
252     }
253
254     [self equalizerUpdated];
255 }
256
257 - (void)rebuildEqMenu
258 {
259     [o_eq_presets_popup removeAllItems];
260     [o_eq_presets_popup addItemWithTitle: _NS("Add Preset")];
261     [[o_eq_presets_popup lastItem] setTag: 300];
262     [o_eq_presets_popup addItemWithTitle: _NS("Manage Presets")];
263     [[o_eq_presets_popup lastItem] setTag: 301];
264     [[o_eq_presets_popup menu] addItem: [NSMenuItem separatorItem]];
265     for (int i = 0; i < NB_PRESETS ; i++)
266     {
267         [o_eq_presets_popup addItemWithTitle: _NS(preset_list_text[i])];
268         [[o_eq_presets_popup lastItem] setTag: i];
269     }
270     if ([o_eq_custom_presetnames count] > 0)
271     {
272         [[o_eq_presets_popup menu] addItem: [NSMenuItem separatorItem]];
273         NSUInteger count = [o_eq_custom_presetnames count];
274         for (unsigned int i = 0; i < count; i++)
275         {
276             [o_eq_presets_popup addItemWithTitle: [o_eq_custom_presetnames objectAtIndex:i]];
277             [[o_eq_presets_popup lastItem] setTag: i + 200];
278         }
279     }
280 }
281
282 - (void)equalizerUpdated
283 {
284     float f_preamp, f_band[10];
285     char *psz_bands, *psz_bands_init, *p_next;
286     bool b_2p;
287     bool b_enabled = GetEqualizerStatus( p_intf, (char *)"equalizer" );
288     vlc_object_t *p_object = VLC_OBJECT(getAout());
289     
290     if( p_object == NULL )
291         p_object = vlc_object_hold(pl_Get( p_intf ));
292     
293     var_Create( p_object, "equalizer-preamp", VLC_VAR_FLOAT |
294                VLC_VAR_DOINHERIT );
295     var_Create( p_object, "equalizer-bands", VLC_VAR_STRING |
296                VLC_VAR_DOINHERIT );
297     
298     psz_bands = var_GetNonEmptyString( p_object, "equalizer-bands" );
299     
300     if( psz_bands == NULL )
301         psz_bands = strdup( "0 0 0 0 0 0 0 0 0 0" );
302
303     b_2p = (BOOL)config_GetInt( p_object, "equalizer-2pass" );
304     f_preamp = config_GetFloat( p_object, "equalizer-preamp" );
305
306     vlc_object_release( p_object );
307     
308     /* Set the preamp slider */
309     [o_eq_preamp_sld setFloatValue: f_preamp];
310
311     /* Set the bands slider */
312     psz_bands_init = psz_bands;
313     
314     for( int i = 0; i < 10; i++ )
315     {
316         /* Read dB -20/20 */
317         f_band[i] = strtof( psz_bands, &p_next );
318         if( !p_next || p_next == psz_bands ) break; /* strtof() failed */
319         
320         if( !*psz_bands ) break; /* end of line */
321         psz_bands = p_next+1;
322     }
323     free( psz_bands_init );
324     [self setBandSlidersValues:f_band];
325     
326     /* Set the the checkboxes */
327     [o_eq_enable_ckb setState: b_enabled];
328     [o_eq_twopass_ckb setState: b_2p];
329 }
330
331 - (id)sliderByIndex:(int)index
332 {
333     switch(index)
334     {
335         case 0 : return o_eq_band1_sld;
336         case 1 : return o_eq_band2_sld;
337         case 2 : return o_eq_band3_sld;
338         case 3 : return o_eq_band4_sld;
339         case 4 : return o_eq_band5_sld;
340         case 5 : return o_eq_band6_sld;
341         case 6 : return o_eq_band7_sld;
342         case 7 : return o_eq_band8_sld;
343         case 8 : return o_eq_band9_sld;
344         case 9 : return o_eq_band10_sld;
345         default : return nil;
346     }
347 }
348
349 - (void)setBandSlidersValues:(float *)values
350 {
351     for (int i = 0 ; i<= 9 ; i++)
352         [self setValue:values[i] forSlider:i];
353 }
354
355 - (void)initBandSliders
356 {
357     for (int i = 0 ; i< 9 ; i++)
358         [self setValue:0.0 forSlider:i];
359 }
360
361 - (void)setValue:(float)value forSlider:(int)index
362 {
363     id slider = [self sliderByIndex:index];
364     
365     if (slider != nil)
366         [slider setFloatValue:value];
367 }
368
369 - (IBAction)eq_enable:(id)sender
370 {
371     [self setAudioFilter: "equalizer" on:[sender state]];
372 }
373
374 - (IBAction)eq_bandSliderUpdated:(id)sender
375 {
376     vlc_object_t *p_object = VLC_OBJECT(getAout());
377     
378     if( p_object == NULL )
379         p_object = vlc_object_hold(pl_Get( p_intf ));
380     
381     const char *psz_values;
382     NSString *preset = [NSString stringWithFormat:@"%.1f ", [o_eq_band1_sld floatValue] ];
383     preset = [preset stringByAppendingFormat:@"%.1f ", [o_eq_band2_sld floatValue] ];
384     preset = [preset stringByAppendingFormat:@"%.1f ", [o_eq_band3_sld floatValue] ];
385     preset = [preset stringByAppendingFormat:@"%.1f ", [o_eq_band4_sld floatValue] ];
386     preset = [preset stringByAppendingFormat:@"%.1f ", [o_eq_band5_sld floatValue] ];
387     preset = [preset stringByAppendingFormat:@"%.1f ", [o_eq_band6_sld floatValue] ];
388     preset = [preset stringByAppendingFormat:@"%.1f ", [o_eq_band7_sld floatValue] ];
389     preset = [preset stringByAppendingFormat:@"%.1f ", [o_eq_band8_sld floatValue] ];
390     preset = [preset stringByAppendingFormat:@"%.1f ", [o_eq_band9_sld floatValue] ];
391     preset = [preset stringByAppendingFormat:@"%.1f", [o_eq_band10_sld floatValue] ];
392
393     psz_values = [preset UTF8String];
394     var_SetString( p_object, "equalizer-bands", psz_values );
395
396     /* save changed to config */
397     config_PutPsz( p_intf, "equalizer-bands", psz_values );
398
399     vlc_object_release( p_object );
400 }
401 - (IBAction)eq_changePreset:(id)sender
402 {
403     NSInteger numberOfChosenPreset = [[sender selectedItem] tag];
404     if (numberOfChosenPreset == 300)
405     {
406         // add new preset
407         i_to_be_renamed_preset = -1;
408         [NSApp runModalForWindow: o_eqp_panel];
409     }
410     else if(numberOfChosenPreset == 301)
411     {
412         // manage presets
413         [o_eq_manage_table reloadData];
414         [NSApp runModalForWindow: o_eq_manage_panel];
415     }
416     else if(numberOfChosenPreset >= 200)
417     {
418         // custom preset, TODO
419     }
420     else
421     {
422         vlc_object_t *p_object= VLC_OBJECT(getAout());
423         if( p_object == NULL )
424             p_object = vlc_object_hold(pl_Get( p_intf ));
425
426         var_SetString( p_object , "equalizer-preset" , preset_list[numberOfChosenPreset] );
427
428         NSString *preset = @"";
429         const char *psz_values;
430         for( int i = 0; i < EQZ_BANDS_MAX; i++ )
431         {
432             preset = [preset stringByAppendingFormat:@"%.1f ", eqz_preset_10b[numberOfChosenPreset].f_amp[i] ];
433         }
434         psz_values = [preset UTF8String];
435         var_SetString( p_object, "equalizer-bands", psz_values );
436         var_SetFloat( p_object, "equalizer-preamp", eqz_preset_10b[numberOfChosenPreset].f_preamp);
437
438         [o_eq_preamp_sld setFloatValue: eqz_preset_10b[numberOfChosenPreset].f_preamp];
439
440         [self setBandSlidersValues:(float *)eqz_preset_10b[numberOfChosenPreset].f_amp];
441
442         /* save changed to config */
443         config_PutPsz( p_intf, "equalizer-bands", psz_values );
444         config_PutFloat( p_intf, "equalizer-preamp", eqz_preset_10b[numberOfChosenPreset].f_preamp );
445         config_PutPsz( p_intf, "equalizer-preset", preset_list[numberOfChosenPreset] );
446
447         vlc_object_release( p_object );
448     }
449 }
450 - (IBAction)eq_preampSliderUpdated:(id)sender
451 {
452     float f_preamp = [sender floatValue] ;
453
454     vlc_object_t *p_object = VLC_OBJECT(getAout());
455     if( p_object == NULL )
456         p_object = vlc_object_hold(pl_Get( p_intf ));
457
458     var_SetFloat( p_object, "equalizer-preamp", f_preamp );
459
460     /* save changed to config */
461     config_PutFloat( p_intf, "equalizer-preamp", f_preamp );
462
463     vlc_object_release( p_object );
464 }
465 - (IBAction)eq_twopass:(id)sender
466 {
467     bool b_2p = [sender state] ? true : false;
468     audio_output_t *p_aout = getAout();
469     vlc_object_t *p_object= VLC_OBJECT(p_aout);
470     if( p_object == NULL )
471         p_object = vlc_object_hold(pl_Get( p_intf ));
472
473     var_SetBool( p_object, "equalizer-2pass", b_2p );
474
475     /* save changed to config */
476     config_PutInt( p_intf, "equalizer-2pass", (int)b_2p );
477
478     vlc_object_release( p_object );
479 }
480
481 - (IBAction)eq_nameButtonAction:(id)sender
482 {
483     [NSApp stopModal];
484     [[sender window] orderOut:sender];
485
486     if (sender == o_eqp_ok_btn)
487     {
488         if (i_to_be_renamed_preset != -1)
489         {
490             // rename existing preset
491             [o_eq_custom_presetnames replaceObjectAtIndex:i_to_be_renamed_preset withObject:[o_eqp_new_fld stringValue]];
492             [o_eq_manage_table reloadData];
493             [self rebuildEqMenu];
494         }
495         else
496         {
497             // add new preset
498             [o_eq_custom_presetnames addObject: [o_eqp_new_fld stringValue]];
499             [self rebuildEqMenu];
500
501             // TODO
502         }
503     }
504 }
505
506 - (IBAction)eq_manageAction:(id)sender
507 {
508     if (sender == o_eq_manage_cancel_btn || sender == o_eq_manage_ok_btn) {
509         [NSApp stopModal];
510         [[sender window] orderOut:sender];
511     }
512     else if( sender == o_eq_manage_delete_btn )
513     {
514         [o_eq_custom_presets removeObjectAtIndex: [o_eq_manage_table selectedRow]];
515         [o_eq_custom_presetnames removeObjectAtIndex: [o_eq_manage_table selectedRow]];
516         [o_eq_manage_table reloadData];
517         [self rebuildEqMenu];
518     }
519     else
520     {
521         i_to_be_renamed_preset = [o_eq_manage_table selectedRow];
522         [o_eqp_new_fld setStringValue: [o_eq_custom_presetnames objectAtIndex: i_to_be_renamed_preset]];
523         [NSApp stopModal];
524         [[sender window] orderOut:sender];
525         [NSApp runModalForWindow: o_eqp_panel];
526     }
527 }
528
529 - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
530 {
531     return [o_eq_custom_presets count];
532 }
533
534 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
535 {
536     return [o_eq_custom_presetnames objectAtIndex:rowIndex];
537 }
538
539 #pragma mark -
540 #pragma mark Compressor
541 - (void)resetCompressor
542 {
543     char * psz_afilters;
544     psz_afilters = config_GetPsz( p_intf, "audio-filter" );
545     if( psz_afilters ) {
546         [o_comp_enable_ckb setState: (NSInteger)strstr( psz_afilters, "compressor" ) ];
547         free( psz_afilters );
548     } 
549     else
550         [o_comp_enable_ckb setState: NSOffState];
551
552     [o_comp_band1_sld setFloatValue: config_GetFloat( p_intf, "compressor-rms-peak" )];
553     [o_comp_band1_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [o_comp_band1_sld floatValue]]];
554     [o_comp_band2_sld setFloatValue: config_GetFloat( p_intf, "compressor-attack" )];
555     [o_comp_band2_fld setStringValue:[NSString localizedStringWithFormat:@"%2.1f ms", [o_comp_band2_sld floatValue]]];
556     [o_comp_band3_sld setFloatValue: config_GetFloat( p_intf, "compressor-release" )];
557     [o_comp_band3_fld setStringValue:[NSString localizedStringWithFormat:@"%3.1f ms", [o_comp_band3_sld floatValue]]];
558     [o_comp_band4_sld setFloatValue: config_GetFloat( p_intf, "compressor-threshold" )];
559     [o_comp_band4_fld setStringValue:[NSString localizedStringWithFormat:@"%2.1f dB", [o_comp_band4_sld floatValue]]];
560     [o_comp_band5_sld setFloatValue: config_GetFloat( p_intf, "compressor-ratio" )];
561     [o_comp_band5_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f:1", [o_comp_band5_sld floatValue]]];
562     [o_comp_band6_sld setFloatValue: config_GetFloat( p_intf, "compressor-knee" )];
563     [o_comp_band6_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f dB", [o_comp_band6_sld floatValue]]];
564     [o_comp_band7_sld setFloatValue: config_GetFloat( p_intf, "compressor-makeup-gain" )];
565     [o_comp_band7_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f dB", [o_comp_band7_sld floatValue]]];
566 }
567
568 - (IBAction)resetCompressorValues:(id)sender
569 {
570     config_PutFloat( p_intf, "compressor-rms-peak", 0.000000 );
571     config_PutFloat( p_intf, "compressor-attack", 25.000000 );
572     config_PutFloat( p_intf, "compressor-release", 100.000000 );
573     config_PutFloat( p_intf, "compressor-threshold", -11.000000 );
574     config_PutFloat( p_intf, "compressor-ratio", 8.000000 );
575     config_PutFloat( p_intf, "compressor-knee", 2.500000 );
576     config_PutFloat( p_intf, "compressor-makeup-gain", 7.000000 );
577
578     audio_output_t * p_aout = getAout();
579     if (p_aout) {
580         var_SetFloat( p_aout, "compressor-rms-peak", 0.000000 );
581         var_SetFloat( p_aout, "compressor-attack", 25.000000 );
582         var_SetFloat( p_aout, "compressor-release", 100.000000 );
583         var_SetFloat( p_aout, "compressor-threshold", -11.000000 );
584         var_SetFloat( p_aout, "compressor-ratio", 8.000000 );
585         var_SetFloat( p_aout, "compressor-knee", 2.500000 );
586         var_SetFloat( p_aout, "compressor-makeup-gain", 7.000000 );
587         vlc_object_release( p_aout );
588     }
589     [self resetCompressor];
590 }
591
592 - (IBAction)comp_enable:(id)sender
593 {
594     [self setAudioFilter:"compressor" on:[sender state]];
595 }
596
597 - (IBAction)comp_sliderUpdated:(id)sender
598 {
599     audio_output_t * p_aout = getAout();
600     char * value;
601     if( sender == o_comp_band1_sld )
602         value = "compressor-rms-peak";
603     else if( sender == o_comp_band2_sld )
604         value = "compressor-attack";
605     else if( sender == o_comp_band3_sld )
606         value = "compressor-release";
607     else if( sender == o_comp_band4_sld )
608         value = "compressor-threshold";
609     else if( sender == o_comp_band5_sld )
610         value = "compressor-ratio";
611     else if( sender == o_comp_band6_sld )
612         value = "compressor-knee";
613     else if( sender == o_comp_band7_sld )
614         value = "compressor-makeup-gain";
615
616     if( p_aout ) {
617         var_SetFloat( p_aout, value, [sender floatValue] );
618         vlc_object_release( p_aout );
619     }
620     config_PutFloat( p_intf, value, [sender floatValue] );
621
622     if( sender == o_comp_band1_sld )
623         [o_comp_band1_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [sender floatValue]]];
624     else if( sender == o_comp_band2_sld )
625         [o_comp_band2_fld setStringValue:[NSString localizedStringWithFormat:@"%2.1f ms", [sender floatValue]]];
626     else if( sender == o_comp_band3_sld )
627         [o_comp_band3_fld setStringValue:[NSString localizedStringWithFormat:@"%3.1f ms", [sender floatValue]]];
628     else if( sender == o_comp_band4_sld )
629         [o_comp_band4_fld setStringValue:[NSString localizedStringWithFormat:@"%2.1f dB", [sender floatValue]]];
630     else if( sender == o_comp_band5_sld )
631         [o_comp_band5_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f:1", [sender floatValue]]];
632     else if( sender == o_comp_band6_sld )
633         [o_comp_band6_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f dB", [sender floatValue]]];
634     else if( sender == o_comp_band7_sld )
635         [o_comp_band7_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f dB", [sender floatValue]]];
636 }
637
638 #pragma mark -
639 #pragma mark Spatializer
640 - (void)resetSpatializer
641 {
642     char * psz_afilters;
643     psz_afilters = config_GetPsz( p_intf, "audio-filter" );
644     if( psz_afilters ) {
645         [o_spat_enable_ckb setState: (NSInteger)strstr( psz_afilters, "spatializer" ) ];
646         free( psz_afilters );
647     } 
648     else
649         [o_spat_enable_ckb setState: NSOffState];
650     
651     [o_spat_band1_sld setFloatValue: config_GetFloat( p_intf, "spatializer-roomsize" )];
652     [o_spat_band1_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [o_spat_band1_sld floatValue]]];
653     [o_spat_band2_sld setFloatValue: config_GetFloat( p_intf, "spatializer-width" )];
654     [o_spat_band2_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [o_spat_band2_sld floatValue]]];
655     [o_spat_band3_sld setFloatValue: config_GetFloat( p_intf, "spatializer-wet" )];
656     [o_spat_band3_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [o_spat_band3_sld floatValue]]];
657     [o_spat_band4_sld setFloatValue: config_GetFloat( p_intf, "spatializer-dry" )];
658     [o_spat_band4_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [o_spat_band4_sld floatValue]]];
659     [o_spat_band5_sld setFloatValue: config_GetFloat( p_intf, "spatializer-damp" )];
660     [o_spat_band5_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [o_spat_band5_sld floatValue]]];
661 }
662
663 - (IBAction)resetSpatializerValues:(id)sender
664 {
665     config_PutFloat( p_intf, "spatializer-roomsize", 1.050000 );
666     config_PutFloat( p_intf, "spatializer-width", 10.000000 );
667     config_PutFloat( p_intf, "spatializer-wet", 3.000000 );
668     config_PutFloat( p_intf, "spatializer-dry", 2.000000 );
669     config_PutFloat( p_intf, "spatializer-damp", 1.000000 );
670
671     audio_output_t * p_aout = getAout();
672     if (p_aout) {
673         var_SetFloat( p_aout, "spatializer-roomsize", 1.050000 );
674         var_SetFloat( p_aout, "spatializer-width", 10.000000 );
675         var_SetFloat( p_aout, "spatializer-wet", 3.000000 );
676         var_SetFloat( p_aout, "spatializer-dry", 2.000000 );
677         var_SetFloat( p_aout, "spatializer-damp", 1.000000 );
678         vlc_object_release( p_aout );
679     }
680     [self resetSpatializer];
681 }
682
683 - (IBAction)spat_enable:(id)sender
684 {
685     [self setAudioFilter:"spatializer" on:[sender state]];    
686 }
687
688 - (IBAction)spat_sliderUpdated:(id)sender
689 {
690     audio_output_t * p_aout = getAout();
691     char * value;
692     if( sender == o_spat_band1_sld )
693         value = "spatializer-roomsize";
694     else if( sender == o_spat_band2_sld )
695         value = "spatializer-width";
696     else if( sender == o_spat_band3_sld )
697         value = "spatializer-wet";
698     else if( sender == o_spat_band4_sld )
699         value = "spatializer-dry";
700     else if( sender == o_spat_band5_sld )
701         value = "spatializer-damp";
702     
703     if( p_aout ) {
704         var_SetFloat( p_aout, value, [sender floatValue] );
705         vlc_object_release( p_aout );
706     }
707     config_PutFloat( p_intf, value, [sender floatValue] );
708     
709     if( sender == o_spat_band1_sld )
710         [o_spat_band1_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [sender floatValue]]];
711     else if( sender == o_spat_band2_sld )
712         [o_spat_band2_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [sender floatValue]]];
713     else if( sender == o_spat_band3_sld )
714         [o_spat_band3_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [sender floatValue]]];
715     else if( sender == o_spat_band4_sld )
716         [o_spat_band4_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [sender floatValue]]];
717     else if( sender == o_spat_band5_sld )
718         [o_spat_band5_fld setStringValue:[NSString localizedStringWithFormat:@"%1.1f", [sender floatValue]]];
719 }
720
721 #pragma mark -
722 #pragma mark Filter
723 - (void)resetAudioFilters
724 {
725     char * psz_afilters;
726     psz_afilters = config_GetPsz( p_intf, "audio-filter" );
727     if( psz_afilters )
728     {
729         [o_filter_headPhone_ckb setState: (NSInteger)strstr( psz_afilters, "headphone" ) ];
730         [o_filter_normLevel_ckb setState: (NSInteger)strstr( psz_afilters, "normvol" ) ];
731         free( psz_afilters );
732     } else {
733         [o_filter_headPhone_ckb setState: NSOffState];
734         [o_filter_normLevel_ckb setState: NSOffState];
735     }
736     [o_filter_normLevel_sld setFloatValue: config_GetFloat( p_intf, "norm-max-level" )];
737 }
738
739 - (IBAction)filter_enableHeadPhoneVirt:(id)sender
740 {
741     [self setAudioFilter: "headphone" on:[sender state]];
742 }
743
744 - (IBAction)filter_enableVolumeNorm:(id)sender
745 {
746     [self setAudioFilter: "normvol" on:[sender state]];    
747 }
748
749 - (IBAction)filter_volNormSliderUpdated:(id)sender
750 {
751     audio_output_t * p_aout= getAout();
752
753     if( p_aout )
754     {
755         var_SetFloat( p_aout, "norm-max-level", [o_filter_normLevel_sld floatValue] );
756         vlc_object_release( p_aout );
757     }
758
759     config_PutFloat( p_intf, "norm-max-level", [o_filter_normLevel_sld floatValue] );
760 }
761
762 @end