diff options
author | Johannes Mueller <github@johannes-mueller.org> | 2018-11-01 20:30:06 +0100 |
---|---|---|
committer | Johannes Mueller <github@johannes-mueller.org> | 2018-11-01 22:17:01 +0100 |
commit | fe318c0cd5c9116b512fe90241f3ba0c52841581 (patch) | |
tree | 71e1e9144758917d54ef2c1822dbf32a44ac5b0b /libs/ardour/plugin_insert.cc | |
parent | 287ce3d4777d466e7ee8ba2c49af3208864cc5cc (diff) |
Create sidechain ports when created from template (#0007680)
When a route with a sidechain is created from a template or by route
duplication the number of ports of the sidechain are set according to the
XMLNode defining the sidechain. Then the names are set according to the name of
the newly created route.
Thus all the pin connections defined in the template are replicated in the
newly created route.
Diffstat (limited to 'libs/ardour/plugin_insert.cc')
-rw-r--r-- | libs/ardour/plugin_insert.cc | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 4fc97fb0c8..983d3b9aa8 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -2763,10 +2763,16 @@ PluginInsert::set_state(const XMLNode& node, int version) // sidechain is a Processor (IO) if ((*i)->name () == Processor::state_node_name) { if (!_sidechain) { - add_sidechain (0); + if (regenerate_xml_or_string_ids ()) { + add_sidechain_from_xml (**i, version); + } else { + add_sidechain (0); + } } if (!regenerate_xml_or_string_ids ()) { _sidechain->set_state (**i, version); + } else { + update_sidechain_name (); } } } @@ -3096,6 +3102,42 @@ PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin) _plugins.push_back (plugin); } +void +PluginInsert::add_sidechain_from_xml (const XMLNode& node, int version) +{ + if (version < 3000) { + return; + } + + XMLNodeList nlist = node.children(); + + if (nlist.size() == 0) { + return; + } + + uint32_t audio = 0; + uint32_t midi = 0; + + XMLNodeConstIterator it = nlist.front()->children().begin(); + for ( ; it != nlist.front()->children().end(); ++ it) { + if ((*it)->name() == "Port") { + DataType type(DataType::NIL); + (*it)->get_property ("type", type); + if (type == DataType::AUDIO) { + ++audio; + } else if (type == DataType::MIDI) { + ++midi; + } + } + } + + ChanCount in_cc = ChanCount(); + in_cc.set (DataType::AUDIO, audio); + in_cc.set (DataType::MIDI, midi); + + add_sidechain (audio, midi); +} + bool PluginInsert::load_preset (ARDOUR::Plugin::PresetRecord pr) { |