9314e1270eed102a920ba8398739ae1e8760d370
[ardour.git] / libs / ardour / gain_control.cc
1 /*
2     Copyright (C) 2006-2016 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify it
5     under the terms of the GNU General Public License as published by the Free
6     Software Foundation; either version 2 of the License, or (at your option)
7     any later version.
8
9     This program is distributed in the hope that it will be useful, but WITHOUT
10     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12     for more details.
13
14     You should have received a copy of the GNU General Public License along
15     with this program; if not, write to the Free Software Foundation, Inc.,
16     675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #include "ardour/dB.h"
20 #include "ardour/gain_control.h"
21 #include "ardour/session.h"
22
23 #include "i18n.h"
24
25 using namespace ARDOUR;
26 using namespace std;
27
28 GainControl::GainControl (Session& session, const Evoral::Parameter &param, boost::shared_ptr<AutomationList> al)
29         : AutomationControl (session, param, ParameterDescriptor(param),
30                              al ? al : boost::shared_ptr<AutomationList> (new AutomationList (param)),
31                              param.type() == GainAutomation ? X_("gaincontrol") : X_("trimcontrol")) {
32
33         alist()->reset_default (1.0);
34
35         lower_db = accurate_coefficient_to_dB (_desc.lower);
36         range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db;
37 }
38
39 void
40 GainControl::set_value (double val, PBD::Controllable::GroupControlDisposition /* group_override */)
41 {
42         if (writable()) {
43                 set_value_unchecked (val);
44         }
45 }
46
47 void
48 GainControl::set_value_unchecked (double val)
49 {
50         AutomationControl::set_value (std::max (std::min (val, (double)_desc.upper), (double)_desc.lower), Controllable::NoGroup);
51         _session.set_dirty ();
52 }
53
54 double
55 GainControl::internal_to_interface (double v) const
56 {
57         if (_desc.type == GainAutomation) {
58                 return gain_to_slider_position (v);
59         } else {
60                 return (accurate_coefficient_to_dB (v) - lower_db) / range_db;
61         }
62 }
63
64 double
65 GainControl::interface_to_internal (double v) const
66 {
67         if (_desc.type == GainAutomation) {
68                 return slider_position_to_gain (v);
69         } else {
70                 return dB_to_coefficient (lower_db + v * range_db);
71         }
72 }
73
74 double
75 GainControl::internal_to_user (double v) const
76 {
77         return accurate_coefficient_to_dB (v);
78 }
79
80 double
81 GainControl::user_to_internal (double u) const
82 {
83         return dB_to_coefficient (u);
84 }
85
86 std::string
87 GainControl::get_user_string () const
88 {
89         char theBuf[32]; sprintf( theBuf, _("%3.1f dB"), accurate_coefficient_to_dB (get_value()));
90         return std::string(theBuf);
91 }
92