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

多媒体

开发平台:

MultiPlatform

  1. /*****************************************************************************
  2.  * equalizer.m: MacOS X interface module
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 VideoLAN
  5.  * $Id: equalizer.m 8644 2004-09-05 16:53:04Z fkuehne $
  6.  *
  7.  * Authors: Jerome Decoodt <djc@videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  * 
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  22.  *****************************************************************************/
  23. /*****************************************************************************
  24.  * Preamble
  25.  *****************************************************************************/
  26. #include <vlc/vlc.h>
  27. #include <vlc/aout.h>
  28. #include <aout_internal.h>
  29. #include "intf.h"
  30. #include <math.h>
  31. #include "equalizer.h"
  32. #include "../../audio_filter/equalizer_presets.h"
  33. /*****************************************************************************
  34.  * VLCEqualizer implementation 
  35.  *****************************************************************************/
  36. @implementation VLCEqualizer
  37. static void ChangeFiltersString( intf_thread_t *p_intf,
  38.                                  char *psz_name, vlc_bool_t b_add )
  39. {
  40.     char *psz_parser, *psz_string;
  41.     int i;
  42.     vlc_object_t *p_object = vlc_object_find( p_intf,
  43.                                 VLC_OBJECT_AOUT, FIND_ANYWHERE );
  44.     aout_instance_t *p_aout = (aout_instance_t *)p_object;
  45.     if( p_object == NULL )
  46.         p_object = vlc_object_find( p_intf,
  47.                                  VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
  48.     if( p_object == NULL )
  49.         return;
  50.     psz_string = var_GetString( p_object, "audio-filter" );
  51.     if( !psz_string ) psz_string = strdup( "" );
  52.     psz_parser = strstr( psz_string, psz_name );
  53.     if( b_add )
  54.     {
  55.         if( !psz_parser )
  56.         {
  57.             psz_parser = psz_string;
  58.             asprintf( &psz_string, ( *psz_string ) ? "%s,%s" : "%s%s",
  59.                             psz_string, psz_name );
  60.             free( psz_parser );
  61.         }
  62.         else
  63.         {
  64.             return;
  65.         }
  66.     }
  67.     else
  68.     {
  69.         if( psz_parser )
  70.         {
  71.             memmove( psz_parser, psz_parser + strlen( psz_name ) +
  72.                             ( *( psz_parser + strlen( psz_name ) ) == ',' ? 1 : 0 ),
  73.                             strlen( psz_parser + strlen( psz_name ) ) + 1 );
  74.             if( *( psz_string+strlen( psz_string ) - 1 ) == ',' )
  75.             {
  76.                 *( psz_string+strlen( psz_string ) - 1 ) = '';
  77.             }
  78.          }
  79.          else
  80.          {
  81.              free( psz_string );
  82.              return;
  83.          }
  84.     }
  85.     var_SetString( p_object, "audio-filter", psz_string );
  86.     if( p_aout )
  87.     {
  88.         for( i = 0; i < p_aout->i_nb_inputs; i++ )
  89.         {
  90.             p_aout->pp_inputs[i]->b_restart = VLC_TRUE;
  91.         }
  92.     }
  93.     free( psz_string );
  94.     vlc_object_release( p_object );
  95. }
  96. static vlc_bool_t GetFiltersStatus( intf_thread_t *p_intf,
  97.                                  char *psz_name )
  98. {
  99.     char *psz_parser, *psz_string;
  100.     vlc_object_t *p_object = vlc_object_find( p_intf,
  101.                                 VLC_OBJECT_AOUT, FIND_ANYWHERE );
  102.     if( p_object == NULL )
  103.         p_object = vlc_object_find( p_intf,
  104.                                  VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
  105.     if( p_object == NULL )
  106.         return VLC_FALSE;
  107.     psz_string = var_GetString( p_object, "audio-filter" );
  108.     vlc_object_release( p_object );
  109.     if( !psz_string ) return VLC_FALSE;
  110.     psz_parser = strstr( psz_string, psz_name );
  111.     free( psz_string );
  112.     if ( psz_parser )
  113.         return VLC_TRUE;
  114.     else
  115.         return VLC_FALSE;
  116. }
  117. - (void)initStrings
  118. {
  119.     int i;
  120.     [o_btn_equalizer setToolTip: _NS("Equalizer")];
  121.     [o_ckb_2pass setTitle: _NS("2 Pass")];
  122.     [o_ckb_2pass setToolTip: _NS("If you enable this settting, the "
  123.         "equalizer filter will be applied twice. The effect will be sharper.")];
  124.     [o_ckb_enable setTitle: _NS("Enable")];
  125.     [o_ckb_enable setToolTip: _NS("Enable the equalizer. You can either "
  126.         "manually change the bands or use a preset.")];
  127.     [o_fld_preamp setStringValue: _NS("Preamp")];
  128.     [o_popup_presets removeAllItems];
  129.     for( i = 0; i < 18 ; i++ )
  130.     {
  131.         [o_popup_presets insertItemWithTitle: _NS(preset_list[i]) atIndex: i];
  132.     }
  133.     [o_window setTitle: _NS("Equalizer")];
  134.     [o_slider_band1 setFloatValue: 0];
  135.     [o_slider_band2 setFloatValue: 0];
  136.     [o_slider_band3 setFloatValue: 0];
  137.     [o_slider_band4 setFloatValue: 0];
  138.     [o_slider_band5 setFloatValue: 0];
  139.     [o_slider_band6 setFloatValue: 0];
  140.     [o_slider_band7 setFloatValue: 0];
  141.     [o_slider_band8 setFloatValue: 0];
  142.     [o_slider_band9 setFloatValue: 0];
  143.     [o_slider_band10 setFloatValue: 0];
  144.     [o_ckb_enable setState: NSOffState];
  145.     [o_ckb_2pass setState: NSOffState];
  146. }
  147. - (void)equalizerUpdated
  148. {
  149.     intf_thread_t *p_intf = VLCIntf;
  150.     float f_preamp, f_band[10];
  151.     char *psz_bands, *p_next;
  152.     vlc_bool_t b_2p;
  153.     int i;
  154.     vlc_bool_t b_enabled = GetFiltersStatus( p_intf, "equalizer" );
  155.     vlc_object_t *p_object = vlc_object_find( p_intf,
  156.                                 VLC_OBJECT_AOUT, FIND_ANYWHERE );
  157.     if( p_object == NULL )
  158.         p_object = vlc_object_find( p_intf,
  159.                                  VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
  160.     if( p_object == NULL )
  161.         return;
  162.     f_preamp = var_GetFloat( p_object, "equalizer-preamp" );
  163.     psz_bands = var_GetString( p_object, "equalizer-bands" );
  164.     if( !psz_bands )
  165.         psz_bands = strdup( "0 0 0 0 0 0 0 0 0 0" );
  166.     b_2p = var_GetBool( p_object, "equalizer-2pass" );
  167.     vlc_object_release( p_object );
  168. /* Set the preamp slider */
  169.     [o_slider_preamp setFloatValue: f_preamp];
  170. /* Set the bands slider */
  171.     for( i = 0; i < 10; i++ )
  172.     {
  173.         /* Read dB -20/20 */
  174. #ifdef HAVE_STRTOF
  175.         f_band[i] = strtof( psz_bands, &p_next );
  176. #else
  177.         f_band[i] = (float)strtod( psz_bands, &p_next );
  178. #endif
  179.         if( !p_next || p_next == psz_bands ) break; /* strtof() failed */
  180.         if( !*psz_bands ) break; /* end of line */
  181.         psz_bands = p_next+1;
  182.     }
  183.     free( psz_bands );
  184.     [o_slider_band1 setFloatValue: f_band[0]];
  185.     [o_slider_band2 setFloatValue: f_band[1]];
  186.     [o_slider_band3 setFloatValue: f_band[2]];
  187.     [o_slider_band4 setFloatValue: f_band[3]];
  188.     [o_slider_band5 setFloatValue: f_band[4]];
  189.     [o_slider_band6 setFloatValue: f_band[5]];
  190.     [o_slider_band7 setFloatValue: f_band[6]];
  191.     [o_slider_band8 setFloatValue: f_band[7]];
  192.     [o_slider_band9 setFloatValue: f_band[8]];
  193.     [o_slider_band10 setFloatValue: f_band[9]];
  194. /* Set the the checkboxes */
  195.     if( b_enabled == VLC_TRUE )
  196.         [o_ckb_enable setState:NSOnState];
  197.     else
  198.         [o_ckb_enable setState:NSOffState];
  199.     [o_ckb_2pass setState:( ( b_2p == VLC_TRUE ) ? NSOnState : NSOffState )];
  200. }
  201. - (IBAction)bandSliderUpdated:(id)sender
  202. {
  203.     intf_thread_t *p_intf = VLCIntf;
  204.     vlc_object_t *p_object = vlc_object_find( p_intf,
  205.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE );
  206.     char psz_values[102];
  207.     memset( psz_values, 0, 102 );
  208.     if( p_object == NULL )
  209.         p_object = vlc_object_find( p_intf,
  210.                                  VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
  211.     if( p_object == NULL )
  212.         return;
  213.     /* Write the new bands values */
  214. /* TODO: write a generic code instead of ten times the same thing */
  215.     sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band1 floatValue] );
  216.     sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band2 floatValue] );
  217.     sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band3 floatValue] );
  218.     sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band4 floatValue] );
  219.     sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band5 floatValue] );
  220.     sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band6 floatValue] );
  221.     sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band7 floatValue] );
  222.     sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band8 floatValue] );
  223.     sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band9 floatValue] );
  224.     sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band10 floatValue] );
  225.     var_SetString( p_object, "equalizer-bands", psz_values );
  226.     vlc_object_release( p_object );
  227. }
  228. - (IBAction)changePreset:(id)sender
  229. {
  230.     intf_thread_t *p_intf = VLCIntf;
  231.     int i;
  232.     vlc_object_t *p_object= vlc_object_find( p_intf,
  233.                                 VLC_OBJECT_AOUT, FIND_ANYWHERE );
  234.     char psz_values[102];
  235.     memset( psz_values, 0, 102 );
  236.     if( p_object == NULL )
  237.         p_object = vlc_object_find( p_intf,
  238.                                  VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
  239.     if( p_object == NULL )
  240.         return;
  241.     var_SetString( p_object , "equalizer-preset" , preset_list[[sender indexOfSelectedItem]] );
  242.     for( i = 0; i < 10; i++ )
  243.         sprintf( psz_values, "%s %.1f", psz_values, eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[i] );
  244.     var_SetString( p_object, "equalizer-bands", psz_values );
  245.     var_SetFloat( p_object, "equalizer-preamp", eqz_preset_10b[[sender indexOfSelectedItem]]->f_preamp);
  246.     [o_slider_preamp setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_preamp];
  247.     [o_slider_band1 setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[0]];
  248.     [o_slider_band2 setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[1]];
  249.     [o_slider_band3 setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[2]];
  250.     [o_slider_band4 setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[3]];
  251.     [o_slider_band5 setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[4]];
  252.     [o_slider_band6 setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[5]];
  253.     [o_slider_band7 setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[6]];
  254.     [o_slider_band8 setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[7]];
  255.     [o_slider_band9 setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[8]];
  256.     [o_slider_band10 setFloatValue: eqz_preset_10b[[sender indexOfSelectedItem]]->f_amp[9]];
  257.     vlc_object_release( p_object );
  258. }
  259. - (IBAction)enable:(id)sender
  260. {
  261.     ChangeFiltersString( VLCIntf, "equalizer", [sender state] );
  262. }
  263. - (IBAction)preampSliderUpdated:(id)sender
  264. {
  265.     intf_thread_t *p_intf = VLCIntf;
  266.     float f_preamp = [sender floatValue] ;
  267.     vlc_object_t *p_object = vlc_object_find( p_intf,
  268.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE );
  269.     if( p_object == NULL )
  270.         p_object = vlc_object_find( p_intf,
  271.                                  VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
  272.     if( p_object == NULL )
  273.         return;
  274.     var_SetFloat( p_object, "equalizer-preamp", f_preamp );
  275.     vlc_object_release( p_object );
  276. }
  277. - (IBAction)toggleWindow:(id)sender
  278. {
  279.     if( [o_window isVisible] )
  280.     {
  281.         [o_window orderOut:sender];
  282.         [o_btn_equalizer setState:NSOffState];
  283.     }
  284.     else
  285.     {
  286.         [o_window makeKeyAndOrderFront:sender];
  287.         [o_btn_equalizer setState:NSOnState];
  288.     }
  289. }
  290. - (IBAction)twopass:(id)sender
  291. {
  292.     intf_thread_t *p_intf = VLCIntf;
  293.     vlc_bool_t b_2p = [sender state] ? VLC_TRUE : VLC_FALSE;
  294.     vlc_object_t *p_object= vlc_object_find( p_intf,
  295.                                  VLC_OBJECT_AOUT, FIND_ANYWHERE );
  296.     aout_instance_t *p_aout = (aout_instance_t *)p_object;
  297.     if( p_object == NULL )
  298.         p_object = vlc_object_find( p_intf,
  299.                                  VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
  300.     if( p_object == NULL )
  301.         return;
  302.     var_SetBool( p_object, "equalizer-2pass", b_2p );
  303.     if( ( [o_ckb_enable state] ) && ( p_aout != NULL ) )
  304.     {
  305.        int i;
  306.         for( i = 0; i < p_aout->i_nb_inputs; i++ )
  307.         {
  308.             p_aout->pp_inputs[i]->b_restart = VLC_TRUE;
  309.         }
  310.     }
  311.     vlc_object_release( p_object );
  312. }
  313. - (void)windowWillClose:(NSNotification *)aNotification
  314. {
  315.     [o_btn_equalizer setState: NSOffState];
  316. }
  317. - (void)awakeFromNib
  318. {
  319.     [o_window setExcludedFromWindowsMenu: TRUE];
  320.     
  321.     [self initStrings];
  322.     [self equalizerUpdated];
  323. }
  324. @end