From d1033819bd09d8a46ec602a586ddba0e10f803d6 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 12 Jan 2016 14:09:24 -0500 Subject: change ownership of the AutomationControl used by Amp. It used to be owned by Amp. Now it is owned by Amp's owner --- gtk2_ardour/processor_box.cc | 8 +++++--- libs/ardour/amp.cc | 32 +++++++++++++++++++------------- libs/ardour/ardour/amp.h | 25 +++++++------------------ libs/ardour/ardour/return.h | 1 + libs/ardour/ardour/route.h | 2 ++ libs/ardour/ardour/send.h | 1 + libs/ardour/automatable.cc | 14 ++------------ libs/ardour/return.cc | 7 +++++-- libs/ardour/route.cc | 13 +++++++++++-- libs/ardour/send.cc | 10 +++++----- libs/ardour/session.cc | 6 +++++- 11 files changed, 63 insertions(+), 56 deletions(-) diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 29e230920c..68beac400a 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -2027,7 +2027,8 @@ ProcessorBox::help_count_visible_prefader_processors (boost::weak_ptr ) ) { - if (boost::dynamic_pointer_cast(processor) && boost::dynamic_pointer_cast(processor)->type() == X_("amp")) { + if (boost::dynamic_pointer_cast(processor) && + boost::dynamic_pointer_cast(processor)->gain_control()->parameter().type() == GainAutomation) { *amp_seen = true; } else { if (!*amp_seen) { @@ -2117,7 +2118,8 @@ ProcessorBox::setup_entry_positions () uint32_t num = 0; for (list::iterator i = children.begin(); i != children.end(); ++i) { - if (boost::dynamic_pointer_cast((*i)->processor()) && boost::dynamic_pointer_cast((*i)->processor())->type() == X_("amp")) { + if (boost::dynamic_pointer_cast((*i)->processor()) && + boost::dynamic_pointer_cast((*i)->processor())->gain_control()->parameter().type() == GainAutomation) { pre_fader = false; (*i)->set_position (ProcessorEntry::Fader, num++); } else { @@ -2689,7 +2691,7 @@ ProcessorBox::get_editor_window (boost::shared_ptr processor, bool us } } - if (boost::dynamic_pointer_cast (processor) && boost::dynamic_pointer_cast (processor)->type() == X_("amp")) { + if (boost::dynamic_pointer_cast (processor) && boost::dynamic_pointer_cast (processor)->gain_control()->parameter().type() == GainAutomation) { if (_parent_strip) { _parent_strip->revert_to_default_display (); diff --git a/libs/ardour/amp.cc b/libs/ardour/amp.cc index 924a77e666..1d4ffc1cd7 100644 --- a/libs/ardour/amp.cc +++ b/libs/ardour/amp.cc @@ -38,23 +38,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 @@ -375,8 +370,8 @@ 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,6 +390,17 @@ Amp::set_state (const XMLNode& node, int version) return 0; } +Amp::GainControl::GainControl (Session& session, const Evoral::Parameter ¶m, boost::shared_ptr al) + : AutomationControl (session, param, ParameterDescriptor(param), + al ? al : boost::shared_ptr (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 */) { @@ -407,7 +413,7 @@ void Amp::GainControl::set_value_unchecked (double val) { AutomationControl::set_value (std::max (std::min (val, (double)_desc.upper), (double)_desc.lower), Controllable::NoGroup); - _amp->session().set_dirty (); + _session.set_dirty (); } double diff --git a/libs/ardour/ardour/amp.h b/libs/ardour/ardour/amp.h index c92edcc5fc..108694de90 100644 --- a/libs/ardour/ardour/amp.h +++ b/libs/ardour/ardour/amp.h @@ -36,13 +36,11 @@ class IO; */ class LIBARDOUR_API Amp : public Processor { public: - Amp(Session& s, std::string type = "amp"); + Amp(Session& s, const std::string& display_name, boost::shared_ptr control, bool control_midi_also); std::string display_name () const { return _display_name; } void set_display_name (const std::string& name) { _display_name = name; } - std::string type() const { return _type;} - bool visible () const; bool can_support_io_configuration (const ChanCount& in, ChanCount& out); @@ -81,16 +79,8 @@ public: /* automation */ struct GainControl : public AutomationControl { - GainControl (std::string name, Session& session, Amp* a, const Evoral::Parameter ¶m, - boost::shared_ptr al = boost::shared_ptr() ) - : AutomationControl (session, param, ParameterDescriptor(param), al, name) - , _amp (a) { - set_flags (Controllable::Flag (flags() | Controllable::GainLike)); - alist()->reset_default (1.0); - - lower_db = accurate_coefficient_to_dB (_desc.lower); - range_db = accurate_coefficient_to_dB (_desc.upper) - lower_db; - } + GainControl (Session& session, const Evoral::Parameter ¶m, + boost::shared_ptr al = boost::shared_ptr()); void set_value (double val, PBD::Controllable::GroupControlDisposition group_override); void set_value_unchecked (double); @@ -101,17 +91,17 @@ public: double user_to_internal (double) const; std::string get_user_string () const; - Amp* _amp; double lower_db; double range_db; }; + boost::shared_ptr gain_control() { - return _gain_control; + return boost::dynamic_pointer_cast (_gain_control); } boost::shared_ptr gain_control() const { - return _gain_control; + return boost::dynamic_pointer_cast (_gain_control); } std::string value_as_string (boost::shared_ptr) const; @@ -125,11 +115,10 @@ private: std::string _display_name; - boost::shared_ptr _gain_control; + boost::shared_ptr _gain_control; /** Buffer that we should use for gain automation */ gain_t* _gain_automation_buffer; - std::string _type; bool _midi_amp; }; diff --git a/libs/ardour/ardour/return.h b/libs/ardour/ardour/return.h index 45bb5573b2..e2e326d7d0 100644 --- a/libs/ardour/ardour/return.h +++ b/libs/ardour/ardour/return.h @@ -64,6 +64,7 @@ public: protected: bool _metering; + boost::shared_ptr _gain_control; boost::shared_ptr _amp; boost::shared_ptr _meter; diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 2086f32119..9a0cf9ee0b 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -675,7 +675,9 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou virtual void maybe_declick (BufferSet&, framecnt_t, int); + boost::shared_ptr _gain_control; boost::shared_ptr _amp; + boost::shared_ptr _trim_control; boost::shared_ptr _trim; boost::shared_ptr _meter; boost::shared_ptr _delayline; diff --git a/libs/ardour/ardour/send.h b/libs/ardour/ardour/send.h index f944dcabfb..5db0b94b87 100644 --- a/libs/ardour/ardour/send.h +++ b/libs/ardour/ardour/send.h @@ -78,6 +78,7 @@ class LIBARDOUR_API Send : public Delivery protected: bool _metering; + boost::shared_ptr _gain_control; boost::shared_ptr _amp; boost::shared_ptr _meter; boost::shared_ptr _delayline; diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index 9670f68689..c9d8374db9 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -449,19 +449,9 @@ Automatable::control_factory(const Evoral::Parameter& param) warning << "PluginPropertyAutomation for non-Plugin" << endl; } } else if (param.type() == GainAutomation) { - Amp* amp = dynamic_cast(this); - if (amp) { - control = new Amp::GainControl(X_("gaincontrol"), _a_session, amp, param); - } else { - warning << "GainAutomation for non-Amp" << endl; - } + control = new Amp::GainControl(_a_session, param); } else if (param.type() == TrimAutomation) { - Amp* amp = dynamic_cast(this); - if (amp) { - control = new Amp::GainControl(X_("trimcontrol"), _a_session, amp, param); - } else { - warning << "TrimAutomation for non-Amp" << endl; - } + control = new Amp::GainControl(_a_session, param); } else if (param.type() == PanAzimuthAutomation || param.type() == PanWidthAutomation || param.type() == PanElevationAutomation) { Pannable* pannable = dynamic_cast(this); if (pannable) { diff --git a/libs/ardour/return.cc b/libs/ardour/return.cc index 4f9e8b958a..d9c9e21a98 100644 --- a/libs/ardour/return.cc +++ b/libs/ardour/return.cc @@ -49,7 +49,11 @@ Return::Return (Session& s, bool internal) { /* never muted */ - _amp.reset (new Amp (_session)); + boost::shared_ptr gl (new AutomationList (Evoral::Parameter (GainAutomation))); + _gain_control = boost::shared_ptr (new Amp::GainControl (_session, Evoral::Parameter (GainAutomation), gl)); + add_control (_gain_control); + + _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true)); _meter.reset (new PeakMeter (_session, name())); } @@ -159,4 +163,3 @@ Return::configure_io (ChanCount in, ChanCount out) return true; } - diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index cb1af7f4a9..7f4146e079 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -171,7 +171,11 @@ Route::init () /* add amp processor */ - _amp.reset (new Amp (_session)); + boost::shared_ptr gl (new AutomationList (Evoral::Parameter (GainAutomation))); + _gain_control = boost::shared_ptr (new Amp::GainControl (_session, Evoral::Parameter(GainAutomation), gl)); + add_control (_gain_control); + + _amp.reset (new Amp (_session, X_("Fader"), _gain_control, true)); add_processor (_amp, PostFader); if (is_monitor ()) { @@ -179,7 +183,12 @@ Route::init () } /* and input trim */ - _trim.reset (new Amp (_session, "trim")); + + boost::shared_ptr tl (new AutomationList (Evoral::Parameter (TrimAutomation))); + _trim_control = boost::shared_ptr (new Amp::GainControl (_session, Evoral::Parameter(TrimAutomation), tl)); + add_control (_trim_control); + + _trim.reset (new Amp (_session, X_("Trim"), _trim_control, false)); _trim->set_display_to_user (false); if (dynamic_cast(this)) { diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index ec86686bef..771473e065 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -86,13 +86,15 @@ Send::Send (Session& s, boost::shared_ptr p, boost::shared_ptr gl (new AutomationList (Evoral::Parameter (GainAutomation))); + _gain_control = boost::shared_ptr (new Amp::GainControl (_session, Evoral::Parameter(GainAutomation), gl)); + add_control (_gain_control); + + _amp.reset (new Amp (_session, _("Fader"), _gain_control, true)); _meter.reset (new PeakMeter (_session, name())); _delayline.reset (new DelayLine (_session, name())); - add_control (_amp->gain_control ()); - if (panner_shell()) { panner_shell()->Changed.connect_same_thread (*this, boost::bind (&Send::panshell_changed, this)); } @@ -400,5 +402,3 @@ Send::value_as_string (boost::shared_ptr ac) const { return _amp->value_as_string (ac); } - - diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 43883f7fc6..af423af831 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -733,8 +733,12 @@ void Session::setup_click () { _clicking = false; + + boost::shared_ptr gl (new AutomationList (Evoral::Parameter (GainAutomation))); + boost::shared_ptr gain_control = boost::shared_ptr (new Amp::GainControl (*this, Evoral::Parameter(GainAutomation), gl)); + _click_io.reset (new ClickIO (*this, X_("Click"))); - _click_gain.reset (new Amp (*this)); + _click_gain.reset (new Amp (*this, _("Fader"), gain_control, true)); _click_gain->activate (); if (state_tree) { setup_click_state (state_tree->root()); -- cgit v1.2.3