1 /*****************************************************************************
2 * AudioEffects.m: MacOS X interface module
3 *****************************************************************************
4 * Copyright (C) 2004-2011 VLC authors and VideoLAN
7 * Authors: Felix Paul Kühne <fkuehne -at- videolan -dot- org>
8 * Jérôme Decoodt <djc@videolan.org>
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.
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.
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 *****************************************************************************/
31 #import "AudioEffects.h"
32 #import "../../audio_filter/equalizer_presets.h"
33 #import "CompatibilityFixes.h"
35 #import <vlc_common.h>
36 #import <vlc_aout_intf.h>
41 #pragma mark Initialization & Generic code
43 @implementation VLCAudioEffects
44 static VLCAudioEffects *_o_sharedInstance = nil;
46 + (VLCAudioEffects *)sharedInstance
48 return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
53 if (_o_sharedInstance) {
57 o_eq_custom_presets = [[NSMutableArray alloc] init];
58 o_eq_custom_presetnames = [[NSMutableArray alloc] init];
59 _o_sharedInstance = [super init];
62 return _o_sharedInstance;
67 [o_eq_custom_presets release];
68 [o_eq_custom_presetnames release];
75 /* setup the user's language */
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")];
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")];
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")];
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")];
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")];
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];
124 [o_window setCollectionBehavior: NSWindowCollectionBehaviorFullScreenAuxiliary];
126 [self setupEqualizer];
127 [self resetCompressor];
128 [self resetSpatializer];
129 [self resetAudioFilters];
132 - (IBAction)toggleWindow:(id)sender
134 if( [o_window isVisible] )
135 [o_window orderOut:sender];
137 [o_window makeKeyAndOrderFront:sender];
140 - (void)setAudioFilter: (char *)psz_name on:(BOOL)b_on
143 audio_output_t * p_aout = getAout();
145 psz_tmp = var_GetNonEmptyString( p_aout, "audio-filter" );
147 psz_tmp = config_GetPsz( p_intf, "audio-filter" );
152 config_PutPsz( p_intf, "audio-filter", psz_name );
153 else if( (NSInteger)strstr( psz_tmp, psz_name ) == NO )
155 psz_tmp = (char *)[[NSString stringWithFormat: @"%s:%s", psz_tmp, psz_name] UTF8String];
156 config_PutPsz( p_intf, "audio-filter", psz_tmp );
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 );
169 aout_EnableFilter( pl_Get( p_intf ), psz_name, b_on );
170 vlc_object_release( p_aout );
175 #pragma mark Equalizer
176 static bool GetEqualizerStatus( intf_thread_t *p_custom_intf,
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 ));
184 psz_string = config_GetPsz( p_custom_intf, "audio-filter" );
187 psz_string = var_GetNonEmptyString( p_object, "audio-filter" );
189 vlc_object_release( p_object );
191 if( !psz_string ) return false;
193 psz_parser = strstr( psz_string, psz_name );
203 - (void)setupEqualizer
205 vlc_object_t *p_object= VLC_OBJECT(getAout());
206 if( p_object == NULL )
207 p_object = vlc_object_hold(pl_Get( VLCIntf ));
213 var_Create( p_object, "equalizer-preset", VLC_VAR_STRING | VLC_VAR_DOINHERIT );
214 psz_preset = var_GetNonEmptyString( p_object, "equalizer-preset" );
216 for( int i = 0 ; i < NB_PRESETS ; i++ )
218 if( strcmp( preset_list[i], psz_preset ) )
221 [o_eq_presets_popup selectItemWithTag:i];
223 [o_eq_preamp_sld setFloatValue: eqz_preset_10b[i].f_preamp];
224 [self setBandSlidersValues: (float *)eqz_preset_10b[i].f_amp];
226 if( strcmp( psz_preset, "flat" ) )
230 snprintf( psz_bands, sizeof( psz_bands ),
231 "%.1f %.1f %.1f %.1f %.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] );
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 );
251 vlc_object_release( p_object );
254 [self equalizerUpdated];
257 - (void)rebuildEqMenu
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++)
267 [o_eq_presets_popup addItemWithTitle: _NS(preset_list_text[i])];
268 [[o_eq_presets_popup lastItem] setTag: i];
270 if ([o_eq_custom_presetnames count] > 0)
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++)
276 [o_eq_presets_popup addItemWithTitle: [o_eq_custom_presetnames objectAtIndex:i]];
277 [[o_eq_presets_popup lastItem] setTag: i + 200];
282 - (void)equalizerUpdated
284 float f_preamp, f_band[10];
285 char *psz_bands, *psz_bands_init, *p_next;
287 bool b_enabled = GetEqualizerStatus( p_intf, (char *)"equalizer" );
288 vlc_object_t *p_object = VLC_OBJECT(getAout());
290 if( p_object == NULL )
291 p_object = vlc_object_hold(pl_Get( p_intf ));
293 var_Create( p_object, "equalizer-preamp", VLC_VAR_FLOAT |
295 var_Create( p_object, "equalizer-bands", VLC_VAR_STRING |
298 psz_bands = var_GetNonEmptyString( p_object, "equalizer-bands" );
300 if( psz_bands == NULL )
301 psz_bands = strdup( "0 0 0 0 0 0 0 0 0 0" );
303 b_2p = (BOOL)config_GetInt( p_object, "equalizer-2pass" );
304 f_preamp = config_GetFloat( p_object, "equalizer-preamp" );
306 vlc_object_release( p_object );
308 /* Set the preamp slider */
309 [o_eq_preamp_sld setFloatValue: f_preamp];
311 /* Set the bands slider */
312 psz_bands_init = psz_bands;
314 for( int i = 0; i < 10; i++ )
317 f_band[i] = strtof( psz_bands, &p_next );
318 if( !p_next || p_next == psz_bands ) break; /* strtof() failed */
320 if( !*psz_bands ) break; /* end of line */
321 psz_bands = p_next+1;
323 free( psz_bands_init );
324 [self setBandSlidersValues:f_band];
326 /* Set the the checkboxes */
327 [o_eq_enable_ckb setState: b_enabled];
328 [o_eq_twopass_ckb setState: b_2p];
331 - (id)sliderByIndex:(int)index
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;
349 - (void)setBandSlidersValues:(float *)values
351 for (int i = 0 ; i<= 9 ; i++)
352 [self setValue:values[i] forSlider:i];
355 - (void)initBandSliders
357 for (int i = 0 ; i< 9 ; i++)
358 [self setValue:0.0 forSlider:i];
361 - (void)setValue:(float)value forSlider:(int)index
363 id slider = [self sliderByIndex:index];
366 [slider setFloatValue:value];
369 - (IBAction)eq_enable:(id)sender
371 [self setAudioFilter: "equalizer" on:[sender state]];
374 - (IBAction)eq_bandSliderUpdated:(id)sender
376 vlc_object_t *p_object = VLC_OBJECT(getAout());
378 if( p_object == NULL )
379 p_object = vlc_object_hold(pl_Get( p_intf ));
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] ];
393 psz_values = [preset UTF8String];
394 var_SetString( p_object, "equalizer-bands", psz_values );
396 /* save changed to config */
397 config_PutPsz( p_intf, "equalizer-bands", psz_values );
399 vlc_object_release( p_object );
401 - (IBAction)eq_changePreset:(id)sender
403 NSInteger numberOfChosenPreset = [[sender selectedItem] tag];
404 if (numberOfChosenPreset == 300)
407 i_to_be_renamed_preset = -1;
408 [NSApp runModalForWindow: o_eqp_panel];
410 else if(numberOfChosenPreset == 301)
413 [o_eq_manage_table reloadData];
414 [NSApp runModalForWindow: o_eq_manage_panel];
416 else if(numberOfChosenPreset >= 200)
418 // custom preset, TODO
422 vlc_object_t *p_object= VLC_OBJECT(getAout());
423 if( p_object == NULL )
424 p_object = vlc_object_hold(pl_Get( p_intf ));
426 var_SetString( p_object , "equalizer-preset" , preset_list[numberOfChosenPreset] );
428 NSString *preset = @"";
429 const char *psz_values;
430 for( int i = 0; i < EQZ_BANDS_MAX; i++ )
432 preset = [preset stringByAppendingFormat:@"%.1f ", eqz_preset_10b[numberOfChosenPreset].f_amp[i] ];
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);
438 [o_eq_preamp_sld setFloatValue: eqz_preset_10b[numberOfChosenPreset].f_preamp];
440 [self setBandSlidersValues:(float *)eqz_preset_10b[numberOfChosenPreset].f_amp];
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] );
447 vlc_object_release( p_object );
450 - (IBAction)eq_preampSliderUpdated:(id)sender
452 float f_preamp = [sender floatValue] ;
454 vlc_object_t *p_object = VLC_OBJECT(getAout());
455 if( p_object == NULL )
456 p_object = vlc_object_hold(pl_Get( p_intf ));
458 var_SetFloat( p_object, "equalizer-preamp", f_preamp );
460 /* save changed to config */
461 config_PutFloat( p_intf, "equalizer-preamp", f_preamp );
463 vlc_object_release( p_object );
465 - (IBAction)eq_twopass:(id)sender
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 ));
473 var_SetBool( p_object, "equalizer-2pass", b_2p );
475 /* save changed to config */
476 config_PutInt( p_intf, "equalizer-2pass", (int)b_2p );
478 vlc_object_release( p_object );
481 - (IBAction)eq_nameButtonAction:(id)sender
484 [[sender window] orderOut:sender];
486 if (sender == o_eqp_ok_btn)
488 if (i_to_be_renamed_preset != -1)
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];
498 [o_eq_custom_presetnames addObject: [o_eqp_new_fld stringValue]];
499 [self rebuildEqMenu];
506 - (IBAction)eq_manageAction:(id)sender
508 if (sender == o_eq_manage_cancel_btn || sender == o_eq_manage_ok_btn) {
510 [[sender window] orderOut:sender];
512 else if( sender == o_eq_manage_delete_btn )
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];
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]];
524 [[sender window] orderOut:sender];
525 [NSApp runModalForWindow: o_eqp_panel];
529 - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
531 return [o_eq_custom_presets count];
534 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
536 return [o_eq_custom_presetnames objectAtIndex:rowIndex];
540 #pragma mark Compressor
541 - (void)resetCompressor
544 psz_afilters = config_GetPsz( p_intf, "audio-filter" );
546 [o_comp_enable_ckb setState: (NSInteger)strstr( psz_afilters, "compressor" ) ];
547 free( psz_afilters );
550 [o_comp_enable_ckb setState: NSOffState];
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]]];
568 - (IBAction)resetCompressorValues:(id)sender
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 );
578 audio_output_t * p_aout = getAout();
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 );
589 [self resetCompressor];
592 - (IBAction)comp_enable:(id)sender
594 [self setAudioFilter:"compressor" on:[sender state]];
597 - (IBAction)comp_sliderUpdated:(id)sender
599 audio_output_t * p_aout = getAout();
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";
617 var_SetFloat( p_aout, value, [sender floatValue] );
618 vlc_object_release( p_aout );
620 config_PutFloat( p_intf, value, [sender floatValue] );
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]]];
639 #pragma mark Spatializer
640 - (void)resetSpatializer
643 psz_afilters = config_GetPsz( p_intf, "audio-filter" );
645 [o_spat_enable_ckb setState: (NSInteger)strstr( psz_afilters, "spatializer" ) ];
646 free( psz_afilters );
649 [o_spat_enable_ckb setState: NSOffState];
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]]];
663 - (IBAction)resetSpatializerValues:(id)sender
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 );
671 audio_output_t * p_aout = getAout();
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 );
680 [self resetSpatializer];
683 - (IBAction)spat_enable:(id)sender
685 [self setAudioFilter:"spatializer" on:[sender state]];
688 - (IBAction)spat_sliderUpdated:(id)sender
690 audio_output_t * p_aout = getAout();
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";
704 var_SetFloat( p_aout, value, [sender floatValue] );
705 vlc_object_release( p_aout );
707 config_PutFloat( p_intf, value, [sender floatValue] );
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]]];
723 - (void)resetAudioFilters
726 psz_afilters = config_GetPsz( p_intf, "audio-filter" );
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 );
733 [o_filter_headPhone_ckb setState: NSOffState];
734 [o_filter_normLevel_ckb setState: NSOffState];
736 [o_filter_normLevel_sld setFloatValue: config_GetFloat( p_intf, "norm-max-level" )];
739 - (IBAction)filter_enableHeadPhoneVirt:(id)sender
741 [self setAudioFilter: "headphone" on:[sender state]];
744 - (IBAction)filter_enableVolumeNorm:(id)sender
746 [self setAudioFilter: "normvol" on:[sender state]];
749 - (IBAction)filter_volNormSliderUpdated:(id)sender
751 audio_output_t * p_aout= getAout();
755 var_SetFloat( p_aout, "norm-max-level", [o_filter_normLevel_sld floatValue] );
756 vlc_object_release( p_aout );
759 config_PutFloat( p_intf, "norm-max-level", [o_filter_normLevel_sld floatValue] );