📄 equalizer.m
字号:
/***************************************************************************** * equalizer.m: MacOS X interface module ***************************************************************************** * Copyright (C) 2004-2008 the VideoLAN team * $Id: 78adadd89f881f6ebf56e8b2f5a47a3ab889a5f7 $ * * Authors: Jérôme Decoodt <djc@videolan.org> * Felix Paul Kühne <fkuehne -at- videolan -dot- org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************//***************************************************************************** * Preamble *****************************************************************************/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <vlc_aout.h>#include "intf.h"#include <math.h>#include "equalizer.h"#include "../../audio_filter/equalizer_presets.h"/***************************************************************************** * VLCEqualizer implementation *****************************************************************************/@implementation VLCEqualizerstatic void ChangeFiltersString( intf_thread_t *p_intf, char *psz_name, bool b_add ){ char *psz_parser, *psz_string; int i; vlc_object_t *p_object = vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE ); aout_instance_t *p_aout = (aout_instance_t *)p_object; if( !p_object ) { p_object = (vlc_object_t *)pl_Yield( p_intf ); } psz_string = var_GetNonEmptyString( p_object, "audio-filter" ); if( !psz_string ) psz_string = strdup( "" ); psz_parser = strstr( psz_string, psz_name ); if( b_add ) { if( !psz_parser ) { psz_parser = psz_string; asprintf( &psz_string, ( *psz_string ) ? "%s,%s" : "%s%s", psz_string, psz_name ); free( psz_parser ); } else { vlc_object_release( p_object ); return; } } else { if( psz_parser ) { memmove( psz_parser, psz_parser + strlen( psz_name ) + ( *( psz_parser + strlen( psz_name ) ) == ',' ? 1 : 0 ), strlen( psz_parser + strlen( psz_name ) ) + 1 ); if( *( psz_string+strlen( psz_string ) - 1 ) == ',' ) { *( psz_string+strlen( psz_string ) - 1 ) = '\0'; } } else { free( psz_string ); vlc_object_release( p_object ); return; } } var_SetString( p_object, "audio-filter", psz_string ); if( p_aout ) { for( i = 0; i < p_aout->i_nb_inputs; i++ ) { p_aout->pp_inputs[i]->b_restart = true; } } if( (BOOL)config_GetInt( p_object, "macosx-eq-keep" ) == YES ) { /* save changed to config */ config_PutPsz( p_object, "audio-filter", psz_string ); /* save to vlcrc */ config_SaveConfigFile( p_object, "main" ); } free( psz_string ); vlc_object_release( p_object );}static bool GetFiltersStatus( intf_thread_t *p_intf, char *psz_name ){ char *psz_parser, *psz_string; vlc_object_t *p_object = vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE ); if( p_object == NULL ) p_object = (vlc_object_t *)pl_Yield( p_intf ); if( (BOOL)config_GetInt( p_intf, "macosx-eq-keep" ) == YES ) psz_string = config_GetPsz( p_intf, "audio-filter" ); if(! psz_string ) psz_string = var_GetNonEmptyString( p_object, "audio-filter" ); vlc_object_release( p_object ); if( !psz_string ) return false; psz_parser = strstr( psz_string, psz_name ); free( psz_string ); if ( psz_parser ) return true; else return false;}- (void)initStrings{ int i; [o_btn_equalizer setToolTip: _NS("Equalizer")]; [o_ckb_2pass setTitle: _NS("2 Pass")]; [o_ckb_2pass setToolTip: _NS("Apply the " "equalizer filter twice. The effect will be sharper.")]; [o_ckb_enable setTitle: _NS("Enable")]; [o_ckb_enable setToolTip: _NS("Enable the equalizer. Bands can be set " "manually or using a preset.")]; [o_fld_preamp setStringValue: _NS("Preamp")]; [o_popup_presets removeAllItems]; for( i = 0; i < 18 ; i++ ) { [o_popup_presets insertItemWithTitle: _NS(preset_list_text[i]) atIndex: i]; } [o_window setTitle: _NS("Equalizer")]; [self initBandSliders];}- (void)equalizerUpdated{ intf_thread_t *p_intf = VLCIntf; float f_preamp, f_band[10]; char *psz_bands, *psz_bands_init, *p_next; bool b_2p; int i; bool b_enabled = GetFiltersStatus( p_intf, (char *)"equalizer" ); vlc_object_t *p_object = vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE ); if( p_object == NULL ) p_object = (vlc_object_t *)pl_Yield( p_intf ); var_Create( p_object, "equalizer-preamp", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT ); var_Create( p_object, "equalizer-bands", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); psz_bands = var_GetNonEmptyString( p_object, "equalizer-bands" ); if( psz_bands == NULL ) psz_bands = strdup( "0 0 0 0 0 0 0 0 0 0" ); if( (BOOL)config_GetInt( p_intf, "macosx-eq-keep" ) == YES ) { b_2p = (BOOL)config_GetInt( p_object, "equalizer-2pass" ); f_preamp = config_GetFloat( p_object, "equalizer-preamp" ); } else { b_2p = var_GetBool( p_object, "equalizer-2pass" ); f_preamp = var_GetFloat( p_object, "equalizer-preamp" ); } vlc_object_release( p_object ); /* Set the preamp slider */ [o_slider_preamp setFloatValue: f_preamp]; /* Set the bands slider */ psz_bands_init = psz_bands; for( i = 0; i < 10; i++ ) { /* Read dB -20/20 */#ifdef HAVE_STRTOF f_band[i] = strtof( psz_bands, &p_next );#else f_band[i] = (float)strtod( psz_bands, &p_next );#endif if( !p_next || p_next == psz_bands ) break; /* strtof() failed */ if( !*psz_bands ) break; /* end of line */ psz_bands = p_next+1; } free( psz_bands_init ); [self setBandSlidersValues:f_band]; /* Set the the checkboxes */ [o_ckb_enable setState: b_enabled]; [o_ckb_2pass setState: b_2p]; }- (IBAction)bandSliderUpdated:(id)sender{ intf_thread_t *p_intf = VLCIntf; vlc_object_t *p_object = vlc_object_find( p_intf, VLC_OBJECT_AOUT, FIND_ANYWHERE ); if( p_object == NULL ) p_object = (vlc_object_t *)pl_Yield( p_intf ); char psz_values[102]; memset( psz_values, 0, 102 ); /* Write the new bands values */ /* TODO: write a generic code instead of ten times the same thing */ sprintf( psz_values, "%s %.1f", psz_values, [o_slider_band1 floatValue] );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -