diff options
author | Robin Gareus <robin@gareus.org> | 2016-05-24 18:04:29 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-05-24 18:04:29 +0200 |
commit | a525055ce06a0d9c23cd12264d389b7dc74e9593 (patch) | |
tree | 97008099893a93671f8b93fa2d53317e177f1993 /libs/ardour/plugin_insert.cc | |
parent | 1f17784ac595d51d206eac26e9af7530fb04d18a (diff) |
additional in-place check
Diffstat (limited to 'libs/ardour/plugin_insert.cc')
-rw-r--r-- | libs/ardour/plugin_insert.cc | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 35ac613d7b..451f801f1d 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -1330,6 +1330,30 @@ PluginInsert::check_inplace () inplace_ok = false; } } + + if (inplace_ok) { + /* check if every output is fed by the corresponding input + * + * this prevents in-port 1 -> sink-pin 2 || source-pin 1 -> out port 1, source-pin 2 -> out port 2 + * (with in-place, source-pin 1 -> out port 1 overwrites in-port 1) + * + * but allows in-port 1 -> sink-pin 2 || source-pin 2 -> out port 1 + */ + ChanMapping in_map (input_map ()); + const ChanMapping::Mappings out_m (output_map ().mappings ()); + for (ChanMapping::Mappings::const_iterator t = out_m.begin (); t != out_m.end () && inplace_ok; ++t) { + for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) { + /* src-pin: c->first, out-port: c->second */ + bool valid; + uint32_t in_port = in_map.get (t->first, c->first, &valid); + if (valid && in_port != c->second) { + inplace_ok = false; + break; + } + } + } + } + DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing")); return !inplace_ok; // no-inplace } |