diff options
-rw-r--r-- | libs/ardour/amp.cc | 66 | ||||
-rw-r--r-- | libs/ardour/ardour/amp.h | 28 | ||||
-rw-r--r-- | libs/ardour/ardour/gain_control.h | 55 | ||||
-rw-r--r-- | libs/ardour/automatable.cc | 5 | ||||
-rw-r--r-- | libs/ardour/gain_control.cc | 92 | ||||
-rw-r--r-- | libs/ardour/return.cc | 3 | ||||
-rw-r--r-- | libs/ardour/route.cc | 5 | ||||
-rw-r--r-- | libs/ardour/send.cc | 3 | ||||
-rw-r--r-- | libs/ardour/session.cc | 3 | ||||
-rw-r--r-- | libs/ardour/wscript | 1 | ||||
-rw-r--r-- | libs/surfaces/control_protocol/control_protocol.cc | 1 |
11 files changed, 167 insertions, 95 deletions
diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 1d4ffc1cd7..8dac6d73fc 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -26,6 +26,7 @@ #include "ardour/amp.h" #include "ardour/audio_buffer.h" #include "ardour/buffer_set.h" +#include "ardour/gain_control.h" #include "ardour/midi_buffer.h" #include "ardour/rc_configuration.h" #include "ardour/session.h" @@ -390,71 +391,6 @@ Amp::set_state (const XMLNode& node, int version) return 0; } -Amp::GainControl::GainControl (Session& session, const Evoral::Parameter ¶m, boost::shared_ptr<AutomationList> al) - : AutomationControl (session, param, ParameterDescriptor(param), - al ? al : boost::shared_ptr<AutomationList> (new AutomationList (param)), - param.type() == GainAutomation ? X_("gaincontrol") : X_("trimcontrol")) { - - alist()->reset_default (1.0); - - lower_db = accurate_coefficient_to_dB (_desc.lower); - range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db; -} - -void -Amp::GainControl::set_value (double val, PBD::Controllable::GroupControlDisposition /* group_override */) -{ - if (writable()) { - set_value_unchecked (val); - } -} - -void -Amp::GainControl::set_value_unchecked (double val) -{ - AutomationControl::set_value (std::max (std::min (val, (double)_desc.upper), (double)_desc.lower), Controllable::NoGroup); - _session.set_dirty (); -} - -double -Amp::GainControl::internal_to_interface (double v) const -{ - if (_desc.type == GainAutomation) { - return gain_to_slider_position (v); - } else { - return (accurate_coefficient_to_dB (v) - lower_db) / range_db; - } -} - -double -Amp::GainControl::interface_to_internal (double v) const -{ - if (_desc.type == GainAutomation) { - return slider_position_to_gain (v); - } else { - return dB_to_coefficient (lower_db + v * range_db); - } -} - -double -Amp::GainControl::internal_to_user (double v) const -{ - return accurate_coefficient_to_dB (v); -} - -double -Amp::GainControl::user_to_internal (double u) const -{ - return dB_to_coefficient (u); -} - -std::string -Amp::GainControl::get_user_string () const -{ - char theBuf[32]; sprintf( theBuf, _("%3.1f dB"), accurate_coefficient_to_dB (get_value())); - return std::string(theBuf); -} - /** Write gain automation for this cycle into the buffer previously passed in to * set_gain_automation_buffer (if we are in automation playback mode and the * transport is rolling). diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h index 108694de90..bd4c8b1259 100644 --- a/libs/ardour/ardour/amp.h +++ b/libs/ardour/ardour/amp.h @@ -29,6 +29,7 @@ namespace ARDOUR { class BufferSet; +class GainControl; class IO; /** Applies a declick operation to all audio inputs, passing the same number of @@ -76,32 +77,13 @@ public: static void update_meters(); - /* automation */ - struct GainControl : public AutomationControl { - GainControl (Session& session, const Evoral::Parameter ¶m, - boost::shared_ptr<AutomationList> al = boost::shared_ptr<AutomationList>()); - - void set_value (double val, PBD::Controllable::GroupControlDisposition group_override); - void set_value_unchecked (double); - - double internal_to_interface (double) const; - double interface_to_internal (double) const; - double internal_to_user (double) const; - double user_to_internal (double) const; - std::string get_user_string () const; - - double lower_db; - double range_db; - }; - - - boost::shared_ptr<GainControl> gain_control() { - return boost::dynamic_pointer_cast<GainControl> (_gain_control); + boost::shared_ptr<AutomationControl> gain_control() { + return _gain_control; } - boost::shared_ptr<const GainControl> gain_control() const { - return boost::dynamic_pointer_cast<GainControl> (_gain_control); + boost::shared_ptr<const AutomationControl> gain_control() const { + return _gain_control; } std::string value_as_string (boost::shared_ptr<AutomationControl>) const; diff --git a/libs/ardour/ardour/gain_control.h b/libs/ardour/ardour/gain_control.h new file mode 100644 index 0000000000..17c250151a --- /dev/null +++ b/libs/ardour/ardour/gain_control.h @@ -0,0 +1,55 @@ +/* + Copyright (C) 2006-2016 Paul Davis + + 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., + 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __ardour_gain_control_h__ +#define __ardour_gain_control_h__ + +#include <string> +#include <boost/shared_ptr.hpp> + +#include "pbd/controllable.h" + +#include "evoral/Parameter.hpp" + +#include "ardour/automation_control.h" +#include "ardour/libardour_visibility.h" + +namespace ARDOUR { + +class Session; + +struct LIBARDOUR_API GainControl : public AutomationControl { + GainControl (Session& session, const Evoral::Parameter ¶m, + boost::shared_ptr<AutomationList> al = boost::shared_ptr<AutomationList>()); + + void set_value (double val, PBD::Controllable::GroupControlDisposition group_override); + void set_value_unchecked (double); + + double internal_to_interface (double) const; + double interface_to_internal (double) const; + double internal_to_user (double) const; + double user_to_internal (double) const; + std::string get_user_string () const; + + double lower_db; + double range_db; +}; + +} /* namespace */ + +#endif /* __ardour_gain_control_h__ */ diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index c9d8374db9..3c5d610ce8 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -28,6 +28,7 @@ #include "ardour/amp.h" #include "ardour/automatable.h" #include "ardour/event_type_map.h" +#include "ardour/gain_control.h" #include "ardour/midi_track.h" #include "ardour/pan_controllable.h" #include "ardour/pannable.h" @@ -449,9 +450,9 @@ Automatable::control_factory(const Evoral::Parameter& param) warning << "PluginPropertyAutomation for non-Plugin" << endl; } } else if (param.type() == GainAutomation) { - control = new Amp::GainControl(_a_session, param); + control = new GainControl(_a_session, param); } else if (param.type() == TrimAutomation) { - control = new Amp::GainControl(_a_session, param); + control = new GainControl(_a_session, param); } else if (param.type() == PanAzimuthAutomation || param.type() == PanWidthAutomation || param.type() == PanElevationAutomation) { Pannable* pannable = dynamic_cast<Pannable*>(this); if (pannable) { diff --git a/libs/ardour/gain_control.cc b/libs/ardour/gain_control.cc new file mode 100644 index 0000000000..9314e1270e --- /dev/null +++ b/libs/ardour/gain_control.cc @@ -0,0 +1,92 @@ +/* + Copyright (C) 2006-2016 Paul Davis + + 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., + 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "ardour/dB.h" +#include "ardour/gain_control.h" +#include "ardour/session.h" + +#include "i18n.h" + +using namespace ARDOUR; +using namespace std; + +GainControl::GainControl (Session& session, const Evoral::Parameter ¶m, boost::shared_ptr<AutomationList> al) + : AutomationControl (session, param, ParameterDescriptor(param), + al ? al : boost::shared_ptr<AutomationList> (new AutomationList (param)), + param.type() == GainAutomation ? X_("gaincontrol") : X_("trimcontrol")) { + + alist()->reset_default (1.0); + + lower_db = accurate_coefficient_to_dB (_desc.lower); + range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db; +} + +void +GainControl::set_value (double val, PBD::Controllable::GroupControlDisposition /* group_override */) +{ + if (writable()) { + set_value_unchecked (val); + } +} + +void +GainControl::set_value_unchecked (double val) +{ + AutomationControl::set_value (std::max (std::min (val, (double)_desc.upper), (double)_desc.lower), Controllable::NoGroup); + _session.set_dirty (); +} + +double +GainControl::internal_to_interface (double v) const +{ + if (_desc.type == GainAutomation) { + return gain_to_slider_position (v); + } else { + return (accurate_coefficient_to_dB (v) - lower_db) / range_db; + } +} + +double +GainControl::interface_to_internal (double v) const +{ + if (_desc.type == GainAutomation) { + return slider_position_to_gain (v); + } else { + return dB_to_coefficient (lower_db + v * range_db); + } +} + +double +GainControl::internal_to_user (double v) const +{ + return accurate_coefficient_to_dB (v); +} + +double +GainControl::user_to_internal (double u) const +{ + return dB_to_coefficient (u); +} + +std::string +GainControl::get_user_string () const +{ + char theBuf[32]; sprintf( theBuf, _("%3.1f dB"), accurate_coefficient_to_dB (get_value())); + return std::string(theBuf); +} + diff --git a/libs/ardour/return.cc b/libs/ardour/return.cc index d9c9e21a98..db81568479 100644 --- a/libs/ardour/return.cc +++ b/libs/ardour/return.cc @@ -24,6 +24,7 @@ #include "ardour/amp.h" #include "ardour/audioengine.h" #include "ardour/buffer_set.h" +#include "ardour/gain_control.h" #include "ardour/io.h" #include "ardour/meter.h" #include "ardour/return.h" @@ -50,7 +51,7 @@ Return::Return (Session& s, bool internal) /* never muted */ boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation))); - _gain_control = boost::shared_ptr<Amp::GainControl> (new Amp::GainControl (_session, Evoral::Parameter (GainAutomation), gl)); + _gain_control = boost::shared_ptr<GainControl> (new GainControl (_session, Evoral::Parameter (GainAutomation), gl)); add_control (_gain_control); _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true)); diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 7f4146e079..16efc35a8c 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -46,6 +46,7 @@ #include "ardour/capturing_processor.h" #include "ardour/debug.h" #include "ardour/delivery.h" +#include "ardour/gain_control.h" #include "ardour/internal_return.h" #include "ardour/internal_send.h" #include "ardour/meter.h" @@ -172,7 +173,7 @@ Route::init () /* add amp processor */ boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation))); - _gain_control = boost::shared_ptr<Amp::GainControl> (new Amp::GainControl (_session, Evoral::Parameter(GainAutomation), gl)); + _gain_control = boost::shared_ptr<GainControl> (new GainControl (_session, Evoral::Parameter(GainAutomation), gl)); add_control (_gain_control); _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true)); @@ -185,7 +186,7 @@ Route::init () /* and input trim */ boost::shared_ptr<AutomationList> tl (new AutomationList (Evoral::Parameter (TrimAutomation))); - _trim_control = boost::shared_ptr<Amp::GainControl> (new Amp::GainControl (_session, Evoral::Parameter(TrimAutomation), tl)); + _trim_control = boost::shared_ptr<GainControl> (new GainControl (_session, Evoral::Parameter(TrimAutomation), tl)); add_control (_trim_control); _trim.reset (new Amp (_session, X_("Trim"), _trim_control, false)); diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 771473e065..23ae860f47 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -26,6 +26,7 @@ #include "ardour/amp.h" #include "ardour/buffer_set.h" #include "ardour/debug.h" +#include "ardour/gain_control.h" #include "ardour/io.h" #include "ardour/meter.h" #include "ardour/panner_shell.h" @@ -87,7 +88,7 @@ Send::Send (Session& s, boost::shared_ptr<Pannable> p, boost::shared_ptr<MuteMas //boost_debug_shared_ptr_mark_interesting (this, "send"); boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation))); - _gain_control = boost::shared_ptr<Amp::GainControl> (new Amp::GainControl (_session, Evoral::Parameter(GainAutomation), gl)); + _gain_control = boost::shared_ptr<GainControl> (new GainControl (_session, Evoral::Parameter(GainAutomation), gl)); add_control (_gain_control); _amp.reset (new Amp (_session, _("Fader"), _gain_control, true)); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index af423af831..c20a7709ce 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -71,6 +71,7 @@ #include "ardour/engine_state_controller.h" #endif #include "ardour/filename_extensions.h" +#include "ardour/gain_control.h" #include "ardour/graph.h" #include "ardour/midiport_manager.h" #include "ardour/scene_changer.h" @@ -735,7 +736,7 @@ Session::setup_click () _clicking = false; boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (GainAutomation))); - boost::shared_ptr<AutomationControl> gain_control = boost::shared_ptr<Amp::GainControl> (new Amp::GainControl (*this, Evoral::Parameter(GainAutomation), gl)); + boost::shared_ptr<AutomationControl> gain_control = boost::shared_ptr<GainControl> (new GainControl (*this, Evoral::Parameter(GainAutomation), gl)); _click_io.reset (new ClickIO (*this, X_("Click"))); _click_gain.reset (new Amp (*this, _("Fader"), gain_control, true)); diff --git a/libs/ardour/wscript b/libs/ardour/wscript index c5cd78325d..a3ab30e8db 100644 --- a/libs/ardour/wscript +++ b/libs/ardour/wscript @@ -90,6 +90,7 @@ libardour_sources = [ 'filesystem_paths.cc', 'filter.cc', 'find_session.cc', + 'gain_control.cc', 'globals.cc', 'graph.cc', 'graphnode.cc', diff --git a/libs/surfaces/control_protocol/control_protocol.cc b/libs/surfaces/control_protocol/control_protocol.cc index 7a218e8532..52aaa51e6e 100644 --- a/libs/surfaces/control_protocol/control_protocol.cc +++ b/libs/surfaces/control_protocol/control_protocol.cc @@ -20,6 +20,7 @@ #include "pbd/error.h" +#include "ardour/gain_control.h" #include "ardour/session.h" #include "ardour/route.h" #include "ardour/audio_track.h" |