From 00af254b04340c8a828195d9e377218a6d7c8ddf Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 1 Dec 2025 16:45:31 +0100 Subject: [PATCH] Extend strip import API, include additional information --- libs/ardour/ardour/session.h | 26 +++++++++++++++++++-- libs/ardour/session_state.cc | 45 +++++++++++++++++++++++++----------- 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 65828b35d2..845dc504e2 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -664,17 +664,39 @@ public: std::vector possible_states() const; static std::vector possible_states (std::string path); - enum RouteGroupImportMode { IgnoreRouteGroup, UseRouteGroup, CreateRouteGroup }; + struct RouteImportInfo { + RouteImportInfo (std::string const& n, PresentationInfo const& p, int mb) + : name (n) + , pi (p) + , mixbus (mb) + {} + + std::string name; + PresentationInfo pi; + int mixbus; + + bool operator< (RouteImportInfo const& o) { + if (mixbus != o.mixbus) { + return mixbus < o.mixbus; + } + return name < o.name; + } + + bool operator== (RouteImportInfo const& o) { + return mixbus == o.mixbus && name == o.name; + } + }; + bool export_route_state (std::shared_ptr rl, const std::string& path, bool with_sources); int import_route_state (const std::string& path, std::map const&, RouteGroupImportMode rgim = CreateRouteGroup); - std::map parse_route_state (const std::string& path, bool& match_pbd_id); + std::map parse_route_state (const std::string& path, bool& match_pbd_id); /// The instant xml file is written to the session directory void add_instant_xml (XMLNode&, bool write_to_config = true); diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 6de1b6b4e0..ab34667110 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -1198,16 +1198,8 @@ Session::export_route_state (std::shared_ptr rl, const string& path, } static bool -allow_import_route_state (XMLNode const& node, int version) +allow_import_route_state (PresentationInfo const& pi) { - XMLNode* pnode = node.child (PresentationInfo::state_node_name.c_str ()); - if (!pnode) { - return false; - } - - PresentationInfo pi (PresentationInfo::Flag (0)); - pi.set_state (*pnode, version); - if (pi.special (false)) { // |SurroundMaster|MonitorOut|Auditioner return false; } @@ -1218,10 +1210,24 @@ allow_import_route_state (XMLNode const& node, int version) return true; } -std::map +static bool +allow_import_route_state (XMLNode const& node, int version) +{ + XMLNode* pnode = node.child (PresentationInfo::state_node_name.c_str ()); + if (!pnode) { + return false; + } + + PresentationInfo pi (PresentationInfo::Flag (0)); + pi.set_state (*pnode, version); + + return allow_import_route_state (pi); +} + +std::map Session::parse_route_state (const string& path, bool& match_pbd_id) { - std::map rv; + std::map rv; XMLTree tree; if (!tree.read (path)) { @@ -1256,11 +1262,24 @@ Session::parse_route_state (const string& path, bool& match_pbd_id) continue; } - if (!allow_import_route_state (*rxml, version)) { + XMLNode* pnode = rxml->child (PresentationInfo::state_node_name.c_str ()); + if (!pnode) { continue; } - rv[id] = name; + PresentationInfo pi (PresentationInfo::Flag (0)); + pi.set_state (*pnode, version); + + if (!allow_import_route_state (pi)) { + continue; + } + + int mixbus = 0; +#ifdef MIXBUS + rxml->get_property (X_("mixbus-num"), mixbus) +#endif + + rv.emplace (id, RouteImportInfo (name, pi, mixbus)); } } return rv;