X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_state.cc;h=bae1f46d0199a7226a229366d6b34b40c05761c8;hb=88b3aa926a82ff103d8440e89e28b202a450e18f;hp=506bc58fdfbe95eb0d4d7c190351e5219addaa40;hpb=fe01666475187e996bc1c37f69c691b433984211;p=ardour.git diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 506bc58fdf..bae1f46d01 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -92,7 +92,9 @@ #include "ardour/filename_extensions.h" #include "ardour/graph.h" #include "ardour/location.h" +#ifdef LV2_SUPPORT #include "ardour/lv2_plugin.h" +#endif #include "ardour/midi_model.h" #include "ardour/midi_patch_manager.h" #include "ardour/midi_region.h" @@ -634,7 +636,7 @@ Session::create (const string& session_template, BusProfile* bus_profile) /* Initial loop location, from absolute zero, length 10 seconds */ - Location* loc = new Location (*this, 0, 10.0 * _engine.sample_rate(), _("Loop"), Location::IsAutoLoop); + Location* loc = new Location (*this, 0, 10.0 * _engine.sample_rate(), _("Loop"), Location::IsAutoLoop, 0); _locations->add (loc, true); set_auto_loop_location (loc); } @@ -1051,6 +1053,80 @@ Session::get_template() return state(false); } +typedef std::set > PlaylistSet; +typedef std::set > SourceSet; + +bool +Session::export_track_state (boost::shared_ptr rl, const string& path) +{ + if (Glib::file_test (path, Glib::FILE_TEST_EXISTS)) { + return false; + } + if (g_mkdir_with_parents (path.c_str(), 0755) != 0) { + return false; + } + + PBD::Unwinder uw (_template_state_dir, path); + + LocaleGuard lg; + XMLNode* node = new XMLNode("TrackState"); // XXX + XMLNode* child; + + PlaylistSet playlists; // SessionPlaylists + SourceSet sources; + + // these will work with new_route_from_template() + // TODO: LV2 plugin-state-dir needs to be relative (on load?) + child = node->add_child ("Routes"); + for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { + if ((*i)->is_auditioner()) { + continue; + } + if ((*i)->is_master() || (*i)->is_monitor()) { + continue; + } + child->add_child_nocopy ((*i)->get_state()); + boost::shared_ptr track = boost::dynamic_pointer_cast (*i); + if (track) { + playlists.insert (track->playlist ()); + } + } + + // on load, Regions in the playlists need to resolve and map Source-IDs + // also playlist needs to be merged or created with new-name.. + // ... and Diskstream in tracks adjusted to use the correct playlist + child = node->add_child ("Playlists"); // SessionPlaylists::add_state + for (PlaylistSet::const_iterator i = playlists.begin(); i != playlists.end(); ++i) { + child->add_child_nocopy ((*i)->get_state ()); + boost::shared_ptr prl = (*i)->region_list (); + for (RegionList::const_iterator s = prl->begin(); s != prl->end(); ++s) { + const Region::SourceList& sl = (*s)->sources (); + for (Region::SourceList::const_iterator sli = sl.begin(); sli != sl.end(); ++sli) { + sources.insert (*sli); + } + } + } + + child = node->add_child ("Sources"); + for (SourceSet::const_iterator i = sources.begin(); i != sources.end(); ++i) { + child->add_child_nocopy ((*i)->get_state ()); + boost::shared_ptr fs = boost::dynamic_pointer_cast (*i); + if (fs) { +#ifdef PLATFORM_WINDOWS + fs->close (); +#endif + string p = fs->path (); + PBD::copy_file (p, Glib::build_filename (path, Glib::path_get_basename (p))); + } + } + + std::string sn = Glib::build_filename (path, "share.axml"); + + XMLTree tree; + tree.set_root (node); + return tree.write (sn.c_str()); +} + XMLNode& Session::state (bool full_state) { @@ -1220,7 +1296,7 @@ Session::state (bool full_state) Locations loc (*this); // for a template, just create a new Locations, populate it // with the default start and end, and get the state for that. - Location* range = new Location (*this, 0, 0, _("session"), Location::IsSessionRange); + Location* range = new Location (*this, 0, 0, _("session"), Location::IsSessionRange, 0); range->set (max_framepos, 0); loc.add (range); XMLNode& locations_state = loc.get_state(); @@ -3951,10 +4027,6 @@ Session::config_changed (std::string p, bool ours) _mmc->enable_send (Config->get_send_mmc ()); - } else if (p == "midi-feedback") { - - session_midi_feedback = Config->get_midi_feedback(); - } else if (p == "jack-time-master") { engine().reset_timebase (); @@ -5229,8 +5301,9 @@ Session::archive_session (const std::string& dest, /* write session file */ _path = to_dir; g_mkdir_with_parents (externals_dir ().c_str (), 0755); - +#ifdef LV2_SUPPORT PBD::Unwinder uw (LV2Plugin::force_state_save, true); +#endif save_state (name); save_default_options ();