summaryrefslogtreecommitdiff
path: root/libs/ardour/send.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2020-02-18 20:44:49 +0100
committerRobin Gareus <robin@gareus.org>2020-02-18 21:14:52 +0100
commit720664d9d37bc272014d7d435468d01180eb666b (patch)
tree0825d955ca246be480ee54eb94d0c86d51f8732e /libs/ardour/send.cc
parent7c35f45681250c971de89516a73334f197b3abc6 (diff)
Fix loading send gain automation
This cleans up various issues that have been accumulated over the past and fixes bugs introduced in d4e023e1 and e31f5d99. Previously GainControl as saved as part of the Amp, however the automation was saved via Send (is-a Automatable). In d4e023e1cb, the GainControl was changed a "BusSendLevel" parameter, but AutomationList was not updated. This prevented loading existing automation (control parameter was not found).
Diffstat (limited to 'libs/ardour/send.cc')
-rw-r--r--libs/ardour/send.cc54
1 files changed, 44 insertions, 10 deletions
diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc
index d913693909..d3a5a3b28e 100644
--- a/libs/ardour/send.cc
+++ b/libs/ardour/send.cc
@@ -30,6 +30,7 @@
#include "ardour/buffer_set.h"
#include "ardour/debug.h"
#include "ardour/delayline.h"
+#include "ardour/event_type_map.h"
#include "ardour/gain_control.h"
#include "ardour/io.h"
#include "ardour/meter.h"
@@ -100,7 +101,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)));
+ boost::shared_ptr<AutomationList> gl (new AutomationList (Evoral::Parameter (BusSendLevel)));
_gain_control = boost::shared_ptr<GainControl> (new GainControl (_session, Evoral::Parameter(BusSendLevel), gl));
_gain_control->set_flags (Controllable::Flag ((int)_gain_control->flags() | Controllable::InlineControl));
add_control (_gain_control);
@@ -279,7 +280,7 @@ Send::state ()
node.set_property ("selfdestruct", _remove_on_disconnect);
- node.add_child_nocopy (_amp->get_state ());
+ node.add_child_nocopy (_gain_control->get_state());
return node;
}
@@ -291,11 +292,51 @@ Send::set_state (const XMLNode& node, int version)
return set_state_2X (node, version);
}
- XMLProperty const * prop;
+ XMLNode* gain_node;
+ if ((gain_node = node.child (Controllable::xml_node_name.c_str ())) != 0) {
+ _gain_control->set_state (*gain_node, version);
+ }
+
+ if (version <= 6000) {
+ /* convert GainAutomation to BusSendLevel
+ *
+ * (early Ardour 6.0-pre0 and Mixbus 6.0 used "BusSendLevel"
+ * control with GainAutomation, so we check version <= 6000.
+ * New A6 sessions do not have a GainAutomation parameter,
+ * so this is safe.)
+ *
+ * Normally this is restored via
+ * Delivery::set_state() -> Processor::set_state()
+ * -> Automatable::set_automation_xml_state()
+ */
+ XMLNodeList nlist;
+ XMLNode* automation = node.child ("Automation");
+ if (automation) {
+ nlist = automation->children();
+ }
+ for (XMLNodeIterator i = nlist.begin(); i != nlist.end(); ++i) {
+ if ((*i)->name() != "AutomationList") {
+ continue;
+ }
+ XMLProperty const* id_prop = (*i)->property("automation-id");
+ if (!id_prop) {
+ continue;
+ }
+ Evoral::Parameter param = EventTypeMap::instance().from_symbol (id_prop->value());
+ if (param.type() != GainAutomation) {
+ continue;
+ }
+ XMLNode xn (**i);
+ xn.set_property ("automation-id", EventTypeMap::instance().to_symbol(Evoral::Parameter (BusSendLevel)));
+ _gain_control->alist()->set_state (xn, version);
+ break;
+ }
+ }
Delivery::set_state (node, version);
if (node.property ("ignore-bitslot") == 0) {
+ XMLProperty const* prop;
/* don't try to reset bitslot if there is a node for it already: this can cause
issues with the session's accounting of send ID's
@@ -328,13 +369,6 @@ Send::set_state (const XMLNode& node, int version)
node.get_property (X_("selfdestruct"), _remove_on_disconnect);
- XMLNodeList nlist = node.children();
- for (XMLNodeIterator i = nlist.begin(); i != nlist.end(); ++i) {
- if ((*i)->name() == X_("Processor")) {
- _amp->set_state (**i, version);
- }
- }
-
_send_delay->set_name ("Send-" + name());
_thru_delay->set_name ("Thru-" + name());