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 */
31 if (n->name() == "MementoCommand")
33 before = new XMLNode(*n->children().front());
34 after = new XMLNode(*n->children().back());
36 } else if (n->name() == "MementoUndoCommand")
38 before = new XMLNode(*n->children().front());
41 else if (n->name() == "MementoRedoCommand")
43 after = new XMLNode(*n->children().front());
49 error << _("Tried to reconstitute a MementoCommand with no contents, failing. id=") << id.to_s() << endmsg;
55 string obj_T = n->children().front()->name();
56 if (obj_T == "AudioRegion" || obj_T == "Region")
58 if (audio_regions.count(id))
59 return new MementoCommand<AudioRegion>(*audio_regions[id], before, after);
61 else if (obj_T == "AudioSource")
63 if (audio_sources.count(id))
64 return new MementoCommand<AudioSource>(*audio_sources[id], before, after);
66 else if (obj_T == "Location")
67 return new MementoCommand<Location>(*_locations.get_location_by_id(id), before, after);
68 else if (obj_T == "Locations")
69 return new MementoCommand<Locations>(_locations, before, after);
70 else if (obj_T == "TempoMap")
71 return new MementoCommand<TempoMap>(*_tempo_map, before, after);
72 else if (obj_T == "Playlist" || obj_T == "AudioPlaylist")
74 if (Playlist *pl = playlist_by_name(child->property("name")->value()))
75 return new MementoCommand<Playlist>(*pl, before, after);
77 else if (obj_T == "Route") // inlcudes AudioTrack
78 return new MementoCommand<Route>(*route_by_id(id), before, after);
79 else if (obj_T == "Curve")
82 return new MementoCommand<Curve>(*curves[id], before, after);
84 else if (obj_T == "AutomationList")
86 if (automation_lists.count(id))
87 return new MementoCommand<AutomationList>(*automation_lists[id], before, after);
89 // For Editor and AutomationLine which are off-limits here
90 else if (registry.count(id))
91 return new MementoCommand<StatefulDestructible>(*registry[id], before, after);
95 error << _("could not reconstitute MementoCommand from XMLNode. id=") << id.to_s() << endmsg;
100 Session::GlobalSoloStateCommand::GlobalSoloStateCommand(Session &sess, void *src)
101 : sess(sess), src(src)
103 after = before = sess.get_global_route_boolean(&Route::soloed);
105 void Session::GlobalSoloStateCommand::mark()
107 after = sess.get_global_route_boolean(&Route::soloed);
109 void Session::GlobalSoloStateCommand::operator()()
111 sess.set_global_solo(after, src);
113 void Session::GlobalSoloStateCommand::undo()
115 sess.set_global_solo(before, src);
117 XMLNode &Session::GlobalSoloStateCommand::get_state()
119 XMLNode *node = new XMLNode("GlobalSoloStateCommand");
124 Session::GlobalMuteStateCommand::GlobalMuteStateCommand(Session &sess, void *src)
125 : sess(sess), src(src)
127 after = before = sess.get_global_route_boolean(&Route::muted);
129 void Session::GlobalMuteStateCommand::mark()
131 after = sess.get_global_route_boolean(&Route::muted);
133 void Session::GlobalMuteStateCommand::operator()()
135 sess.set_global_mute(after, src);
137 void Session::GlobalMuteStateCommand::undo()
139 sess.set_global_mute(before, src);
141 XMLNode &Session::GlobalMuteStateCommand::get_state()
143 XMLNode *node = new XMLNode("GlobalMuteStateCommand");
148 Session::GlobalRecordEnableStateCommand::GlobalRecordEnableStateCommand(Session &sess, void *src)
149 : sess(sess), src(src)
151 after = before = sess.get_global_route_boolean(&Route::record_enabled);
153 void Session::GlobalRecordEnableStateCommand::mark()
155 after = sess.get_global_route_boolean(&Route::record_enabled);
157 void Session::GlobalRecordEnableStateCommand::operator()()
159 sess.set_global_record_enable(after, src);
161 void Session::GlobalRecordEnableStateCommand::undo()
163 sess.set_global_record_enable(before, src);
165 XMLNode &Session::GlobalRecordEnableStateCommand::get_state()
167 XMLNode *node = new XMLNode("GlobalRecordEnableStateCommand");
172 Session::GlobalMeteringStateCommand::GlobalMeteringStateCommand(Session &sess, void *src)
173 : sess(sess), src(src)
175 after = before = sess.get_global_route_metering();
177 void Session::GlobalMeteringStateCommand::mark()
179 after = sess.get_global_route_metering();
181 void Session::GlobalMeteringStateCommand::operator()()
183 sess.set_global_route_metering(after, src);
185 void Session::GlobalMeteringStateCommand::undo()
187 sess.set_global_route_metering(before, src);
189 XMLNode &Session::GlobalMeteringStateCommand::get_state()
191 XMLNode *node = new XMLNode("GlobalMeteringStateCommand");
195 } // namespace ARDOUR