*/
-#include <ardour/session.h>
-#include <ardour/route.h>
-#include <pbd/memento_command.h>
-#include <ardour/diskstream.h>
-#include <ardour/playlist.h>
-#include <ardour/audioplaylist.h>
-#include <ardour/audio_track.h>
-#include <ardour/tempo.h>
-#include <ardour/audiosource.h>
-#include <ardour/audioregion.h>
-#include <pbd/error.h>
-#include <pbd/id.h>
-#include <pbd/statefuldestructible.h>
-#include <pbd/failed_constructor.h>
+#include "ardour/session.h"
+#include "ardour/route.h"
+#include "pbd/memento_command.h"
+#include "ardour/diskstream.h"
+#include "ardour/playlist.h"
+#include "ardour/audioplaylist.h"
+#include "ardour/audio_track.h"
+#include "ardour/midi_playlist.h"
+#include "ardour/midi_track.h"
+#include "ardour/tempo.h"
+#include "ardour/audiosource.h"
+#include "ardour/audioregion.h"
+#include "ardour/midi_source.h"
+#include "ardour/midi_region.h"
+#include "pbd/error.h"
+#include "pbd/id.h"
+#include "pbd/statefuldestructible.h"
+#include "pbd/failed_constructor.h"
+#include "evoral/Curve.hpp"
using namespace PBD;
using namespace ARDOUR;
XMLNode *child = 0;
/* get id */
- id = PBD::ID(n->property("obj_id")->value());
+ id = PBD::ID(n->property("obj-id")->value());
/* get before/after */
before = new XMLNode(*n->children().front());
after = new XMLNode(*n->children().back());
child = before;
- }
+ }
- if (!child)
- {
+ if (!child) {
error << _("Tried to reconstitute a MementoCommand with no contents, failing. id=") << id.to_s() << endmsg;
return 0;
}
/* create command */
- string obj_T = n->property ("type_name")->value();
- if (obj_T == typeid (AudioRegion).name() || obj_T == typeid (Region).name()) {
- if (audio_regions.count(id)) {
- return new MementoCommand<AudioRegion>(*audio_regions[id], before, after);
+ 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)) {
+ return new MementoCommand<Region>(*regions[id], before, after);
}
- } else if (obj_T == typeid (AudioSource).name()) {
- if (audio_sources.count(id))
- return new MementoCommand<AudioSource>(*audio_sources[id], before, after);
+ } else if (obj_T == typeid (AudioSource).name() || obj_T == typeid (MidiSource).name()) {
+ if (sources.count(id))
+ return new MementoCommand<Source>(*sources[id], before, after);
} else if (obj_T == typeid (Location).name()) {
- return new MementoCommand<Location>(*_locations.get_location_by_id(id), before, after);
+ Location* loc = _locations.get_location_by_id(id);
+ if (loc) {
+ return new MementoCommand<Location>(*loc, before, after);
+ }
} else if (obj_T == typeid (Locations).name()) {
return new MementoCommand<Locations>(_locations, before, after);
} else if (obj_T == typeid (TempoMap).name()) {
return new MementoCommand<TempoMap>(*_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<Playlist> pl = playlist_by_name(child->property("name")->value())) {
return new MementoCommand<Playlist>(*(pl.get()), before, after);
}
- } else if (obj_T == typeid (Route).name() || obj_T == typeid (AudioTrack).name()) {
- return new MementoCommand<Route>(*route_by_id(id), before, after);
- } else if (obj_T == typeid (Curve).name() || obj_T == typeid (AutomationList).name()) {
- if (automation_lists.count(id))
- return new MementoCommand<AutomationList>(*automation_lists[id], before, after);
+ } else if (obj_T == typeid (Route).name() || obj_T == typeid (AudioTrack).name() || obj_T == typeid(MidiTrack).name()) {
+ if (boost::shared_ptr<Route> r = route_by_id(id)) {
+ return new MementoCommand<Route>(*r, before, after);
+ } else {
+ error << string_compose (X_("Route %1 not found in session"), id) << endmsg;
+ }
+ } else if (obj_T == typeid (Evoral::Curve).name() || obj_T == typeid (AutomationList).name()) {
+ std::map<PBD::ID, AutomationList*>::iterator i = automation_lists.find(id);
+ if (i != automation_lists.end()) {
+ return new MementoCommand<AutomationList>(*i->second, before, after);
+ }
} else if (registry.count(id)) { // For Editor and AutomationLine which are off-limits here
return new MementoCommand<PBD::StatefulThingWithGoingAway>(*registry[id], before, after);
}