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>
10 #include <pbd/statefuldestructible.h>
18 void Session::register_with_memento_command_factory(PBD::ID id, PBD::StatefulThingWithGoingAway *ptr)
23 Command *Session::memento_command_factory(XMLNode *n)
26 XMLNode *before = 0, *after = 0;
30 id = PBD::ID(n->property("obj_id")->value());
32 /* get before/after */
34 if (n->name() == "MementoCommand") {
35 before = new XMLNode(*n->children().front());
36 after = new XMLNode(*n->children().back());
38 } else if (n->name() == "MementoUndoCommand") {
39 before = new XMLNode(*n->children().front());
41 } else if (n->name() == "MementoRedoCommand") {
42 after = new XMLNode(*n->children().front());
44 } else if (n->name() == "PlaylistCommand") {
45 before = new XMLNode(*n->children().front());
46 after = new XMLNode(*n->children().back());
52 error << _("Tried to reconstitute a MementoCommand with no contents, failing. id=") << id.to_s() << endmsg;
58 string obj_T = n->children().front()->name();
59 if (obj_T == "AudioRegion" || obj_T == "Region") {
60 if (audio_regions.count(id))
61 return new MementoCommand<AudioRegion>(*audio_regions[id], before, after);
62 } else if (obj_T == "AudioSource") {
63 if (audio_sources.count(id))
64 return new MementoCommand<AudioSource>(*audio_sources[id], before, after);
65 } else if (obj_T == "Location") {
66 return new MementoCommand<Location>(*_locations.get_location_by_id(id), before, after);
67 } else if (obj_T == "Locations") {
68 return new MementoCommand<Locations>(_locations, before, after);
69 } else if (obj_T == "TempoMap") {
70 return new MementoCommand<TempoMap>(*_tempo_map, before, after);
71 } else if (obj_T == "Playlist" || obj_T == "AudioPlaylist") {
72 if (Playlist *pl = playlist_by_name(child->property("name")->value()))
73 return new MementoCommand<Playlist>(*pl, before, after);
74 } else if (obj_T == "Route") { // includes AudioTrack
75 return new MementoCommand<Route>(*route_by_id(id), before, after);
76 } else if (obj_T == "Curve") {
78 return new MementoCommand<Curve>(*curves[id], before, after);
79 } else if (obj_T == "AutomationList") {
80 if (automation_lists.count(id))
81 return new MementoCommand<AutomationList>(*automation_lists[id], before, after);
82 } else if (registry.count(id)) { // For Editor and AutomationLine which are off-limits here
83 return new MementoCommand<PBD::StatefulThingWithGoingAway>(*registry[id], before, after);
87 error << _("could not reconstitute MementoCommand from XMLNode. id=") << id.to_s() << endmsg;
92 Session::GlobalSoloStateCommand::GlobalSoloStateCommand(Session &sess, void *src)
93 : sess(sess), src(src)
95 after = before = sess.get_global_route_boolean(&Route::soloed);
97 void Session::GlobalSoloStateCommand::mark()
99 after = sess.get_global_route_boolean(&Route::soloed);
101 void Session::GlobalSoloStateCommand::operator()()
103 sess.set_global_solo(after, src);
105 void Session::GlobalSoloStateCommand::undo()
107 sess.set_global_solo(before, src);
109 XMLNode &Session::GlobalSoloStateCommand::get_state()
111 XMLNode *node = new XMLNode("GlobalSoloStateCommand");
116 Session::GlobalMuteStateCommand::GlobalMuteStateCommand(Session &sess, void *src)
117 : sess(sess), src(src)
119 after = before = sess.get_global_route_boolean(&Route::muted);
121 void Session::GlobalMuteStateCommand::mark()
123 after = sess.get_global_route_boolean(&Route::muted);
125 void Session::GlobalMuteStateCommand::operator()()
127 sess.set_global_mute(after, src);
129 void Session::GlobalMuteStateCommand::undo()
131 sess.set_global_mute(before, src);
133 XMLNode &Session::GlobalMuteStateCommand::get_state()
135 XMLNode *node = new XMLNode("GlobalMuteStateCommand");
140 Session::GlobalRecordEnableStateCommand::GlobalRecordEnableStateCommand(Session &sess, void *src)
141 : sess(sess), src(src)
143 after = before = sess.get_global_route_boolean(&Route::record_enabled);
145 void Session::GlobalRecordEnableStateCommand::mark()
147 after = sess.get_global_route_boolean(&Route::record_enabled);
149 void Session::GlobalRecordEnableStateCommand::operator()()
151 sess.set_global_record_enable(after, src);
153 void Session::GlobalRecordEnableStateCommand::undo()
155 sess.set_global_record_enable(before, src);
157 XMLNode &Session::GlobalRecordEnableStateCommand::get_state()
159 XMLNode *node = new XMLNode("GlobalRecordEnableStateCommand");
164 Session::GlobalMeteringStateCommand::GlobalMeteringStateCommand(Session &sess, void *src)
165 : sess(sess), src(src)
167 after = before = sess.get_global_route_metering();
169 void Session::GlobalMeteringStateCommand::mark()
171 after = sess.get_global_route_metering();
173 void Session::GlobalMeteringStateCommand::operator()()
175 sess.set_global_route_metering(after, src);
177 void Session::GlobalMeteringStateCommand::undo()
179 sess.set_global_route_metering(before, src);
181 XMLNode &Session::GlobalMeteringStateCommand::get_state()
183 XMLNode *node = new XMLNode("GlobalMeteringStateCommand");
187 } // namespace ARDOUR