From 128ab1c866c87bde1e7bc354f04d98e5a7cba828 Mon Sep 17 00:00:00 2001 From: Nikolaus Gullotta Date: Wed, 5 Jun 2019 11:38:55 -0500 Subject: [PATCH] re-add group setting and fix a function name error --- libs/ardour/ardour/mixer_snapshot.h | 3 +- libs/ardour/mixer_snapshot.cc | 86 +++++++++++++++++------------ 2 files changed, 54 insertions(+), 35 deletions(-) diff --git a/libs/ardour/ardour/mixer_snapshot.h b/libs/ardour/ardour/mixer_snapshot.h index 5d296b0370..8e85e88492 100644 --- a/libs/ardour/ardour/mixer_snapshot.h +++ b/libs/ardour/ardour/mixer_snapshot.h @@ -115,7 +115,8 @@ class LIBARDOUR_API MixerSnapshot private: ARDOUR::Session* _session; - XMLNode& sanitize_route_node(XMLNode&); + XMLNode& sanitize_node(XMLNode&); + void reassign_masters(boost::shared_ptr, XMLNode); void load_from_session(std::string); void load_from_session(XMLNode&); diff --git a/libs/ardour/mixer_snapshot.cc b/libs/ardour/mixer_snapshot.cc index add23bda21..88cc15128c 100644 --- a/libs/ardour/mixer_snapshot.cc +++ b/libs/ardour/mixer_snapshot.cc @@ -149,6 +149,8 @@ void MixerSnapshot::snap(boost::shared_ptr route) RouteGroup* group = route->route_group(); if(group) { + XMLNode* group_node = copy.add_child(X_("Group")); + group_node->set_property(X_("name"), name); snap(group); } @@ -296,39 +298,6 @@ void MixerSnapshot::recall() } } - //routes - for(vector::const_iterator i = route_states.begin(); i != route_states.end(); i++) { - State state = (*i); - - boost::shared_ptr route = _session->route_by_name(state.name); - - if(route) { - if(route->is_auditioner() || route->is_master() || route->is_monitor()) { - /* we need to special case this but I still - want to be able to set some state info here - skip... for now */ - continue; - } - } - - if(route) { - PresentationInfo::order_t order = route->presentation_info().order(); - string name = route->name(); - XMLNode& node = sanitize_route_node(state.node); - PlaylistDisposition disp = NewPlaylist; - - _session->remove_route(route); - route = 0; //explicitly drop reference - - RouteList rl = _session->new_route_from_template(1, order, node, name, disp); - - // this is no longer possible due to using new_from_route_template - // _session->add_command(new MementoCommand((*route), &bfr, &route->get_state())); - - reassign_masters(rl.front(), node); - } - } - //groups for(vector::const_iterator i = group_states.begin(); i != group_states.end(); i++) { if(!get_recall_groups()) { @@ -347,6 +316,55 @@ void MixerSnapshot::recall() group->set_state(state.node, Stateful::loading_state_version); } } + + //routes + for(vector::const_iterator i = route_states.begin(); i != route_states.end(); i++) { + State state = (*i); + + boost::shared_ptr route = _session->route_by_name(state.name); + + if(route) { + if(route->is_auditioner() || route->is_master() || route->is_monitor()) { + /* we need to special case this but I still + want to be able to set some state info here + skip... for now */ + continue; + } + } + + if(route) { + PresentationInfo::order_t order = route->presentation_info().order(); + string name = route->name(); + XMLNode& node = sanitize_node(state.node); + PlaylistDisposition disp = NewPlaylist; + + _session->remove_route(route); + route = 0; //explicitly drop reference + + RouteList rl = _session->new_route_from_template(1, order, node, name, disp); + + if(get_recall_groups()) { + XMLNode* group_node = find_named_node(node, X_("Group")); + if(group_node) { + string name; + group_node->get_property(X_("name"), name); + const list& rgs (_session->route_groups()); + for (list::const_iterator i = rgs.begin (); i != rgs.end (); ++i) { + if ((*i)->name () == name) { + (*i)->add(rl.front()); + break; + } + } + } + } + + // this is no longer possible due to using new_from_route_template + // _session->add_command(new MementoCommand((*route), &bfr, &route->get_state())); + + reassign_masters(rl.front(), node); + } + } + _session->commit_reversible_command(); } @@ -558,7 +576,7 @@ void MixerSnapshot::load_from_session(XMLNode& node) } } -XMLNode& MixerSnapshot::sanitize_route_node(XMLNode& node) +XMLNode& MixerSnapshot::sanitize_node(XMLNode& node) { if(!get_recall_plugins()) { vector types {"lv2", "windows-vst", "lxvst", "mac-vst", "audiounit", "luaproc"};