contrib: rav1e: update to v0.4.1
[vlc.git] / modules / gui / skins2 / vars / equalizer.cpp
1 /*****************************************************************************
2  * equalizer.cpp
3  *****************************************************************************
4  * Copyright (C) 2003 the VideoLAN team
5  *
6  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21  *****************************************************************************/
22
23 #ifdef HAVE_CONFIG_H
24 # include "config.h"
25 #endif
26
27 #include <vlc_common.h>
28 #include <vlc_aout.h>
29 #include "equalizer.hpp"
30 #include "../utils/var_percent.hpp"
31 #include <ios>
32 #include <iomanip>
33 #include <sstream>
34
35 EqualizerBands::EqualizerBands( intf_thread_t *pIntf ): SkinObject( pIntf ),
36     m_isUpdating( false )
37 {
38     for( int i = 0; i < kNbBands; i++ )
39     {
40         // Create and observe the band variables
41         VarPercent *pVar = new VarPercent( pIntf );
42         m_cBands[i] = VariablePtr( pVar );
43         pVar->set( 0.5f );
44         pVar->addObserver( this );
45     }
46 }
47
48
49 EqualizerBands::~EqualizerBands()
50 {
51     for( int i = 0; i < kNbBands; i++ )
52     {
53         ((VarPercent*)m_cBands[i].get())->delObserver( this );
54     }
55 }
56
57
58 void EqualizerBands::set( std::string bands )
59 {
60     float val = 0.0f;
61     std::stringstream ss( bands );
62
63     m_isUpdating = true;
64     // Parse the string
65     for( int i = 0; i < kNbBands; i++ )
66     {
67         ss >> val;
68         // Set the band value in percent
69         ((VarPercent*)m_cBands[i].get())->set( (val + 20) / 40 );
70     }
71     m_isUpdating = false;
72 }
73
74
75 VariablePtr EqualizerBands::getBand( int band )
76 {
77     return m_cBands[band];
78 }
79
80
81 void EqualizerBands::onUpdate( Subject<VarPercent> &rBand, void *arg )
82 {
83     (void)rBand; (void)arg;
84     vlc_player_t* player = vlc_playlist_GetPlayer( getPL() );
85     audio_output_t* pAout = vlc_player_aout_Hold( player );
86
87     // Make sure we are not called from set()
88     if( !m_isUpdating )
89     {
90         float val;
91         std::stringstream ss;
92         // Write one digit after the floating point
93         ss << std::setprecision( 1 ) << std::setiosflags( std::ios::fixed );
94
95         // Convert the band values to a string
96         val = 40 * ((VarPercent*)m_cBands[0].get())->get() - 20;
97         ss << val;
98         for( int i = 1; i < kNbBands; i++ )
99         {
100             val = 40 * ((VarPercent*)m_cBands[i].get())->get() - 20;
101             ss << " " << val;
102         }
103
104         std::string bands = ss.str();
105
106         config_PutPsz( "equalizer-bands", bands.c_str() );
107         if( pAout )
108         {
109             // Update the audio output
110             var_SetString( pAout, "equalizer-bands", (char*)bands.c_str() );
111         }
112     }
113
114     if( pAout )
115         aout_Release( pAout );
116 }
117
118
119 EqualizerPreamp::EqualizerPreamp( intf_thread_t *pIntf ): VarPercent( pIntf )
120 {
121     // Initial value
122     VarPercent::set( 0.8 );
123 }
124
125
126 void EqualizerPreamp::set( float percentage, bool updateVLC )
127 {
128     vlc_player_t* player = vlc_playlist_GetPlayer( getPL() );
129     audio_output_t* pAout = vlc_player_aout_Hold( player );
130
131     VarPercent::set( percentage );
132
133     // Avoid infinite loop
134     if( updateVLC )
135     {
136         float val = 40 * percentage - 20;
137
138         config_PutFloat( "equalizer-preamp", val );
139         if( pAout )
140         {
141             // Update the audio output
142             var_SetFloat( pAout, "equalizer-preamp", val );
143         }
144     }
145
146     if( pAout )
147         aout_Release( pAout );
148 }