extended.m
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:27k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * extended.m: MacOS X Extended interface panel
  3.  *****************************************************************************
  4.  * Copyright (C) 2005-2008 the VideoLAN team
  5.  * $Id: 7b182e881273e1afa6d5aa3313eb527e2191542b $
  6.  *
  7.  * Authors: Felix Paul Kühne <fkuehne@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #import "extended.h"
  27. #import "vout.h"
  28. #import <vlc_aout.h>
  29. #import <vlc_vout.h>
  30. #import <vlc_interface.h>
  31. /*****************************************************************************
  32.  * VLCExtended implementation
  33.  *****************************************************************************/
  34. @implementation VLCExtended
  35. static VLCExtended *_o_sharedInstance = nil;
  36. + (VLCExtended *)sharedInstance
  37. {
  38.     return _o_sharedInstance ? _o_sharedInstance : [[self alloc] init];
  39. }
  40. - (id)init
  41. {
  42.     if (_o_sharedInstance) {
  43.         [self dealloc];
  44.     } else {
  45.         _o_sharedInstance = [super init];
  46.     }
  47.     return _o_sharedInstance;
  48. }
  49. /*****************************************************************************
  50.  * GUI methods
  51.  *****************************************************************************/
  52. - (void)initStrings
  53. {
  54.     /* localise GUI-strings */
  55.     /* method is called from intf.m (in method showExtended) */
  56.     [o_extended_window setTitle: _NS("Extended controls")];
  57.     [o_btn_vidFlts_mrInfo setToolTip: _NS("Shows more information about the available video filters.")];
  58.     [o_ckb_wave setTitle: _NS("Wave")];
  59.     [o_ckb_ripple setTitle: _NS("Ripple")];
  60.     [o_ckb_psycho setTitle: _NS("Psychedelic")];
  61.     [o_ckb_gradient setTitle: _NS("Gradient")];
  62.     [o_lbl_general setStringValue: _NS("General editing filters")];
  63.     [o_lbl_distort setStringValue: _NS("Distortion filters")];
  64.     [o_ckb_blur setTitle: _NS("Blur")];
  65.     [o_ckb_blur setToolTip: _NS("Adds motion blurring to the image")];
  66.     [o_ckb_imgClone setTitle: _NS("Image clone")];
  67.     [o_ckb_imgClone setToolTip: _NS("Creates several copies of the Video "
  68.                                     "output window" )];
  69.     [o_ckb_imgCrop setTitle: _NS("Image cropping")];
  70.     [o_ckb_imgCrop setToolTip: _NS("Crops a defined part of the image")];
  71.     [o_ckb_imgInvers setTitle: _NS("Invert colors")];
  72.     [o_ckb_imgInvers setToolTip: _NS("Inverts the colors of the image")];
  73.     [o_ckb_trnsform setTitle: _NS("Transformation")];
  74.     [o_ckb_trnsform setToolTip: _NS("Rotates or flips the image")];
  75.     [o_ckb_intZoom setTitle: _NS("Interactive Zoom")];
  76.     [o_ckb_intZoom setToolTip: _NS("Enables an interactive Zoom feature")];
  77.     [o_ckb_vlme_norm setTitle: _NS("Volume normalization")];
  78.     [o_ckb_vlme_norm setToolTip: _NS("Prevents the audio output from going "
  79.                                      "over a predefined value.")];
  80.     [o_ckb_hdphnVirt setTitle: _NS("Headphone virtualization")];
  81.     [o_ckb_hdphnVirt setToolTip: _NS("Imitates the effect of surround sound "
  82.                                      "when using headphones.")];
  83.     [o_lbl_maxLevel setStringValue: _NS("Maximum level")];
  84.     [o_btn_rstrDefaults setTitle: _NS("Restore Defaults")];
  85.     [o_ckb_enblAdjustImg setTitle: _NS("Enable")];
  86.     [o_lbl_brightness setStringValue: _NS("Brightness")];
  87.     [o_lbl_contrast setStringValue: _NS("Contrast")];
  88.     [o_lbl_gamma setStringValue: _NS("Gamma")];
  89.     [o_lbl_hue setStringValue: _NS("Hue")];
  90.     [o_lbl_saturation setStringValue: _NS("Saturation")];
  91.     [o_lbl_opaque setStringValue: _NS("Opaqueness")];
  92.  
  93. }
  94. - (void)awakeFromNib
  95. {
  96.     /* set the adjust-filter-sliders to the values from the prefs and enable
  97.      * them, if wanted */
  98.     char * psz_vfilters;
  99.     intf_thread_t * p_intf = VLCIntf;
  100.     psz_vfilters = config_GetPsz( p_intf, "vout-filter" );
  101.     /* set the video-filter-checkboxes to the correct values */
  102.     if( psz_vfilters )
  103.     {
  104.         [o_ckb_blur setState: (NSInteger)strstr( psz_vfilters, "motionblur")];
  105.         [o_ckb_imgClone setState: (NSInteger)strstr( psz_vfilters, "clone")];
  106.         [o_ckb_imgCrop setState: (NSInteger)strstr( psz_vfilters, "crop")];
  107.         [o_ckb_trnsform setState: (NSInteger)strstr( psz_vfilters, "transform")];
  108.         [o_ckb_intZoom setState: (NSInteger)strstr( psz_vfilters, "magnify")];
  109.         free( psz_vfilters );
  110.     }
  111.  
  112.     /* set the video-filter checkboxes to the correct values */
  113.     char * psz_vifilters;
  114.     psz_vifilters = config_GetPsz( p_intf, "video-filter" );
  115.     if( psz_vifilters && strstr( psz_vifilters, "adjust" ) )
  116.     {
  117.         [o_ckb_enblAdjustImg setState: NSOnState];
  118.         [o_btn_rstrDefaults setEnabled: YES];
  119.         [o_sld_brightness setEnabled: YES];
  120.         [o_sld_contrast setEnabled: YES];
  121.         [o_sld_gamma setEnabled: YES];
  122.         [o_sld_hue setEnabled: YES];
  123.         [o_sld_saturation setEnabled: YES];
  124.     }
  125.     else
  126.     {
  127.         [o_ckb_enblAdjustImg setState: NSOffState];
  128.         [o_btn_rstrDefaults setEnabled: NO];
  129.         [o_sld_brightness setEnabled: NO];
  130.         [o_sld_contrast setEnabled: NO];
  131.         [o_sld_gamma setEnabled: NO];
  132.         [o_sld_hue setEnabled: NO];
  133.         [o_sld_saturation setEnabled: NO];
  134.     }
  135.     if( psz_vifilters )
  136.     {
  137.         [o_ckb_wave setState: (NSInteger)strstr( psz_vifilters, "wave")];
  138.         [o_ckb_psycho setState: (NSInteger)strstr( psz_vifilters, "psychedelic")];
  139.         [o_ckb_ripple setState: (NSInteger)strstr( psz_vifilters, "ripple")];
  140.         [o_ckb_gradient setState: (NSInteger)strstr( psz_vifilters, "gradient")];
  141.         [o_ckb_imgInvers setState: (NSInteger)strstr( psz_vifilters, "invert")];
  142.         free( psz_vifilters );
  143.     }
  144.  
  145.     /* set the audio-filter-checkboxes to the values taken from the prefs */
  146.     char * psz_afilters;
  147.     psz_afilters = config_GetPsz( p_intf, "audio-filter" );
  148.     if( psz_afilters )
  149.     {
  150.         [o_ckb_hdphnVirt setState: (NSInteger)strstr( psz_afilters, "headphone" ) ];
  151.         [o_ckb_vlme_norm setState: (NSInteger)strstr( psz_afilters, "normvol" ) ];
  152.  
  153.         free( psz_afilters );
  154.     }
  155.     /* fill the popup button according to our available views */
  156.     [o_selector_pop removeAllItems];
  157.     [o_selector_pop addItemWithTitle: _NS("Adjust Image")];
  158.     [o_selector_pop addItemWithTitle: _NS("Video Filter")];
  159.     [o_selector_pop addItemWithTitle: _NS("Audio Filter")];
  160.     [o_selector_pop selectItemAtIndex: 0];
  161.     /* make sure we draw a view on launch */
  162.     [self viewSelectorAction: self];
  163.     [self initStrings];
  164. }
  165. - (BOOL)configChanged
  166. {
  167.     return o_config_changed;
  168. }
  169. - (void)showPanel
  170. {
  171.     /* get the correct slider values from the prefs, in case they were changed
  172.      * elsewhere */
  173.     intf_thread_t * p_intf = VLCIntf;
  174.     int i_value = config_GetInt( p_intf, "hue" );
  175.     if( i_value > 0 && i_value < 360 )
  176.     {
  177.         [o_sld_hue setIntValue: i_value];
  178.     }
  179.     float f_value;
  180.  
  181.     f_value = config_GetFloat( p_intf, "saturation" );
  182.     if( f_value > 0 && f_value < 5 )
  183.         [o_sld_saturation setIntValue: (int)(100 * f_value) ];
  184.     f_value = config_GetFloat( p_intf, "contrast" );
  185.     if( f_value > 0 && f_value < 4 )
  186.         [o_sld_contrast setIntValue: (int)(100 * f_value) ];
  187.     f_value = config_GetFloat( p_intf, "brightness" );
  188.     if( f_value > 0 && f_value < 2 )
  189.         [o_sld_brightness setIntValue: (int)(100 * f_value) ];
  190.     f_value = config_GetFloat( p_intf, "gamma" );
  191.     if( f_value > 0 && f_value < 10 )
  192.         [o_sld_gamma setIntValue: (int)(10 * f_value) ];
  193.     f_value = config_GetFloat( p_intf, "norm-max-level" );
  194.     if( f_value > 0 && f_value < 10 )
  195.         [o_sld_maxLevel setFloatValue: f_value ];
  196.     [o_sld_opaque setFloatValue: (config_GetFloat( p_intf,
  197.         "macosx-opaqueness") * 100)];
  198.     /* show the window */
  199.     [o_extended_window displayIfNeeded];
  200.     [o_extended_window makeKeyAndOrderFront:nil];
  201. }
  202. - (IBAction)viewSelectorAction:(id)sender
  203. {
  204.     NSView *o_toBeShown_view;
  205.     /* check which view to show */
  206.     if( [[[o_selector_pop selectedItem] title] isEqualToString: _NS("Adjust Image")] )
  207.         o_toBeShown_view = o_adjustImg_view;
  208.     else if( [[[o_selector_pop selectedItem] title] isEqualToString: _NS("Audio Filter")] )
  209.         o_toBeShown_view = o_audioFlts_view;
  210.     else if( [[[o_selector_pop selectedItem] title] isEqualToString: _NS("Video Filter")] )
  211.         o_toBeShown_view = o_videoFilters_view;
  212.     else
  213.         msg_Err( VLCIntf, "invalid ui view requested" );
  214.     
  215.     NSRect o_win_rect, o_view_rect, o_old_view_rect;
  216.     o_win_rect = [o_extended_window frame];
  217.     o_view_rect = [o_toBeShown_view frame];
  218.     
  219.     if( o_currentlyshown_view != nil )
  220.     {
  221.         /* restore our window's height, if we've shown another category previously */
  222.         o_old_view_rect = [o_currentlyshown_view frame];
  223.         o_win_rect.size.height = o_win_rect.size.height - o_old_view_rect.size.height;
  224.         o_win_rect.origin.y = ( o_win_rect.origin.y + o_old_view_rect.size.height ) - o_view_rect.size.height;
  225.         
  226.         /* remove our previous category view */
  227.         [o_currentlyshown_view removeFromSuperviewWithoutNeedingDisplay];
  228.     }
  229.     
  230.     o_win_rect.size.height = o_win_rect.size.height + o_view_rect.size.height;
  231.     
  232.     //[o_extended_window displayIfNeeded];
  233.     [o_extended_window setFrame: o_win_rect display:YES animate: YES];
  234.     
  235.     [o_toBeShown_view setFrame: NSMakeRect( 0, 
  236.                                               0, //[o_top_controls_box frame].size.height, 
  237.                                               o_view_rect.size.width, 
  238.                                               o_view_rect.size.height )];
  239.     [o_toBeShown_view setNeedsDisplay: YES];
  240.     [o_toBeShown_view setAutoresizesSubviews: YES];
  241.     [[o_extended_window contentView] addSubview: o_toBeShown_view];
  242.     /* keep our current category for further reference */
  243.     [o_currentlyshown_view release];
  244.     o_currentlyshown_view = o_toBeShown_view;
  245.     [o_currentlyshown_view retain];
  246. }
  247. - (IBAction)enableAdjustImage:(id)sender
  248. {
  249.     /* en-/disable the sliders */
  250.     if ([o_ckb_enblAdjustImg state] == NSOnState)
  251.     {
  252.         [o_btn_rstrDefaults setEnabled: YES];
  253.         [o_sld_brightness setEnabled: YES];
  254.         [o_sld_contrast setEnabled: YES];
  255.         [o_sld_gamma setEnabled: YES];
  256.         [o_sld_hue setEnabled: YES];
  257.         [o_sld_saturation setEnabled: YES];
  258.         [self changeVideoFiltersString: "adjust" onOrOff: true];
  259.     }
  260.     else
  261.     {
  262.         [o_btn_rstrDefaults setEnabled: NO];
  263.         [o_sld_brightness setEnabled: NO];
  264.         [o_sld_contrast setEnabled: NO];
  265.         [o_sld_gamma setEnabled: NO];
  266.         [o_sld_hue setEnabled: NO];
  267.         [o_sld_saturation setEnabled: NO];
  268.         [self changeVideoFiltersString: "adjust" onOrOff: false];
  269.     }
  270. }
  271. - (IBAction)restoreDefaultsForAdjustImage:(id)sender
  272. {
  273.     /* reset the sliders */
  274.     [o_sld_brightness setIntValue: 100];
  275.     [o_sld_contrast setIntValue: 100];
  276.     [o_sld_gamma setIntValue: 10];
  277.     [o_sld_hue setIntValue: 0];
  278.     [o_sld_saturation setIntValue: 100];
  279.     [o_sld_opaque setIntValue: 100];
  280.     /* transmit the values */
  281.     [self sliderActionAdjustImage: o_sld_brightness];
  282.     [self sliderActionAdjustImage: o_sld_contrast];
  283.     [self sliderActionAdjustImage: o_sld_gamma];
  284.     [self sliderActionAdjustImage: o_sld_hue];
  285.     [self sliderActionAdjustImage: o_sld_saturation];
  286.     [self opaqueSliderAction: o_sld_opaque];
  287. }
  288. - (IBAction)sliderActionAdjustImage:(id)sender
  289. {
  290.     /* read-out the sliders' values and apply them */
  291.     intf_thread_t * p_intf = VLCIntf;
  292.     vout_thread_t *p_vout = (vout_thread_t *)vlc_object_find(p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE);
  293.     vlc_object_t *p_filter;
  294.     if( p_vout == NULL )
  295.     {
  296.         msg_Dbg( p_intf, "no vout present, saving settings anyway" );
  297.         if (sender == o_sld_brightness)
  298.         {
  299.             config_PutFloat( p_intf , "brightness" , [o_sld_brightness floatValue] / 100);
  300.         } 
  301.         else if (sender == o_sld_contrast)
  302.         {
  303.             config_PutFloat( p_intf , "contrast" , [o_sld_contrast floatValue] / 100);
  304.         } 
  305.         else if (sender == o_sld_gamma)
  306.         {
  307.             config_PutFloat( p_intf , "gamma" , [o_sld_gamma floatValue] / 10);
  308.         } 
  309.         else if (sender == o_sld_hue)
  310.         {
  311.             config_PutInt( p_intf , "hue" , [o_sld_hue intValue]);
  312.         } 
  313.         else if (sender == o_sld_saturation)
  314.         {
  315.             config_PutFloat( p_intf , "saturation" , [o_sld_saturation floatValue] / 100);
  316.         } 
  317.         else
  318.         {
  319.             msg_Warn( p_intf, "the corresponding subfilter coundn't be found" );
  320.         }
  321.     } 
  322.     else
  323.     {
  324.         msg_Dbg( p_intf, "we found a vout to adjust, let's look for the filter" );
  325.         p_filter = (vlc_object_t *)vlc_object_find_name( p_intf, "adjust", FIND_ANYWHERE );
  326.         if(! p_filter )
  327.         {
  328.             msg_Err( p_intf, "we're unable to find the adjust filter!" );
  329.             vlc_object_release( p_vout );
  330.             return;
  331.         }
  332.         if (sender == o_sld_brightness)
  333.         {
  334.             var_SetFloat( p_filter, "brightness", [o_sld_brightness floatValue] / 100 );
  335.             config_PutFloat( p_intf, "brightness", [o_sld_brightness floatValue] / 100 );
  336.         } 
  337.         else if (sender == o_sld_contrast)
  338.         {
  339.             var_SetFloat( p_filter, "contrast", [o_sld_contrast floatValue] / 100 );
  340.             config_PutFloat( p_intf, "contrast", [o_sld_contrast floatValue] / 100 );
  341.         } 
  342.         else if (sender == o_sld_gamma)
  343.         {
  344.             var_SetFloat( p_filter, "gamma", [o_sld_gamma floatValue] / 10 );
  345.             config_PutFloat( p_intf, "gamma", [o_sld_gamma floatValue] / 10 );
  346.         } 
  347.         else if (sender == o_sld_hue)
  348.         {
  349.             var_SetInteger( p_filter, "hue", [o_sld_hue intValue] );
  350.             config_PutInt( p_intf , "hue" , [o_sld_hue intValue] );
  351.         } 
  352.         else if (sender == o_sld_saturation)
  353.         {
  354.             var_SetFloat( p_filter, "saturation", [o_sld_saturation floatValue] / 100 );
  355.             config_PutFloat( p_intf , "saturation" , [o_sld_saturation floatValue] / 100 );
  356.         } 
  357.         else
  358.         {
  359.             msg_Warn( p_intf, "couldn't find variable for slider!" );
  360.         }
  361.         vlc_object_release( p_filter );
  362.         vlc_object_release( p_vout );
  363.     }
  364.     o_config_changed = YES;
  365. }
  366. /* change the opaqueness of the vouts */
  367. - (IBAction)opaqueSliderAction:(id)sender
  368. {
  369.     vlc_value_t val;
  370.     id o_window = [NSApp keyWindow];
  371.     NSArray *o_windows = [NSApp orderedWindows];
  372.     NSEnumerator *o_enumerator = [o_windows objectEnumerator];
  373.     playlist_t * p_playlist = pl_Hold( VLCIntf );
  374.     vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, FIND_ANYWHERE );
  375.     vout_thread_t *p_real_vout;
  376.     val.f_float = [o_sld_opaque floatValue] / 100;
  377.     if( p_vout != NULL )
  378.     {
  379.         p_real_vout = [VLCVoutView realVout: p_vout];
  380.         var_Set( p_real_vout, "macosx-opaqueness", val );
  381.         while ((o_window = [o_enumerator nextObject]))
  382.         {
  383.             if( [[o_window className] isEqualToString: @"VLCVoutWindow"] ||
  384.                 [[[VLCMain sharedInstance] embeddedList]
  385.                                     windowContainsEmbedded: o_window])
  386.             {
  387.                 [o_window setAlphaValue: val.f_float];
  388.             }
  389.             break;
  390.         }
  391.         vlc_object_release( p_vout );
  392.     }
  393.     /* store to prefs */
  394.     config_PutFloat( p_playlist , "macosx-opaqueness" , val.f_float );
  395.     pl_Release( VLCIntf );
  396.     o_config_changed = YES;
  397. }
  398. - (IBAction)enableHeadphoneVirtualizer:(id)sender
  399. {
  400.     /* en-/disable headphone virtualisation */
  401.     if ([o_ckb_hdphnVirt state] == NSOnState)
  402.         [self changeAFiltersString: "headphone_channel_mixer" onOrOff: true ];
  403.     else
  404.         [self changeAFiltersString: "headphone_channel_mixer" onOrOff: false ];
  405. }
  406. - (IBAction)sliderActionMaximumAudioLevel:(id)sender
  407. {
  408.     /* read-out the slider's value and apply it */
  409.     intf_thread_t * p_intf = VLCIntf;
  410.     aout_instance_t * p_aout= (aout_instance_t *)vlc_object_find(p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE);
  411.     if( p_aout != NULL )
  412.     {
  413.         var_SetFloat( p_aout, "norm-max-level", [o_sld_maxLevel floatValue] );
  414.         vlc_object_release( p_aout );
  415.     }
  416.     config_PutFloat( p_intf, "norm-max-level", [o_sld_maxLevel floatValue] );
  417.     o_config_changed = YES;
  418. }
  419. - (IBAction)enableVolumeNormalization:(id)sender
  420. {
  421.     /* en-/disable volume normalisation */
  422.     if( [o_ckb_vlme_norm state] == NSOnState )
  423.         [self changeAFiltersString: "normvol" onOrOff: YES ];
  424.     else
  425.         [self changeAFiltersString: "normvol" onOrOff: NO ];
  426. }
  427. - (IBAction)videoFilterAction:(id)sender
  428. {
  429.     /* en-/disable video filters */
  430.     if (sender == o_ckb_blur)
  431.         [self changeVideoFiltersString: "motionblur" onOrOff: [o_ckb_blur state]];
  432.     else if (sender == o_ckb_imgClone)
  433.         [self changeVoutFiltersString: "clone" onOrOff: [o_ckb_imgClone state]];
  434.     else if (sender == o_ckb_imgCrop)
  435.         [self changeVoutFiltersString: "crop" onOrOff: [o_ckb_imgCrop state]];
  436.     else if (sender == o_ckb_imgInvers)
  437.         [self changeVideoFiltersString: "invert" onOrOff: [o_ckb_imgInvers state]];
  438.     else if (sender == o_ckb_trnsform)
  439.         [self changeVoutFiltersString: "transform" onOrOff: [o_ckb_trnsform state]];
  440.     else if (sender == o_ckb_intZoom )
  441.         [self changeVoutFiltersString: "magnify" onOrOff: [o_ckb_intZoom state]];
  442.     else if (sender == o_ckb_wave )
  443.         [self changeVideoFiltersString: "wave" onOrOff: [o_ckb_wave state]];
  444.     else if (sender == o_ckb_gradient )
  445.         [self changeVideoFiltersString: "gradient" onOrOff: [o_ckb_gradient state]];
  446.     else if (sender == o_ckb_psycho )
  447.         [self changeVideoFiltersString: "psychedelic" onOrOff: [o_ckb_psycho state]];
  448.     else if (sender == o_ckb_ripple )
  449.         [self changeVideoFiltersString: "ripple" onOrOff: [o_ckb_ripple state]];
  450.     else
  451.         msg_Err( VLCIntf, "cannot find switched video-filter" ); /* this can't happen */
  452. }
  453. - (IBAction)moreInfoVideoFilters:(id)sender
  454. {
  455.     /* show info sheet */
  456.     NSBeginInformationalAlertSheet(_NS("About the video filters"), 
  457.                                    _NS("OK"), 
  458.                                    @"", 
  459.                                    @"",
  460.                                    o_extended_window, 
  461.                                    nil, 
  462.                                    nil, 
  463.                                    nil, 
  464.                                    nil, 
  465.                                    _NS("This panel allows on-the-fly selection of various video effects.n"
  466.                                        "These filters can be configured individually in the Preferences, in "
  467.                                        "the subsections of Video/Filters.n"
  468.                                        "To choose the order in which the filter are applied, a filter "
  469.                                        "option string can be set in the Preferences, Video / Filters section."));
  470. }
  471. /*****************************************************************************
  472.  * methods to communicate changes to VLC's core
  473.  *****************************************************************************/
  474. - (void)changeVoutFiltersString:(char *)psz_name onOrOff:(bool )b_add
  475. {
  476.     /* copied from ../wxwidgets/extrapanel.cpp
  477.      * renamed to conform with Cocoa's rules */
  478.     /* this method only changes 1st generation video filters (the ones that
  479.      * can't be used for transcoding). Have a look at changeVideoFiltersString
  480.      * for the 2nd generation filters. */
  481.  
  482.     vout_thread_t *p_vout;
  483.     intf_thread_t * p_intf = VLCIntf;
  484.  
  485.     char *psz_parser, *psz_string;
  486.     psz_string = config_GetPsz( p_intf, "vout-filter" );
  487.  
  488.     if( !psz_string ) psz_string = strdup("");
  489.     psz_parser = strstr( psz_string, psz_name );
  490.     if( b_add )
  491.     {
  492.         if( !psz_parser )
  493.         {
  494.             psz_parser = psz_string;
  495.             asprintf( &psz_string, (*psz_string) ? "%s:%s" : "%s%s",
  496.                             psz_string, psz_name );
  497.             free( psz_parser );
  498.         }
  499.         else
  500.         {
  501.             return;
  502.         }
  503.     }
  504.     else
  505.     {
  506.         if( psz_parser )
  507.         {
  508.             memmove( psz_parser, psz_parser + strlen(psz_name) +
  509.                             (*(psz_parser + strlen(psz_name)) == ':' ? 1 : 0 ),
  510.                             strlen(psz_parser + strlen(psz_name)) + 1 );
  511.             /* Remove trailing : : */
  512.             if( *(psz_string+strlen(psz_string ) -1 ) == ':' )
  513.             {
  514.                 *(psz_string+strlen(psz_string ) -1 ) = '';
  515.             }
  516.          }
  517.          else
  518.          {
  519.              free( psz_string );
  520.              return;
  521.          }
  522.     }
  523.     /* Vout is not kept, so put that in the config */
  524.     config_PutPsz( p_intf, "vout-filter", psz_string );
  525.     /* Try to set on the fly */
  526.     p_vout = (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
  527.                                               FIND_ANYWHERE );
  528.     if( p_vout )
  529.     {
  530.         var_SetString( p_vout, "vout-filter", psz_string );
  531.         vlc_object_release( p_vout );
  532.     }
  533.     free( psz_string );
  534.     o_config_changed = YES;
  535. }
  536. - (void)changeVideoFiltersString:(char *)psz_name onOrOff:(bool )b_add
  537. {
  538.     /* same as changeVoutFiltersString but addressing the "video-filter"
  539.      * variable which represents the video filter 2 modules */
  540.  
  541.     vout_thread_t *p_vout;
  542.     intf_thread_t * p_intf = VLCIntf;
  543.  
  544.     char *psz_parser, *psz_string;
  545.     psz_string = config_GetPsz( p_intf, "video-filter" );
  546.  
  547.     if( !psz_string ) psz_string = strdup("");
  548.     psz_parser = strstr( psz_string, psz_name );
  549.     if( b_add )
  550.     {
  551.         if( !psz_parser )
  552.         {
  553.             psz_parser = psz_string;
  554.             asprintf( &psz_string, (*psz_string) ? "%s:%s" : "%s%s",
  555.                             psz_string, psz_name );
  556.             free( psz_parser );
  557.         }
  558.         else
  559.         {
  560.             return;
  561.         }
  562.     }
  563.     else
  564.     {
  565.         if( psz_parser )
  566.         {
  567.             memmove( psz_parser, psz_parser + strlen(psz_name) +
  568.                             (*(psz_parser + strlen(psz_name)) == ':' ? 1 : 0 ),
  569.                             strlen(psz_parser + strlen(psz_name)) + 1 );
  570.             /* Remove trailing : : */
  571.             if( *(psz_string+strlen(psz_string ) -1 ) == ':' )
  572.             {
  573.                 *(psz_string+strlen(psz_string ) -1 ) = '';
  574.             }
  575.          }
  576.          else
  577.          {
  578.              free( psz_string );
  579.              return;
  580.          }
  581.     }
  582.     /* Vout is not kept, so put that in the config */
  583.     config_PutPsz( p_intf, "video-filter", psz_string );
  584.     /* Try to set on the fly */
  585.     p_vout = (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT,
  586.                                               FIND_ANYWHERE );
  587.     if( p_vout )
  588.     {
  589.         var_SetString( p_vout, "video-filter", psz_string );
  590.         vlc_object_release( p_vout );
  591.     }
  592.     free( psz_string );
  593.     o_config_changed = YES;
  594. }
  595. - (void)changeAFiltersString: (char *)psz_name onOrOff: (bool )b_add;
  596. {
  597.     /* copied from ../wxwidgets/extrapanel.cpp
  598.      * renamed to conform with Cocoa's rules */
  599.     char *psz_parser, *psz_string;
  600.     intf_thread_t * p_intf = VLCIntf;
  601.     aout_instance_t * p_aout= (aout_instance_t *)vlc_object_find(p_intf,
  602.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE);
  603.     if( p_aout )
  604.     {
  605.         psz_string = var_GetNonEmptyString( p_aout, "audio-filter" );
  606.     }
  607.     else
  608.     {
  609.         psz_string = config_GetPsz( p_intf, "audio-filter" );
  610.     }
  611.     if( !psz_string ) psz_string = strdup("");
  612.     psz_parser = strstr( psz_string, psz_name );
  613.     if( b_add )
  614.     {
  615.         if( !psz_parser )
  616.         {
  617.             psz_parser = psz_string;
  618.             asprintf( &psz_string, (*psz_string) ? "%s:%s" : "%s%s",
  619.                             psz_string, psz_name );
  620.             free( psz_parser );
  621.         }
  622.         else
  623.         {
  624.             if( p_aout ) vlc_object_release( p_aout );
  625.             return;
  626.         }
  627.     }
  628.     else
  629.     {
  630.         if( psz_parser )
  631.         {
  632.             memmove( psz_parser, psz_parser + strlen(psz_name) +
  633.                             (*(psz_parser + strlen(psz_name)) == ':' ? 1 : 0 ),
  634.                             strlen(psz_parser + strlen(psz_name)) + 1 );
  635.             if( *(psz_string+strlen(psz_string ) -1 ) == ':' )
  636.             {
  637.                 *(psz_string+strlen(psz_string ) -1 ) = '';
  638.             }
  639.          }
  640.          else
  641.          {
  642.              free( psz_string );
  643.              if( p_aout ) vlc_object_release( p_aout );
  644.              return;
  645.          }
  646.     }
  647.     if( p_aout == NULL )
  648.     {
  649.         config_PutPsz( p_intf, "audio-filter", psz_string );
  650.     }
  651.     else
  652.     {
  653.         var_SetString( p_aout, "audio-filter", psz_string );
  654.         int i = 0;
  655.         while( i < p_aout->i_nb_inputs )
  656.         {
  657.             p_aout->pp_inputs[i]->b_restart = true;
  658.             i = (i + 1);
  659.         }
  660.         vlc_object_release( p_aout );
  661.     }
  662.     free( psz_string );
  663.     o_config_changed = YES;
  664. }
  665. - (void)savePrefs
  666. {
  667.     /* save the preferences to make sure that our module-changes will up on
  668.      * next launch again */
  669.     playlist_t * p_playlist = pl_Hold( VLCIntf );
  670.     int returnedValue;
  671.     NSArray * theModules;
  672.     theModules = [[NSArray alloc] initWithObjects: @"main", 
  673.         @"headphone",
  674.         @"transform", 
  675.         @"adjust", 
  676.         @"invert", 
  677.         @"motionblur", 
  678.         @"distort",
  679.         @"clone", 
  680.         @"crop", 
  681.         @"normvol", 
  682.         @"headphone_channel_mixer", 
  683.         @"macosx",
  684.         nil];
  685.     unsigned int x = 0;
  686.  
  687.     while ( x != [theModules count] )
  688.     {
  689.         returnedValue = config_SaveConfigFile( p_playlist, [[theModules
  690.             objectAtIndex: x] UTF8String] );
  691.         if (returnedValue != 0)
  692.         {
  693.             msg_Err(p_playlist, "unable to save the preferences of the "
  694.             "extended control attribute '%s' (%i)",
  695.             [[theModules objectAtIndex: x] UTF8String] , returnedValue);
  696.             [theModules release];
  697.             pl_Release( VLCIntf );
  698.  
  699.             return;
  700.         }
  701.         x = ( x + 1 );
  702.     }
  703.  
  704.     msg_Dbg( VLCIntf, "VLCExtended: saved certain preferences successfully" );
  705.  
  706.     [theModules release];
  707.     pl_Release( VLCIntf );
  708. }
  709. @end