Apply VCA master gain automation to Amp (Fader, Trim)
authorRobin Gareus <robin@gareus.org>
Sat, 3 Jun 2017 11:29:28 +0000 (13:29 +0200)
committerRobin Gareus <robin@gareus.org>
Sat, 3 Jun 2017 11:55:16 +0000 (13:55 +0200)
libs/ardour/amp.cc
libs/ardour/ardour/gain_control.h
libs/ardour/gain_control.cc

index 348f6957d41d11d3cb481138fe86a2d57070b366..d7b901434069f3a221af9ae4c4a1d96b2cb1f6f1 100644 (file)
@@ -392,22 +392,8 @@ Amp::setup_gain_automation (framepos_t start_frame, framepos_t end_frame, framec
            && _gain_control->automation_playback())
        {
                assert (_gain_automation_buffer);
-               _apply_gain_automation = _gain_control->list()->curve().rt_safe_get_vector (
-                       start_frame, end_frame, _gain_automation_buffer, nframes);
-
-               /* XXX the future requires a way to automate the control master
-                * and merge its own automation vector/curve with this one. We
-                * don't have a way to do that just yet, so for now, just get
-                * the master's current gain and scale our own automation
-                * vector/curve by this value.
-                */
-
-               if (_gain_control->slaved()) {
-                       const double master_gain = _gain_control->get_masters_value ();
-                       if (master_gain != 1.0) {
-                               apply_gain_to_buffer (_gain_automation_buffer, nframes, master_gain);
-                       }
-               }
+
+               _apply_gain_automation = _gain_control->get_masters_curve ( start_frame, end_frame, _gain_automation_buffer, nframes);
 
                if (start_frame != _current_automation_frame && _session.bounce_processing ()) {
                        _current_gain = _gain_automation_buffer[0];
index 431342dab36e738b9399eca90e8b9d40a5999f17..c902cde00162a432dd646b68900f9bc7c57e2327 100644 (file)
@@ -45,6 +45,8 @@ class LIBARDOUR_API GainControl : public SlavableAutomationControl {
        double user_to_internal (double) const;
        std::string get_user_string () const;
 
+       bool get_masters_curve_locked (framepos_t, framepos_t, float*, framecnt_t) const;
+
        double lower_db;
        double range_db;
 
index e6154495a4a40cba3c5a88b7484d12547ebcbfb0..cbafc75ad4139b403fb419af4c00c2626966838f 100644 (file)
@@ -21,6 +21,8 @@
 #include "pbd/convert.h"
 #include "pbd/strsplit.h"
 
+#include "evoral/Curve.hpp"
+
 #include "ardour/dB.h"
 #include "ardour/gain_control.h"
 #include "ardour/session.h"
@@ -100,3 +102,8 @@ GainControl::inc_gain (gain_t factor)
        }
 }
 
+bool
+GainControl::get_masters_curve_locked (framepos_t start, framepos_t end, float* vec, framecnt_t veclen) const
+{
+       return SlavableAutomationControl::masters_curve_multiply (start, end, vec, veclen);
+}