jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

388 lines
15KB

  1. #!/usr/bin/python3
  2. from __future__ import print_function
  3. name_base = 'org.jackaudio'
  4. control_interface_name = name_base + '.JackControl'
  5. configure_interface_name = name_base + '.Configure'
  6. service_name = name_base + '.service'
  7. control_iface = None
  8. configure_iface = None
  9. import sys
  10. import os
  11. from traceback import print_exc
  12. import dbus
  13. def bool_convert(str_value):
  14. if str_value == "0" or str_value.lower() in ["false","off","no","(null)"]:
  15. return False
  16. return bool(str_value)
  17. def dbus_type_to_python_type(dbus_value):
  18. t = type(dbus_value)
  19. if t == dbus.Boolean:
  20. return bool(dbus_value)
  21. if t == dbus.Int32 or t == dbus.UInt32:
  22. return int(dbus_value)
  23. return dbus_value
  24. def python_type_to_jackdbus_type(value, type_char):
  25. type_char = str(type_char)
  26. if type_char == "b":
  27. return bool_convert(value);
  28. elif type_char == "y":
  29. return dbus.Byte(ord(value));
  30. elif type_char == "i":
  31. return dbus.Int32(value)
  32. elif type_char == "u":
  33. return dbus.UInt32(value)
  34. return value
  35. def dbus_typesig_to_type_string(type_char):
  36. type_char = str(type_char)
  37. if type_char == 'i':
  38. return "sint"
  39. if type_char == 'u':
  40. return "uint"
  41. if type_char == 'y':
  42. return "char"
  43. if type_char == 's':
  44. return "str"
  45. if type_char == 'b':
  46. return "bool"
  47. print('shit')
  48. return None # throw exception here?
  49. def get_parameters(iface, path):
  50. params = iface.GetParametersInfo(path)
  51. #print params
  52. for param in params:
  53. typestr = dbus_typesig_to_type_string(param[0])
  54. name = param[1]
  55. #print name
  56. descr = param[2]
  57. #print descr
  58. isset, default, value = iface.GetParameterValue(path + [name])
  59. #print typestr
  60. if bool(isset):
  61. isset = "set"
  62. else:
  63. isset = "notset"
  64. value = dbus_type_to_python_type(value)
  65. default = dbus_type_to_python_type(default)
  66. print("%20s: %s (%s:%s:%s:%s)" %(name, descr, typestr, isset, default, value))
  67. def print_help():
  68. print("Usage: %s [command] [command] ..." % os.path.basename(sys.argv[0]))
  69. print("Commands:")
  70. print(" shell - execute commands from stdin until End Of File (Ctrl+D in terminal)")
  71. print(" exit - exit jack dbus service (stops jack server if currently running)")
  72. print(" help - print this help text")
  73. print(" status - check whether jack server is started, return value is 0 if running and 1 otherwise")
  74. print(" start - start jack server if not currently started")
  75. print(" stop - stop jack server if currently started")
  76. print(" sm - switch master to currently selected driver")
  77. print(" dl - get list of available drivers")
  78. print(" dg - get currently selected driver")
  79. print(" ds <driver> - select driver")
  80. print(" dp - get parameters of currently selected driver")
  81. print(" dpd <param> - get long description for driver parameter")
  82. print(" dps <param> <value> - set driver parameter")
  83. print(" dpr <param> - reset driver parameter to its default value")
  84. print(" asd <driver> - add slave driver")
  85. print(" rsd <driver> - remove slave driver")
  86. print(" il - get list of available internals")
  87. print(" ip <name> - get parameters of given internal")
  88. print(" ipd <name> <param> - get long description for internal parameter")
  89. print(" ips <name> <param> <value> - set internal parameter")
  90. print(" ipr <name> <param> - reset internal parameter to its default value")
  91. print(" iload <name> - load internal")
  92. print(" iunload <name> - unload internal")
  93. print(" ep - get engine parameters")
  94. print(" epd <param> - get long description for engine parameter")
  95. print(" eps <param> <value> - set engine parameter")
  96. print(" epr <param> - reset engine parameter to its default value")
  97. def maybe_print_param_constraint(iface, param):
  98. is_range, is_strict, is_fake, values = iface.GetParameterConstraint(param)
  99. if is_range:
  100. print()
  101. print(("allowed range: %s to %s (inclusive)" % (values[0][0], values[1][0])))
  102. elif len(values):
  103. print()
  104. if is_strict:
  105. print("allowed values:")
  106. else:
  107. print("suggested values:")
  108. max_len = 0
  109. for value in values:
  110. if len(str(value[0])) > max_len:
  111. max_len = len(str(value[0]))
  112. for value in values:
  113. print(("%*s'%s' - %s" % (1 + max_len - len(str(value[0])), "", str(value[0]), str(value[1]))))
  114. def parse_argv(argv):
  115. global control_iface, configure_iface
  116. # check arguments
  117. index = 0
  118. while index < len(argv):
  119. arg = argv[index]
  120. index += 1
  121. try:
  122. if arg == 'exit':
  123. print("--- exit")
  124. control_iface.Exit()
  125. elif arg == 'status':
  126. print("--- status")
  127. if control_iface.IsStarted():
  128. return (0, "started")
  129. else:
  130. return (1, "stoped")
  131. elif arg == 'start':
  132. print("--- start")
  133. control_iface.StartServer()
  134. elif arg == 'stop':
  135. print("--- stop")
  136. control_iface.StopServer()
  137. elif arg == 'sm':
  138. print("--- switch master driver")
  139. control_iface.SwitchMaster()
  140. elif arg == 'ism':
  141. if control_iface.IsManuallyActivated():
  142. print("Manually activated")
  143. else:
  144. print("Automatically activated")
  145. elif arg == 'dl':
  146. print("--- drivers list")
  147. is_range, is_strict, is_fake_values, values = configure_iface.GetParameterConstraint(['engine', 'driver'])
  148. for value in values:
  149. print(value[1])
  150. elif arg == 'dg':
  151. print("--- get selected driver")
  152. isset, default, value = configure_iface.GetParameterValue(['engine', 'driver'])
  153. print(value)
  154. elif arg == 'ds':
  155. if index >= len(argv):
  156. return (1, "driver select command requires driver name argument")
  157. arg = argv[index]
  158. index += 1
  159. print("--- driver select \"%s\"" % arg)
  160. configure_iface.SetParameterValue(['engine', 'driver'], dbus.String(arg))
  161. elif arg == 'dp':
  162. print("--- get driver parameters (type:isset:default:value)")
  163. get_parameters(configure_iface, ['driver'])
  164. elif arg == 'dpd':
  165. if index >= len(argv):
  166. return (1, "get driver parameter long description command requires parameter name argument")
  167. param = argv[index]
  168. index += 1
  169. print("--- get driver parameter description (%s)" % param)
  170. type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['driver', param])
  171. print(long_descr)
  172. maybe_print_param_constraint(configure_iface, ['driver', param])
  173. elif arg == 'dps':
  174. if index + 1 >= len(argv):
  175. return (1, "driver parameter set command requires parameter name and value arguments")
  176. param = argv[index]
  177. index += 1
  178. value = argv[index]
  179. index += 1
  180. print("--- driver param set \"%s\" -> \"%s\"" % (param, value))
  181. type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['driver', param])
  182. configure_iface.SetParameterValue(['driver', param], python_type_to_jackdbus_type(value, type_char))
  183. elif arg == 'dpr':
  184. if index >= len(argv):
  185. return (1, "driver parameter reset command requires parameter name argument")
  186. param = argv[index]
  187. index += 1
  188. print("--- driver param reset \"%s\"" % param)
  189. configure_iface.ResetParameterValue(['driver', param])
  190. elif arg == 'ep':
  191. print("--- get engine parameters (type:isset:default:value)")
  192. get_parameters(configure_iface, ['engine'])
  193. elif arg == 'epd':
  194. if index >= len(argv):
  195. return (1, "get engine parameter long description command requires parameter name argument")
  196. param_name = argv[index]
  197. index += 1
  198. print("--- get engine parameter description (%s)" % param_name)
  199. type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['engine', param_name])
  200. print(long_descr)
  201. maybe_print_param_constraint(configure_iface, ['engine', param_name])
  202. elif arg == 'eps':
  203. if index + 1 >= len(argv):
  204. return (1, "engine parameter set command requires parameter name and value arguments")
  205. param = argv[index]
  206. index += 1
  207. value = argv[index]
  208. index += 1
  209. print("--- engine param set \"%s\" -> \"%s\"" % (param, value))
  210. type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['engine', param])
  211. configure_iface.SetParameterValue(['engine', param], python_type_to_jackdbus_type(value, type_char))
  212. elif arg == 'epr':
  213. if index >= len(argv):
  214. return (1, "engine parameter reset command requires parameter name")
  215. param = argv[index]
  216. index += 1
  217. print("--- engine param reset \"%s\"" % param)
  218. type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['engine', param])
  219. configure_iface.ResetParameterValue(['engine', param])
  220. elif arg == 'il':
  221. print("--- internals list")
  222. is_leaf, internals = configure_iface.ReadContainer(['internals'])
  223. for internal in internals:
  224. print(internal)
  225. elif arg == 'ip':
  226. print("--- get internal parameters (type:isset:default:value)")
  227. if index >= len(argv):
  228. return (1, "internal parameters command requires internal name argument")
  229. internal_name = argv[index]
  230. index += 1
  231. get_parameters(configure_iface, ['internals', internal_name])
  232. elif arg == 'ipd':
  233. if index + 1 >= len(argv):
  234. return (1, "get internal parameter long description command requires internal and parameter name arguments")
  235. name = argv[index]
  236. index += 1
  237. param = argv[index]
  238. index += 1
  239. print("--- get internal parameter description (%s)" % param)
  240. type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['internals', name, param])
  241. print(long_descr)
  242. elif arg == 'ips':
  243. if index + 2 >= len(argv):
  244. return (1, "internal parameter set command requires internal, parameter name and value arguments")
  245. internal_name = argv[index]
  246. index += 1
  247. param = argv[index]
  248. index += 1
  249. value = argv[index]
  250. index += 1
  251. print("--- internal param set \"%s\" -> \"%s\"" % (param, value))
  252. type_char, name, short_descr, long_descr = configure_iface.GetParameterInfo(['internals', internal_name, param])
  253. configure_iface.SetParameterValue(['internals', internal_name, param], python_type_to_jackdbus_type(value, type_char))
  254. elif arg == 'ipr':
  255. if index + 1 >= len(argv):
  256. return (1, "reset internal parameter command requires internal and parameter name arguments")
  257. internal_name = argv[index]
  258. index += 1
  259. param = argv[index]
  260. index += 1
  261. print("--- internal param reset \"%s\"" % param)
  262. configure_iface.ResetParameterValue(['internals', internal_name, param])
  263. elif arg == 'iload':
  264. print("--- load internal")
  265. if index >= len(argv):
  266. return (1, "load internal command requires internal name argument")
  267. name = argv[index]
  268. index += 1
  269. result = control_iface.LoadInternal(name)
  270. elif arg == 'iunload':
  271. print("--- unload internal")
  272. if index >= len(argv):
  273. return (1, "unload internal command requires internal name argument")
  274. name = argv[index]
  275. index += 1
  276. result = control_iface.UnloadInternal(name)
  277. elif arg == 'asd':
  278. print("--- add slave driver")
  279. if index >= len(argv):
  280. return (1, "add slave driver command requires driver name argument")
  281. name = argv[index]
  282. index += 1
  283. result = control_iface.AddSlaveDriver(name)
  284. elif arg == 'rsd':
  285. print("--- remove slave driver")
  286. if index >= len(argv):
  287. return (1, "remove slave driver command requires driver name argument")
  288. name = argv[index]
  289. index += 1
  290. result = control_iface.RemoveSlaveDriver(name)
  291. elif arg == 'help':
  292. print_help()
  293. else:
  294. return (0, "Unknown command '%s'" % arg)
  295. except dbus.DBusException as e:
  296. return (1, "DBus exception: %s" % str(e))
  297. return (0, "")
  298. def shell():
  299. from click.parser import split_arg_string
  300. while True:
  301. cmd = sys.stdin.readline()
  302. if (cmd == ''):
  303. break
  304. s,t = parse_argv(split_arg_string(cmd))
  305. print("%i: %s" % (s, t))
  306. def main():
  307. global control_iface, configure_iface
  308. if len(sys.argv) == 1 or sys.argv[1] in ["-h", "--help"]:
  309. print_help()
  310. return 0
  311. bus = dbus.SessionBus()
  312. controller = bus.get_object(service_name, "/org/jackaudio/Controller")
  313. control_iface = dbus.Interface(controller, control_interface_name)
  314. configure_iface = dbus.Interface(controller, configure_interface_name)
  315. # check arguments
  316. if sys.argv[1] == "shell":
  317. shell()
  318. else:
  319. s, t = parse_argv(sys.argv[1:])
  320. if (t):
  321. print(t)
  322. return s
  323. if __name__ == '__main__':
  324. sys.exit(main())