1 #include <ardour/session.h>
2 #include <ardour/route.h>
3 #include <pbd/memento_command.h>
4 #include <ardour/diskstream.h>
5 #include <ardour/playlist.h>
6 #include <ardour/tempo.h>
7 #include <ardour/audiosource.h>
8 #include <ardour/audioregion.h>
16 void Session::register_with_memento_command_factory(PBD::ID id, StatefulDestructible *ptr)
21 Command *Session::memento_command_factory(XMLNode *n)
24 XMLNode *before = 0, *after = 0;
28 id = PBD::ID(n->property("obj_id")->value());
30 /* get before/after */
32 if (n->name() == "MementoCommand") {
33 before = new XMLNode(*n->children().front());
34 after = new XMLNode(*n->children().back());
36 } else if (n->name() == "MementoUndoCommand") {
37 before = new XMLNode(*n->children().front());
39 } else if (n->name() == "MementoRedoCommand") {
40 after = new XMLNode(*n->children().front());
42 } else if (n->name() == "PlaylistCommand") {
43 before = new XMLNode(*n->children().front());
44 after = new XMLNode(*n->children().back());
50 error << _("Tried to reconstitute a MementoCommand with no contents, failing. id=") << id.to_s() << endmsg;
56 string obj_T = n->children().front()->name();
57 if (obj_T == "AudioRegion" || obj_T == "MidiRegion" || obj_T == "Region") {
58 if (regions.count(id))
59 return new MementoCommand<Region>(*regions[id], before, after);
60 } else if (obj_T == "AudioSource" || obj_T == "MidiSource") {
61 if (sources.count(id))
62 return new MementoCommand<Source>(*sources[id], before, after);
63 } else if (obj_T == "Location") {
64 return new MementoCommand<Location>(*_locations.get_location_by_id(id), before, after);
65 } else if (obj_T == "Locations") {
66 return new MementoCommand<Locations>(_locations, before, after);
67 } else if (obj_T == "TempoMap") {
68 return new MementoCommand<TempoMap>(*_tempo_map, before, after);
69 } else if (obj_T == "Playlist" || obj_T == "AudioPlaylist") {
70 if (Playlist *pl = playlist_by_name(child->property("name")->value()))
71 return new MementoCommand<Playlist>(*pl, before, after);
72 } else if (obj_T == "Route") { // includes AudioTrack
73 return new MementoCommand<Route>(*route_by_id(id), before, after);
74 } else if (obj_T == "Curve") {
76 return new MementoCommand<Curve>(*curves[id], before, after);
77 } else if (obj_T == "AutomationList") {
78 if (automation_lists.count(id))
79 return new MementoCommand<AutomationList>(*automation_lists[id], before, after);
80 } else if (registry.count(id)) { // For Editor and AutomationLine which are off-limits here
81 return new MementoCommand<StatefulDestructible>(*registry[id], before, after);
85 error << _("could not reconstitute MementoCommand from XMLNode. id=") << id.to_s() << endmsg;
90 Session::GlobalSoloStateCommand::GlobalSoloStateCommand(Session &sess, void *src)
91 : sess(sess), src(src)
93 after = before = sess.get_global_route_boolean(&Route::soloed);
95 void Session::GlobalSoloStateCommand::mark()
97 after = sess.get_global_route_boolean(&Route::soloed);
99 void Session::GlobalSoloStateCommand::operator()()
101 sess.set_global_solo(after, src);
103 void Session::GlobalSoloStateCommand::undo()
105 sess.set_global_solo(before, src);
107 XMLNode &Session::GlobalSoloStateCommand::get_state()
109 XMLNode *node = new XMLNode("GlobalSoloStateCommand");
114 Session::GlobalMuteStateCommand::GlobalMuteStateCommand(Session &sess, void *src)
115 : sess(sess), src(src)
117 after = before = sess.get_global_route_boolean(&Route::muted);
119 void Session::GlobalMuteStateCommand::mark()
121 after = sess.get_global_route_boolean(&Route::muted);
123 void Session::GlobalMuteStateCommand::operator()()
125 sess.set_global_mute(after, src);
127 void Session::GlobalMuteStateCommand::undo()
129 sess.set_global_mute(before, src);
131 XMLNode &Session::GlobalMuteStateCommand::get_state()
133 XMLNode *node = new XMLNode("GlobalMuteStateCommand");
138 Session::GlobalRecordEnableStateCommand::GlobalRecordEnableStateCommand(Session &sess, void *src)
139 : sess(sess), src(src)
141 after = before = sess.get_global_route_boolean(&Route::record_enabled);
143 void Session::GlobalRecordEnableStateCommand::mark()
145 after = sess.get_global_route_boolean(&Route::record_enabled);
147 void Session::GlobalRecordEnableStateCommand::operator()()
149 sess.set_global_record_enable(after, src);
151 void Session::GlobalRecordEnableStateCommand::undo()
153 sess.set_global_record_enable(before, src);
155 XMLNode &Session::GlobalRecordEnableStateCommand::get_state()
157 XMLNode *node = new XMLNode("GlobalRecordEnableStateCommand");
162 Session::GlobalMeteringStateCommand::GlobalMeteringStateCommand(Session &sess, void *src)
163 : sess(sess), src(src)
165 after = before = sess.get_global_route_metering();
167 void Session::GlobalMeteringStateCommand::mark()
169 after = sess.get_global_route_metering();
171 void Session::GlobalMeteringStateCommand::operator()()
173 sess.set_global_route_metering(after, src);
175 void Session::GlobalMeteringStateCommand::undo()
177 sess.set_global_route_metering(before, src);
179 XMLNode &Session::GlobalMeteringStateCommand::get_state()
181 XMLNode *node = new XMLNode("GlobalMeteringStateCommand");
185 } // namespace ARDOUR