From a9719f1b35a77bdffc4b4f864648fd4d9a8e4a82 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 10 Jan 2024 01:31:57 +0100 Subject: [PATCH] Vapor: add support to trim surround object level --- libs/ardour/ardour/surround_return.h | 7 ++++++- libs/ardour/route.cc | 7 ++++++- libs/ardour/surround_return.cc | 29 +++++++++++++++++++++++----- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/libs/ardour/ardour/surround_return.h b/libs/ardour/ardour/surround_return.h index f5535ba29e..cf559ff948 100644 --- a/libs/ardour/ardour/surround_return.h +++ b/libs/ardour/ardour/surround_return.h @@ -34,6 +34,7 @@ namespace ARDOUR { +class Amp; class Session; class SurroundSend; class SurroundPannable; @@ -42,7 +43,7 @@ class LV2Plugin; class LIBARDOUR_API SurroundReturn : public Processor { public: - SurroundReturn (Session&); + SurroundReturn (Session&, Route*); virtual ~SurroundReturn (); bool can_support_io_configuration (const ChanCount& in, ChanCount& out); @@ -65,6 +66,8 @@ public: samplecnt_t signal_latency () const; + int set_state (XMLNode const&, int version); + protected: XMLNode& state () const; @@ -80,6 +83,8 @@ private: LUFSMeter _lufs_meter; + std::shared_ptr _trim; + LV2_Atom_Forge _forge; uint8_t _atom_buf[8192]; pan_t _current_value[max_object_id][num_pan_parameters]; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 6b1e9ff630..af0d5321f4 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -297,7 +297,7 @@ Route::init () if (is_surround_master ()) { _meter_point = _pending_meter_point = MeterPreFader; - _surround_return.reset (new SurroundReturn (_session)); + _surround_return.reset (new SurroundReturn (_session, this)); _surround_return->activate (); panner_shell()->set_bypassed (true); @@ -3333,6 +3333,11 @@ Route::set_processor_state (XMLNode const& node, int version, XMLProperty const* _surround_send.reset (new SurroundSend (_session, _mute_master)); _surround_send->set_owner (this); processor = _surround_send; + } else if (prop->value() == "surreturn") { + if (_surround_return) { + _surround_return->set_state (node, version); + } + return true; } else { warning << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg; return false; diff --git a/libs/ardour/surround_return.cc b/libs/ardour/surround_return.cc index a5236de18f..39c94b45a6 100644 --- a/libs/ardour/surround_return.cc +++ b/libs/ardour/surround_return.cc @@ -17,19 +17,20 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include "ardour/surround_return.h" +#include "ardour/amp.h" #include "ardour/audio_buffer.h" #include "ardour/lv2_plugin.h" #include "ardour/route.h" #include "ardour/session.h" #include "ardour/surround_pannable.h" +#include "ardour/surround_return.h" #include "ardour/surround_send.h" #include "ardour/uri_map.h" #include "pbd/i18n.h" using namespace ARDOUR; -SurroundReturn::SurroundReturn (Session& s) +SurroundReturn::SurroundReturn (Session& s, Route* r) : Processor (s, _("SurrReturn"), Temporal::TimeDomainProvider (Temporal::AudioTime)) , _lufs_meter (s.nominal_sample_rate (), 5) , _current_n_objects (max_object_id) @@ -49,13 +50,19 @@ SurroundReturn::SurroundReturn (Session& s) throw ProcessorException (_("Required Atmos/Vapor Processor not found.")); } + ChanCount cca128 (ChanCount (DataType::AUDIO, 128)); + _flush.store (0); _surround_processor->activate (); _surround_bufs.ensure_buffers (DataType::AUDIO, 128, s.get_block_size ()); - _surround_bufs.set_count (ChanCount (DataType::AUDIO, 128)); + _surround_bufs.set_count (cca128); lv2_atom_forge_init (&_forge, URIMap::instance ().urid_map ()); + _trim.reset (new Amp (_session, X_("Trim"), r->trim_control(), false)); + _trim->configure_io (cca128, cca128); + _trim->activate (); + for (size_t i = 0; i < max_object_id; ++i) { _current_render_mode[i] = -1; for (size_t p = 0; p < num_pan_parameters; ++p) { @@ -218,6 +225,10 @@ SurroundReturn::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_ #endif } + _trim->set_gain_automation_buffer (_session.trim_automation_buffer ()); + _trim->setup_gain_automation (start_sample, end_sample, nframes); + _trim->run (_surround_bufs, start_sample, end_sample, speed, nframes, true); + _surround_processor->connect_and_run (_surround_bufs, start_sample, end_sample, speed, _in_map, _out_map, nframes, 0); BufferSet::iterator i = _surround_bufs.begin (DataType::AUDIO); @@ -372,9 +383,17 @@ SurroundReturn::max_dbtp () const return _lufs_meter.dbtp (); } +int +SurroundReturn::set_state (XMLNode const& node, int version) +{ + return _trim->set_state (node, version); +} + XMLNode& SurroundReturn::state () const { - XMLNode* node = new XMLNode (X_("SurroundReturn")); - return *node; + XMLNode& node (_trim->state ()); + node.set_property ("name", "SurrReturn"); + node.set_property ("type", "surreturn"); + return node; }