X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_command.cc;h=b696f7d410a6b0f6c3ed61a6b4bc6e1e96239b6b;hb=22dc575e4cbc35a5d486d6f448332fb721865d57;hp=7cf52b741ff4835022d77d298aa85bc053ca4a8c;hpb=f9f5ec85fbfd15d0008f70d4185a84eeadfd3891;p=ardour.git diff --git a/libs/ardour/session_command.cc b/libs/ardour/session_command.cc index 7cf52b741f..b696f7d410 100644 --- a/libs/ardour/session_command.cc +++ b/libs/ardour/session_command.cc @@ -1,3 +1,22 @@ +/* + Copyright (C) 2000-2007 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + #include #include #include @@ -5,6 +24,8 @@ #include #include #include +#include +#include #include #include #include @@ -51,7 +72,7 @@ Session::memento_command_factory(XMLNode *n) before = new XMLNode(*n->children().front()); after = new XMLNode(*n->children().back()); child = before; - } + } if (!child) { @@ -62,24 +83,28 @@ Session::memento_command_factory(XMLNode *n) /* create command */ string obj_T = n->property ("type_name")->value(); if (obj_T == typeid (AudioRegion).name() || obj_T == typeid (MidiRegion).name() || obj_T == typeid (Region).name()) { - if (regions.count(id)) + if (regions.count(id)) { return new MementoCommand(*regions[id], before, after); + } } else if (obj_T == typeid (AudioSource).name() || obj_T == typeid (MidiSource).name()) { if (sources.count(id)) return new MementoCommand(*sources[id], before, after); } else if (obj_T == typeid (Location).name()) { - return new MementoCommand(*_locations.get_location_by_id(id), before, after); + Location* loc = _locations.get_location_by_id(id); + if (loc) { + return new MementoCommand(*loc, before, after); + } } else if (obj_T == typeid (Locations).name()) { return new MementoCommand(_locations, before, after); } else if (obj_T == typeid (TempoMap).name()) { return new MementoCommand(*_tempo_map, before, after); - } else if (obj_T == typeid (Playlist).name() || obj_T == typeid (AudioPlaylist).name()) { + } else if (obj_T == typeid (Playlist).name() || obj_T == typeid (AudioPlaylist).name() || obj_T == typeid (MidiPlaylist).name()) { if (boost::shared_ptr pl = playlist_by_name(child->property("name")->value())) { return new MementoCommand(*(pl.get()), before, after); } - } else if (obj_T == typeid (Route).name() || obj_T == typeid (AudioTrack).name()) { + } else if (obj_T == typeid (Route).name() || obj_T == typeid (AudioTrack).name() || obj_T == typeid(MidiTrack).name()) { return new MementoCommand(*route_by_id(id), before, after); - } else if (obj_T == typeid (Curve).name() || obj_T == typeid (AutomationList).name()) { + } else if (obj_T == typeid (Evoral::Curve).name() || obj_T == typeid (AutomationList).name()) { if (automation_lists.count(id)) return new MementoCommand(*automation_lists[id], before, after); } else if (registry.count(id)) { // For Editor and AutomationLine which are off-limits here @@ -88,6 +113,7 @@ Session::memento_command_factory(XMLNode *n) /* we failed */ error << string_compose (_("could not reconstitute MementoCommand from XMLNode. object type = %1 id = %2"), obj_T, id.to_s()) << endmsg; + return 0 ; } @@ -394,7 +420,7 @@ Session::GlobalMeteringStateCommand::get_state() if (r) { child->add_property (X_("id"), r->id().to_s()); - const char* meterstr; + const char* meterstr = 0; switch (x->second) { case MeterInput: @@ -406,6 +432,8 @@ Session::GlobalMeteringStateCommand::get_state() case MeterPostFader: meterstr = X_("post"); break; + default: + fatal << string_compose (_("programming error: %1") , "no meter state in Session::GlobalMeteringStateCommand::get_state") << endmsg; } child->add_property (X_("meter"), meterstr); @@ -432,6 +460,7 @@ Session::GlobalMeteringStateCommand::get_state() case MeterPostFader: meterstr = X_("post"); break; + default: meterstr = ""; } child->add_property (X_("meter"), meterstr);