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

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * equalizer.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 the VideoLAN team
  5.  * $Id: 3600017df9090704b545c7e78788937098a1e531 $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  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. #ifdef HAVE_CONFIG_H
  24. # include "config.h"
  25. #endif
  26. #include <vlc_common.h>
  27. #include <vlc_aout.h>
  28. #include "equalizer.hpp"
  29. #include "../utils/var_percent.hpp"
  30. #include <ios>
  31. #include <iomanip>
  32. #include <sstream>
  33. EqualizerBands::EqualizerBands( intf_thread_t *pIntf ): SkinObject( pIntf ),
  34.     m_isUpdating( false )
  35. {
  36.     for( int i = 0; i < kNbBands; i++ )
  37.     {
  38.         // Create and observe the band variables
  39.         VarPercent *pVar = new VarPercent( pIntf );
  40.         m_cBands[i] = VariablePtr( pVar );
  41.         pVar->set( 0.5f );
  42.         pVar->addObserver( this );
  43.     }
  44. }
  45. EqualizerBands::~EqualizerBands()
  46. {
  47.     for( int i = 0; i < kNbBands; i++ )
  48.     {
  49.         ((VarPercent*)m_cBands[i].get())->delObserver( this );
  50.     }
  51. }
  52. void EqualizerBands::set( string bands )
  53. {
  54.     float val;
  55.     stringstream ss( bands );
  56.     m_isUpdating = true;
  57.     // Parse the string
  58.     for( int i = 0; i < kNbBands; i++ )
  59.     {
  60.         ss >> val;
  61.         // Set the band value in percent
  62.         ((VarPercent*)m_cBands[i].get())->set( (val + 20) / 40 );
  63.     }
  64.     m_isUpdating = false;
  65. }
  66. VariablePtr EqualizerBands::getBand( int band )
  67. {
  68.     return m_cBands[band];
  69. }
  70. void EqualizerBands::onUpdate( Subject<VarPercent> &rBand, void *arg )
  71. {
  72.     // Make sure we are not called from set()
  73.     if (!m_isUpdating)
  74.     {
  75.         float val;
  76.         stringstream ss;
  77.         // Write one digit after the floating point
  78.         ss << setprecision( 1 ) << setiosflags( ios::fixed );
  79.         // Convert the band values to a string
  80.         val = 40 * ((VarPercent*)m_cBands[0].get())->get() - 20;
  81.         ss << val;
  82.         for( int i = 1; i < kNbBands; i++ )
  83.         {
  84.             val = 40 * ((VarPercent*)m_cBands[i].get())->get() - 20;
  85.             ss << " " << val;
  86.         }
  87.         string bands = ss.str();
  88.         aout_instance_t *pAout = (aout_instance_t *)vlc_object_find( getIntf(),
  89.                 VLC_OBJECT_AOUT, FIND_ANYWHERE );
  90.         config_PutPsz( getIntf(), "equalizer-bands", bands.c_str() );
  91.         if( pAout )
  92.         {
  93.             // Update the audio output
  94.             var_SetString( pAout, "equalizer-bands", (char*)bands.c_str() );
  95.             vlc_object_release( pAout );
  96.         }
  97.     }
  98. }
  99. EqualizerPreamp::EqualizerPreamp( intf_thread_t *pIntf ): VarPercent( pIntf )
  100. {
  101.     // Initial value
  102.     VarPercent::set( 0.8 );
  103. }
  104. void EqualizerPreamp::set( float percentage, bool updateVLC )
  105. {
  106.     VarPercent::set( percentage );
  107.     // Avoid infinite loop
  108.     if( updateVLC )
  109.     {
  110.         float val = 40 * percentage - 20;
  111.         aout_instance_t *pAout = (aout_instance_t *)vlc_object_find( getIntf(),
  112.                                 VLC_OBJECT_AOUT, FIND_ANYWHERE );
  113.         config_PutFloat( getIntf(), "equalizer-preamp", val );
  114.         if( pAout )
  115.         {
  116.             // Update the audio output
  117.             var_SetFloat( pAout, "equalizer-preamp", val );
  118.             vlc_object_release( pAout );
  119.         }
  120.     }
  121. }