From 76466bde179e9b0d58b1586fb3f4ed40dedbdc13 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 18 Aug 2008 06:26:24 +0000 Subject: Fix loading / importing patches at root and in subpatches. git-svn-id: http://svn.drobilla.net/lad/ingen@1430 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/shared/Builder.cpp | 8 +++++--- src/libs/shared/ClashAvoider.cpp | 26 +++++++++++++++++++------- src/libs/shared/ClashAvoider.hpp | 4 +++- 3 files changed, 27 insertions(+), 11 deletions(-) (limited to 'src/libs/shared') diff --git a/src/libs/shared/Builder.cpp b/src/libs/shared/Builder.cpp index 7065e0b4..1eb127a5 100644 --- a/src/libs/shared/Builder.cpp +++ b/src/libs/shared/Builder.cpp @@ -41,7 +41,7 @@ Builder::build(const Raul::Path& prefix, SharedPtr object) SharedPtr patch = PtrCast(object); if (patch) { if (object->path() != "/") { - const std::string path_str = prefix + object->path(); + const std::string path_str = prefix.base() + object->path().substr(1); //cout << "BUILDING PATCH " << path_str << endl; _interface.new_patch(path_str, patch->internal_polyphony()); } @@ -49,8 +49,10 @@ Builder::build(const Raul::Path& prefix, SharedPtr object) build_object(prefix, object); for (Patch::Connections::const_iterator i = patch->connections().begin(); i != patch->connections().end(); ++i) { - _interface.connect(prefix.base() + (*i)->src_port_path().substr(1), - prefix.base() + (*i)->dst_port_path().substr(1)); + string base = prefix.base() + object->path().substr(1); + cout << "*********** BASE: " << base << endl; + _interface.connect(base + (*i)->src_port_path().substr(1), + base + (*i)->dst_port_path().substr(1)); } return; } diff --git a/src/libs/shared/ClashAvoider.cpp b/src/libs/shared/ClashAvoider.cpp index 75f46bf6..c3078468 100644 --- a/src/libs/shared/ClashAvoider.cpp +++ b/src/libs/shared/ClashAvoider.cpp @@ -25,9 +25,11 @@ namespace Ingen { namespace Shared { -const Raul::Path& +const Raul::Path ClashAvoider::map_path(const Raul::Path& in) { + cout << "MAP PATH: " << in << endl; + unsigned offset = 0; bool has_offset = false; size_t pos = in.find_last_of("_"); @@ -56,10 +58,16 @@ ClashAvoider::map_path(const Raul::Path& in) if (p != _symbol_map.end()) { const Path mapped = p->second.base() + in.substr(parent.base().length()); InsertRecord i = _symbol_map.insert(make_pair(in, mapped)); - return i.first->second; + return _prefix.base() + i.first->second.substr(1); } + parent = parent.parent(); } while (parent != "/"); + cout << "????????????????????????????????? " << in << endl; + + if (in.parent() != "/") + cout << "!!!!!!!!!!!!!!!!!!!!!! NOT ROOT PARENT " << endl; + // Append _2 _3 etc until an unused symbol is found string base_name = in.name(); if (has_offset) @@ -70,10 +78,12 @@ ClashAvoider::map_path(const Raul::Path& in) if (o != _offsets.end()) { offset = ++o->second; } else { - offset = _store.child_name_offset( - _prefix.base() + in.parent().base().substr(1), - base_name, - false); + string parent_str = _prefix.base() + in.parent().base().substr(1); + parent_str = parent_str.substr(0, parent_str.find_last_of("/")); + if (parent_str == "") + parent_str = "/"; + cout << "***** PARENT: " << parent_str << endl; + offset = _store.child_name_offset(parent_str, base_name, false); _offsets.insert(make_pair(base_name, offset)); } @@ -81,7 +91,9 @@ ClashAvoider::map_path(const Raul::Path& in) std::stringstream ss; ss << in.parent().base() << base_name << "_" << offset; if (_store.find(ss.str()) == _store.end()) { - InsertRecord i = _symbol_map.insert(make_pair(in, ss.str())); + string str = _prefix.base() + ss.str().substr(1); + InsertRecord i = _symbol_map.insert(make_pair(in, str)); + cout << "HIT: offset = " << offset << ", str = " << str << endl; return i.first->second; } else { cout << "MISSED OFFSET: " << in << " => " << ss.str() << endl; diff --git a/src/libs/shared/ClashAvoider.hpp b/src/libs/shared/ClashAvoider.hpp index f70e839a..3c8a1c9f 100644 --- a/src/libs/shared/ClashAvoider.hpp +++ b/src/libs/shared/ClashAvoider.hpp @@ -39,6 +39,8 @@ class ClashAvoider : public CommonInterface public: ClashAvoider(Store& store, const Raul::Path& prefix, CommonInterface& target) : _prefix(prefix), _store(store), _target(target) {} + + void set_target(CommonInterface& target) { _target = target; } // Bundles void bundle_begin() { _target.bundle_begin(); } @@ -79,7 +81,7 @@ public: const Raul::Atom& value); private: - const Raul::Path& map_path(const Raul::Path& in); + const Raul::Path map_path(const Raul::Path& in); const Raul::Path& _prefix; Store& _store; -- cgit v1.2.1