diff options
Diffstat (limited to 'libs/ardour/session_state.cc')
-rw-r--r-- | libs/ardour/session_state.cc | 213 |
1 files changed, 124 insertions, 89 deletions
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 9f1adcfe99..833ead56e2 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -605,40 +605,6 @@ Session::create (const string& mix_template, nframes_t initial_length, BusProfil return 0; } - -int -Session::load_diskstreams (const XMLNode& node) -{ - XMLNodeList clist; - XMLNodeConstIterator citer; - - clist = node.children(); - - for (citer = clist.begin(); citer != clist.end(); ++citer) { - - try { - /* diskstreams added automatically by DiskstreamCreated handler */ - if ((*citer)->name() == "AudioDiskstream" || (*citer)->name() == "DiskStream") { - AudioDiskstream* dsp (new AudioDiskstream (*this, **citer)); - boost::shared_ptr<AudioDiskstream> dstream (dsp); - add_diskstream (dstream); - } else if ((*citer)->name() == "MidiDiskstream") { - boost::shared_ptr<MidiDiskstream> dstream (new MidiDiskstream (*this, **citer)); - add_diskstream (dstream); - } else { - error << _("Session: unknown diskstream type in XML") << endmsg; - } - } - - catch (failed_constructor& err) { - error << _("Session: could not load diskstream via XML state") << endmsg; - return -1; - } - } - - return 0; -} - void Session::maybe_write_autosave() { @@ -1075,17 +1041,6 @@ Session::state(bool full_state) } } - child = node->add_child ("DiskStreams"); - - { - boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader(); - for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) { - if (!(*i)->hidden()) { - child->add_child_nocopy ((*i)->get_state()); - } - } - } - if (full_state) { node->add_child_nocopy (_locations.get_state()); } else { @@ -1236,7 +1191,6 @@ Session::set_state (const XMLNode& node, int version) Locations Sources AudioRegions - AudioDiskstreams Connections Routes RouteGroups @@ -1327,13 +1281,6 @@ Session::set_state (const XMLNode& node, int version) } } - if ((child = find_named_node (node, "DiskStreams")) == 0) { - error << _("Session: XML state has no diskstreams section") << endmsg; - goto out; - } else if (load_diskstreams (*child)) { - goto out; - } - if (version >= 3000) { if ((child = find_named_node (node, "Bundles")) == 0) { warning << _("Session: XML state has no bundles section") << endmsg; @@ -1353,6 +1300,13 @@ Session::set_state (const XMLNode& node, int version) goto out; } + if (version < 3000 && ((child = find_named_node (node, X_("DiskStreams"))) == 0)) { + error << _("Session: XML state has no diskstreams section") << endmsg; + goto out; + } else if (load_diskstreams_2X (*child, version)) { + goto out; + } + if ((child = find_named_node (node, "Routes")) == 0) { error << _("Session: XML state has no routes section") << endmsg; goto out; @@ -1360,6 +1314,9 @@ Session::set_state (const XMLNode& node, int version) goto out; } + /* our diskstreams list is no longer needed as they are now all owned by their Route */ + _diskstreams_2X.clear (); + if (version >= 3000) { if ((child = find_named_node (node, "RouteGroups")) == 0) { @@ -1419,8 +1376,13 @@ Session::load_routes (const XMLNode& node, int version) for (niter = nlist.begin(); niter != nlist.end(); ++niter) { - boost::shared_ptr<Route> route (XMLRouteFactory (**niter, version)); - + boost::shared_ptr<Route> route; + if (version < 3000) { + route = XMLRouteFactory_2X (**niter, version); + } else { + route = XMLRouteFactory (**niter, version); + } + if (route == 0) { error << _("Session: cannot create Route from XML description.") << endmsg; return -1; @@ -1445,12 +1407,8 @@ Session::XMLRouteFactory (const XMLNode& node, int version) return ret; } - const XMLProperty* dsprop; + XMLNode* ds_child = find_named_node (node, X_("Diskstream")); - if ((dsprop = node.property (X_("diskstream-id"))) == 0) { - dsprop = node.property (X_("diskstream")); - } - DataType type = DataType::AUDIO; const XMLProperty* prop = node.property("default-type"); @@ -1460,28 +1418,80 @@ Session::XMLRouteFactory (const XMLNode& node, int version) assert (type != DataType::NIL); - if (dsprop) { + if (ds_child) { - boost::shared_ptr<Diskstream> ds; - PBD::ID diskstream_id (dsprop->value()); - PBD::ID zero ("0"); - - /* this wierd hack is used when creating - tracks from a template. We have a special - ID for the diskstream that means "you - should create a new diskstream here, not - look for an old one." - */ + Track* track; + + if (type == DataType::AUDIO) { + track = new AudioTrack (*this, X_("toBeResetFroXML")); + + } else { + track = new MidiTrack (*this, X_("toBeResetFroXML")); + } + + if (track->init()) { + delete track; + return ret; + } + + if (track->set_state (node, version)) { + delete track; + return ret; + } + + boost_debug_shared_ptr_mark_interesting (track, "Track"); + ret.reset (track); - if (diskstream_id != zero) { + } else { + Route* rt = new Route (*this, X_("toBeResetFroXML")); - ds = diskstream_by_id (diskstream_id); + if (rt->init () == 0 && rt->set_state (node, version) == 0) { + boost_debug_shared_ptr_mark_interesting (rt, "Route"); + ret.reset (rt); + } else { + delete rt; + } + } - if (!ds) { - error << string_compose (_("cannot find diskstream ID %1"), diskstream_id.to_s()) << endmsg; - return ret; - } - } + return ret; +} + +boost::shared_ptr<Route> +Session::XMLRouteFactory_2X (const XMLNode& node, int version) +{ + boost::shared_ptr<Route> ret; + + if (node.name() != "Route") { + return ret; + } + + XMLProperty const * ds_prop = node.property (X_("diskstream-id")); + if (!ds_prop) { + ds_prop = node.property (X_("diskstream")); + } + + cout << "ds_prop " << ds_prop << "\n"; + + DataType type = DataType::AUDIO; + const XMLProperty* prop = node.property("default-type"); + + if (prop) { + type = DataType (prop->value()); + } + + assert (type != DataType::NIL); + + if (ds_prop) { + + list<boost::shared_ptr<Diskstream> >::iterator i = _diskstreams_2X.begin (); + while (i != _diskstreams_2X.end() && (*i)->id() != ds_prop->value()) { + ++i; + } + + if (i == _diskstreams_2X.end()) { + error << _("Could not find diskstream for route") << endmsg; + return boost::shared_ptr<Route> (); + } Track* track; @@ -1497,16 +1507,12 @@ Session::XMLRouteFactory (const XMLNode& node, int version) return ret; } - if (ds) { - track->set_diskstream (ds); - } else { - track->use_new_diskstream (); - } - if (track->set_state (node, version)) { delete track; return ret; } + + track->set_diskstream (*i); boost_debug_shared_ptr_mark_interesting (track, "Track"); ret.reset (track); @@ -3099,11 +3105,11 @@ Session::config_changed (std::string p, bool ours) if (Config->get_monitoring_model() == HardwareMonitoring && transport_rolling()) { /* auto-input only makes a difference if we're rolling */ - boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader(); - - for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) { - if ((*i)->record_enabled ()) { - (*i)->monitor_input (!config.get_auto_input()); + boost::shared_ptr<RouteList> rl = routes.reader (); + for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) { + boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i); + if (tr && tr->record_enabled ()) { + tr->monitor_input (!config.get_auto_input()); } } } @@ -3317,3 +3323,32 @@ Session::set_history_depth (uint32_t d) { _history.set_depth (d); } + +int +Session::load_diskstreams_2X (XMLNode const & node, int) +{ + XMLNodeList clist; + XMLNodeConstIterator citer; + + clist = node.children(); + + for (citer = clist.begin(); citer != clist.end(); ++citer) { + + try { + /* diskstreams added automatically by DiskstreamCreated handler */ + if ((*citer)->name() == "AudioDiskstream" || (*citer)->name() == "DiskStream") { + boost::shared_ptr<AudioDiskstream> dsp (new AudioDiskstream (*this, **citer)); + _diskstreams_2X.push_back (dsp); + } else { + error << _("Session: unknown diskstream type in XML") << endmsg; + } + } + + catch (failed_constructor& err) { + error << _("Session: could not load diskstream via XML state") << endmsg; + return -1; + } + } + + return 0; +} |