3 # LADI Session Handler (ladish)
5 # Copyright (C) 2008, 2009, 2010 Nedko Arnaudov <nedko@arnaudov.name>
7 #*************************************************************************
8 # This file contains code of the commandline control app
9 #*************************************************************************
11 # LADI Session Handler is free software; you can redistribute it and/or modify
12 # it under the terms of the GNU General Public License as published by
13 # the Free Software Foundation; either version 2 of the License, or
14 # (at your option) any later version.
16 # LADI Session Handler is distributed in the hope that it will be useful,
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 # GNU General Public License for more details.
21 # You should have received a copy of the GNU General Public License
22 # along with LADI Session Handler. If not, see <http://www.gnu.org/licenses/>
23 # or write to the Free Software Foundation, Inc.,
24 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
26 service_name
= 'org.ladish'
28 control_object_path
= "/org/ladish/Control"
29 studio_object_path
= "/org/ladish/Studio"
31 control_interface_name
= 'org.ladish.Control'
32 studio_interface_name
= 'org.ladish.Studio'
33 app_supervisor_interface_name
= 'org.ladish.AppSupervisor'
38 from traceback
import print_exc
42 def bool_convert(str_value
):
43 if str_value
.lower() == "false":
46 if str_value
.lower() == "off":
49 if str_value
.lower() == "no":
55 if str_value
.lower() == "(null)":
58 return bool(str_value
)
60 def dbus_type_to_python_type(dbus_value
):
61 if type(dbus_value
) == dbus
.Boolean
:
62 return bool(dbus_value
)
63 if type(dbus_value
) == dbus
.Int32
or type(dbus_value
) == dbus
.UInt32
:
64 return int(dbus_value
)
67 def dbus_type_to_type_string(dbus_value
):
68 if type(dbus_value
) == dbus
.Boolean
:
70 if type(dbus_value
) == dbus
.Int32
:
72 if type(dbus_value
) == dbus
.UInt32
:
74 if type(dbus_value
) == dbus
.Byte
:
76 if type(dbus_value
) == dbus
.String
:
79 return None # throw exception here?
81 def dbus_typesig_to_type_string(type_char
):
82 type_char
= str(type_char
)
94 print('unknown dbus typesig')
95 return None # throw exception here?
97 def parse_new_app_args(params_array
):
99 cmdline
= params_array
[0]
106 if index
< len(params_array
):
107 if params_array
[index
] == '-':
108 return index
+ 1, cmdline
, name
, level
, term
109 name
= params_array
[index
]
112 if index
< len(params_array
):
113 if params_array
[index
] == '-':
114 return index
+ 1, cmdline
, name
, level
, term
115 # direct conversion to dbus.Byte is wrong because ord() is used ("1" -> 0x31 instead of "1" -> 0x01)
116 level
= int(params_array
[index
])
119 if index
< len(params_array
):
120 if params_array
[index
] == '-':
121 return index
+ 1, cmdline
, name
, level
, term
122 if params_array
[index
] == 'term':
126 if index
< len(params_array
) and params_array
[index
] == '-':
129 return index
, cmdline
, name
, level
, term
131 def add_app(obj
, cmdline
, name
, level
, term
):
132 dbus
.Interface(obj
, app_supervisor_interface_name
).RunCustom(term
, cmdline
, name
, level
)
134 def get_room_obj_by_name(bus
, studio_iface
, room_name
):
135 for room
in studio_iface
.GetRoomList():
138 name
= room
[1]["name"]
139 if name
== room_name
:
140 return bus
.get_object(service_name
, opath
)
143 if len(sys
.argv
) == 1:
144 argv0
= os
.path
.basename(sys
.argv
[0])
145 print("Usage: %s [command] [command] ..." % argv0
)
147 print(" exit - exit ladish dbus service")
148 print(" slist - list studios")
149 print(" alist - list apps")
150 print(" sload <studioname> - load studio")
151 print(" sdel <studioname> - delete studio")
152 print(" snew [studioname] - new studio")
153 print(" sisloaded - is studio loaded?")
154 print(" sname - get studio name")
155 print(" ssave - save studio")
156 print(" sunload - unload studio")
157 print(" srename <studioname> - rename studio")
158 print(" sstart - start studio")
159 print(" sstop - stop studio")
160 print(" rtlist - list room templates")
161 print(" rtdel <roomtemplatename> - delete room template")
162 print(" rtnew <roomtemplatename> - create new room template")
163 print(" snewroom <rname> <rtname> - create new studio room")
164 print(" srlist - list studio rooms")
165 print(" sdelroom <rname> - delete studio room")
166 print(" snewapp <appargs> - add new app to studio (see below for more info)")
167 print(" rnewapp <rname> <appargs> - add new app to room (see below for more info)")
169 print("Add new app arguments:");
170 print(" <commandline> [<name> [<level>] [term]] [-]");
172 print(" <commandline> - the commandline to execut");
173 print(" <name> - app name");
174 print(" <level> - level, default is 0");
175 print(" term - if specified, app will be run in terminal");
176 print(" - - marks end of new app params, useful if there are other commands following");
180 print(" * Add to studio jack_mixer instance named \"mixer\", at level 1, without terminal");
182 print(" $ %s snewapp jack_mixer mixer 1" % argv0
);
184 print(" * Add to room \"main\" fluidjack instance named \"fluid\", at level 0, with terminal");
186 print(" $ %s rnewapp main \"fluidjack FluidR3.SF2\" fluid 0 term" % argv0
);
190 bus
= dbus
.SessionBus()
196 while index
< len(sys
.argv
):
197 arg
= sys
.argv
[index
]
201 control_obj
= bus
.get_object(service_name
, control_object_path
)
202 control_iface
= dbus
.Interface(control_obj
, control_interface_name
)
208 # we have deactivated the object and we need to get new connection if there are more commands
212 print("--- studio list")
213 for studio
in control_iface
.GetStudioList():
215 mtime
= studio
[1]['Modification Time']
216 print('"%s" last modified on %s' % (name
, time
.ctime(mtime
)))
218 print("--- app list")
219 for app
in control_iface
.GetApplicationList():
222 print("--- studio load")
223 if index
>= len(sys
.argv
):
224 print("load studio command requires studio name argument")
227 arg
= sys
.argv
[index
]
231 #open_options["option1"] = "asd"
232 #open_options["option2"] = True
234 control_iface
.LoadStudio(arg
, open_options
)
236 print("--- studio delete")
237 if index
>= len(sys
.argv
):
238 print("delete studio command requires studio name argument")
241 arg
= sys
.argv
[index
]
244 control_iface
.DeleteStudio(arg
)
246 print("--- studio new")
248 if index
< len(sys
.argv
):
249 name
= sys
.argv
[index
]
252 control_iface
.NewStudio(name
)
253 elif arg
== 'sisloaded':
254 print("--- studio is loaded")
255 if control_iface
.IsStudioLoaded():
259 elif arg
== 'rtlist':
260 print("--- list room templates")
261 for studio
in control_iface
.GetRoomTemplateList():
265 print("--- create new room template")
266 if index
>= len(sys
.argv
):
267 print("create new room template command requires room template name argument")
270 arg
= sys
.argv
[index
]
273 control_iface
.CreateRoomTemplate(arg
)
275 print("--- delete room template")
276 if index
>= len(sys
.argv
):
277 print("delete room template command requires room template name argument")
280 arg
= sys
.argv
[index
]
283 control_iface
.DeleteRoomTemplate(arg
)
286 studio_obj
= bus
.get_object(service_name
, studio_object_path
)
287 studio_iface
= dbus
.Interface(studio_obj
, studio_interface_name
)
290 print("--- studio get name")
291 print("\"%s\"" % studio_iface
.GetName())
293 print("--- studio save")
295 elif arg
== 'sunload':
296 print("--- studio unload")
297 studio_iface
.Unload()
300 elif arg
== 'srename':
301 print("--- studio rename")
302 if index
>= len(sys
.argv
):
303 print("rename studio command requires studio name argument")
306 arg
= sys
.argv
[index
]
309 studio_iface
.Rename(arg
)
310 elif arg
== 'sstart':
311 print("--- studio start")
314 print("--- studio stop")
316 elif arg
== 'snewroom':
317 print("--- create new studio room")
318 if index
+ 1 >= len(sys
.argv
):
319 print("creation of studio room requires room name and room template name arguments")
322 room_name
= sys
.argv
[index
]
324 room_template_name
= sys
.argv
[index
]
327 studio_iface
.CreateRoom(room_name
, room_template_name
)
328 elif arg
== 'srlist':
329 print("--- list studio rooms")
330 for room
in studio_iface
.GetRoomList():
333 name
= room
[1]["name"]
334 if room
[1].has_key("template"):
335 template
= str(room
[1]["template"])
340 print('"%s" from template "%s" (%s)' % (name
, template
, opath
))
342 print('"%s" (%s)' % (name
, opath
))
343 elif arg
== 'sdelroom':
344 print("--- delete studio room")
345 if index
>= len(sys
.argv
):
346 print("delete studio room command requires room name argument")
349 arg
= sys
.argv
[index
]
352 studio_iface
.DeleteRoom(arg
)
353 elif arg
== 'snewapp':
354 print("--- new studio app")
355 count
, cmdline
, name
, level
, term
= parse_new_app_args(sys
.argv
[index
:])
357 add_app(studio_obj
, cmdline
, name
, level
, term
)
358 elif arg
== 'rnewapp':
359 print("--- new room app")
360 arg
= sys
.argv
[index
]
363 count
, cmdline
, name
, level
, term
= parse_new_app_args(sys
.argv
[index
:])
366 add_app(get_room_obj_by_name(bus
, studio_iface
, arg
), cmdline
, name
, level
, term
)
368 print("Unknown command '%s'" % arg
)
369 except dbus
.DBusException
, e
:
370 print("DBus exception: %s" % str(e
))
372 if __name__
== '__main__':