X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Famp.cc;h=d86362aa0d37d19198d8a8c840441c8145d133fe;hb=ae71e57e2422466716c0ec68ac841d778cf26e94;hp=955dd13ccc6a13d44b39c9e2ef585c16a4060197;hpb=dd9e0e49a016a408b7a6506282a86584e76a2715;p=ardour.git diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 955dd13ccc..d86362aa0d 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -26,11 +26,12 @@ #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" -#include "i18n.h" +#include "pbd/i18n.h" using namespace ARDOUR; using namespace PBD; @@ -38,23 +39,18 @@ using namespace PBD; // used for low-pass filter denormal protection #define GAIN_COEFF_TINY (1e-10) // -200dB -Amp::Amp (Session& s, std::string type) +Amp::Amp (Session& s, const std::string& name, boost::shared_ptr gc, bool control_midi_also) : Processor(s, "Amp") , _apply_gain(true) , _apply_gain_automation(false) , _current_gain(GAIN_COEFF_ZERO) , _current_automation_frame (INT64_MAX) + , _gain_control (gc) , _gain_automation_buffer(0) - , _type (type) - , _midi_amp (type != "trim") + , _midi_amp (control_midi_also) { - Evoral::Parameter p (_type == "trim" ? TrimAutomation : GainAutomation); - boost::shared_ptr gl (new AutomationList (p)); - _gain_control = boost::shared_ptr (new GainControl ((_type == "trim") ? X_("trimcontrol") : X_("gaincontrol"), s, this, p, gl)); - _gain_control->set_flags (Controllable::GainLike); - - add_control(_gain_control); - set_display_name (_type == "trim" ? _("Trim") : _("Fader")); + set_display_name (name); + add_control (_gain_control); } bool @@ -75,7 +71,7 @@ Amp::configure_io (ChanCount in, ChanCount out) } void -Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool) +Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double /*speed*/, pframes_t nframes, bool) { if (!_active && !_pending_active) { return; @@ -122,7 +118,7 @@ Amp::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, } else { /* manual (scalar) gain */ - gain_t const dg = _gain_control->user_double(); + gain_t const dg = _gain_control->get_value(); if (_current_gain != dg) { @@ -352,31 +348,12 @@ Amp::apply_simple_gain (AudioBuffer& buf, framecnt_t nframes, gain_t target) } } -void -Amp::inc_gain (gain_t factor, void *src) -{ - float desired_gain = _gain_control->user_double(); - - if (fabsf (desired_gain) < GAIN_COEFF_SMALL) { - // really?! what's the idea here? - set_gain (0.000001f + (0.000001f * factor), src); - } else { - set_gain (desired_gain + (desired_gain * factor), src); - } -} - -void -Amp::set_gain (gain_t val, void *) -{ - _gain_control->set_value (val); -} - XMLNode& Amp::state (bool full_state) { XMLNode& node (Processor::state (full_state)); - node.add_property("type", _type); - node.add_child_nocopy (_gain_control->get_state()); + node.add_property("type", _gain_control->parameter().type() == GainAutomation ? "amp" : "trim"); + node.add_child_nocopy (_gain_control->get_state()); return node; } @@ -395,60 +372,6 @@ Amp::set_state (const XMLNode& node, int version) return 0; } -void -Amp::GainControl::set_value (double val) -{ - 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)); - _amp->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). @@ -465,7 +388,7 @@ Amp::setup_gain_automation (framepos_t start_frame, framepos_t end_frame, framec assert (_gain_automation_buffer); _apply_gain_automation = _gain_control->list()->curve().rt_safe_get_vector ( start_frame, end_frame, _gain_automation_buffer, nframes); - if (start_frame != _current_automation_frame) { + if (start_frame != _current_automation_frame && _session.bounce_processing ()) { _current_gain = _gain_automation_buffer[0]; } _current_automation_frame = end_frame; @@ -482,7 +405,7 @@ Amp::visible() const } std::string -Amp::value_as_string (boost::shared_ptr ac) const +Amp::value_as_string (boost::shared_ptr ac) const { if (ac == _gain_control) { char buffer[32];