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.

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