Can pass a core to ardbg now. Fixed sometimes crash on saving history by
[ardour.git] / libs / ardour / session_command.cc
1 #include <ardour/session.h>
2 #include <ardour/route.h>
3 #include <pbd/memento_command.h>
4 #include <ardour/diskstream.h>
5
6 namespace ARDOUR {
7
8 Command *Session::memento_command_factory(XMLNode *n)
9 {
10     PBD::ID id;
11     XMLNode *before, *after;
12     void *obj;
13
14     /* get obj_id */
15
16     /* get before and/or after */
17
18     /* get an object by id by trial and error, and use it to construct an
19      * appropriate memento command */
20     // e.g.
21     if (Diskstream *obj = diskstream_by_id(id))
22         return new MementoCommand<Diskstream>(*obj, *before, *after);
23     // etc.
24 }
25
26 // solo
27 Session::GlobalSoloStateCommand::GlobalSoloStateCommand(Session &sess, void *src)
28     : sess(sess), src(src)
29 {
30     after = before = sess.get_global_route_boolean(&Route::soloed);
31 }
32 void Session::GlobalSoloStateCommand::mark()
33 {
34     after = sess.get_global_route_boolean(&Route::soloed);
35 }
36 void Session::GlobalSoloStateCommand::operator()()
37 {
38     sess.set_global_solo(after, src);
39 }
40 void Session::GlobalSoloStateCommand::undo()
41 {
42     sess.set_global_solo(before, src);
43 }
44 XMLNode &Session::GlobalSoloStateCommand::get_state()
45 {
46     XMLNode *node = new XMLNode("GlobalSoloStateCommand");
47     return *node;
48 }
49
50 // mute
51 Session::GlobalMuteStateCommand::GlobalMuteStateCommand(Session &sess, void *src)
52     : sess(sess), src(src)
53 {
54     after = before = sess.get_global_route_boolean(&Route::muted);
55 }
56 void Session::GlobalMuteStateCommand::mark()
57 {
58     after = sess.get_global_route_boolean(&Route::muted);
59 }
60 void Session::GlobalMuteStateCommand::operator()()
61 {
62     sess.set_global_mute(after, src);
63 }
64 void Session::GlobalMuteStateCommand::undo()
65 {
66     sess.set_global_mute(before, src);
67 }
68 XMLNode &Session::GlobalMuteStateCommand::get_state()
69 {
70     XMLNode *node = new XMLNode("GlobalMuteStateCommand");
71     return *node;
72 }
73
74 // record enable
75 Session::GlobalRecordEnableStateCommand::GlobalRecordEnableStateCommand(Session &sess, void *src) 
76     : sess(sess), src(src)
77 {
78     after = before = sess.get_global_route_boolean(&Route::record_enabled);
79 }
80 void Session::GlobalRecordEnableStateCommand::mark()
81 {
82     after = sess.get_global_route_boolean(&Route::record_enabled);
83 }
84 void Session::GlobalRecordEnableStateCommand::operator()()
85 {
86     sess.set_global_record_enable(after, src);
87 }
88 void Session::GlobalRecordEnableStateCommand::undo()
89 {
90     sess.set_global_record_enable(before, src);
91 }
92 XMLNode &Session::GlobalRecordEnableStateCommand::get_state()
93 {
94     XMLNode *node = new XMLNode("GlobalRecordEnableStateCommand");
95     return *node;
96 }
97
98 // metering
99 Session::GlobalMeteringStateCommand::GlobalMeteringStateCommand(Session &sess, void *src) 
100     : sess(sess), src(src)
101 {
102     after = before = sess.get_global_route_metering();
103 }
104 void Session::GlobalMeteringStateCommand::mark()
105 {
106     after = sess.get_global_route_metering();
107 }
108 void Session::GlobalMeteringStateCommand::operator()()
109 {
110     sess.set_global_route_metering(after, src);
111 }
112 void Session::GlobalMeteringStateCommand::undo()
113 {
114     sess.set_global_route_metering(before, src);
115 }
116 XMLNode &Session::GlobalMeteringStateCommand::get_state()
117 {
118     XMLNode *node = new XMLNode("GlobalMeteringStateCommand");
119     return *node;
120 }
121
122 } // namespace ARDOUR