Collection of tools useful for audio production
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.

1394 lines
57KB

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # Imports (Global)
  4. from PyQt4.QtCore import pyqtSlot, Qt, QTimer, QSettings
  5. from PyQt4.QtGui import QMainWindow, QTableWidgetItem, QWidget
  6. from subprocess import getoutput
  7. from random import randint
  8. # Imports (Custom)
  9. import claudia_database as database
  10. import ui_claudia_launcher
  11. from shared import *
  12. # Debug Mode
  13. SHOW_ALL = False
  14. # Tab Indexes
  15. TAB_INDEX_DAW = 0
  16. TAB_INDEX_HOST = 1
  17. TAB_INDEX_INSTRUMENT = 2
  18. TAB_INDEX_BRISTOL = 3
  19. TAB_INDEX_EFFECT = 4
  20. TAB_INDEX_TOOL = 5
  21. EXTRA_ICON_PATHS = [
  22. "/usr/share/icons",
  23. "/usr/share/pixmaps",
  24. "/usr/local/share/pixmaps"
  25. ]
  26. # XIcon class
  27. class XIcon(object):
  28. def __init__(self):
  29. object.__init__(self)
  30. def addIconPath(self, path):
  31. icon_paths = QIcon.themeSearchPaths()
  32. icon_paths.append(path)
  33. QIcon.setThemeSearchPaths(icon_paths)
  34. def getIcon(self, name):
  35. if os.path.exists(name):
  36. icon = QIcon(name)
  37. else:
  38. icon = QIcon.fromTheme(name)
  39. if icon.isNull():
  40. for iEXTRA_PATH in EXTRA_ICON_PATHS:
  41. if os.path.exists(os.path.join(iEXTRA_PATH, name + ".png")):
  42. icon = QIcon(os.path.join(iEXTRA_PATH, name + ".png"))
  43. break
  44. elif os.path.exists(os.path.join(iEXTRA_PATH, name + ".svg")):
  45. icon = QIcon(os.path.join(iEXTRA_PATH, name + ".svg"))
  46. break
  47. elif os.path.exists(os.path.join(iEXTRA_PATH, name + ".xpm")):
  48. icon = QIcon(os.path.join(iEXTRA_PATH, name + ".xpm"))
  49. break
  50. else:
  51. print("XIcon::Failed to find icon for %s" % name)
  52. return icon
  53. # Launcher object
  54. class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW):
  55. def __init__(self, parent):
  56. QWidget.__init__(self, parent)
  57. self.setupUi(self)
  58. self._parent = None
  59. self._settings = None
  60. self.m_ladish_only = False
  61. self.listDAW.setColumnWidth(0, 22)
  62. self.listDAW.setColumnWidth(1, 150)
  63. self.listDAW.setColumnWidth(2, 125)
  64. self.listHost.setColumnWidth(0, 22)
  65. self.listHost.setColumnWidth(1, 150)
  66. self.listInstrument.setColumnWidth(0, 22)
  67. self.listInstrument.setColumnWidth(1, 150)
  68. self.listInstrument.setColumnWidth(2, 125)
  69. self.listBristol.setColumnWidth(0, 22)
  70. self.listBristol.setColumnWidth(1, 100)
  71. self.listEffect.setColumnWidth(0, 22)
  72. self.listEffect.setColumnWidth(1, 225)
  73. self.listEffect.setColumnWidth(2, 125)
  74. self.listTool.setColumnWidth(0, 22)
  75. self.listTool.setColumnWidth(1, 225)
  76. self.listTool.setColumnWidth(2, 125)
  77. # For the custom icons
  78. self.ClaudiaIcons = XIcon()
  79. if os.path.exists(os.path.join(sys.path[0], "..", "icons")):
  80. self.ClaudiaIcons.addIconPath(os.path.join(sys.path[0], "..", "icons"))
  81. elif os.path.exists(os.path.join(sys.path[0], "..", "data", "icons")):
  82. self.ClaudiaIcons.addIconPath(os.path.join(sys.path[0], "..", "data", "icons"))
  83. QIcon.setThemeName("claudia-hicolor")
  84. self.icon_yes = QIcon(self.getIcon("dialog-ok-apply"))
  85. self.icon_no = QIcon(self.getIcon("dialog-cancel"))
  86. self.clearInfo_DAW()
  87. self.clearInfo_Host()
  88. self.clearInfo_Intrument()
  89. self.clearInfo_Bristol()
  90. self.clearInfo_Effect()
  91. self.clearInfo_Tool()
  92. self.refreshAll()
  93. self.connect(self.tabWidget, SIGNAL("currentChanged(int)"), SLOT("slot_checkSelectedTab(int)"))
  94. self.connect(self.listDAW, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedDAW(int)"))
  95. self.connect(self.listHost, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedHost(int)"))
  96. self.connect(self.listInstrument, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedInstrument(int)"))
  97. self.connect(self.listBristol, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedBristol(int)"))
  98. self.connect(self.listEffect, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedEffect(int)"))
  99. self.connect(self.listTool, SIGNAL("currentCellChanged(int, int, int, int)"), SLOT("slot_checkSelectedTool(int)"))
  100. self.connect(self.listDAW, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedListDAW(int)"))
  101. self.connect(self.listHost, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedListHost(int)"))
  102. self.connect(self.listInstrument, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedListInstrument(int)"))
  103. self.connect(self.listBristol, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedListBristol(int)"))
  104. self.connect(self.listEffect, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedListEffect(int)"))
  105. self.connect(self.listTool, SIGNAL("cellDoubleClicked(int, int)"), SLOT("slot_doubleClickedListTool(int)"))
  106. def getSelectedApp(self):
  107. tab_index = self.tabWidget.currentIndex()
  108. column_name = 2 if (tab_index == TAB_INDEX_BRISTOL) else 1
  109. if tab_index == TAB_INDEX_DAW:
  110. listSel = self.listDAW
  111. elif tab_index == TAB_INDEX_HOST:
  112. listSel = self.listHost
  113. elif tab_index == TAB_INDEX_INSTRUMENT:
  114. listSel = self.listInstrument
  115. elif tab_index == TAB_INDEX_BRISTOL:
  116. listSel = self.listBristol
  117. elif tab_index == TAB_INDEX_EFFECT:
  118. listSel = self.listEffect
  119. elif tab_index == TAB_INDEX_TOOL:
  120. listSel = self.listTool
  121. else:
  122. return ""
  123. return listSel.item(listSel.currentRow(), column_name).text()
  124. def getBinaryFromAppName(self, appname):
  125. for Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs in database.list_DAW:
  126. if appname == AppName:
  127. return Binary
  128. for Package, AppName, Instruments, Effects, Binary, Icon, Save, Level, License, Features, Docs in database.list_Host:
  129. if appname == AppName:
  130. return Binary
  131. for Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs in database.list_Instrument:
  132. if appname == AppName:
  133. return Binary
  134. for Package, AppName, Type, ShortName, Icon, Save, Level, License, Features, Docs in database.list_Bristol:
  135. if appname == AppName:
  136. return "startBristol -audio jack -midi jack -%s" % ShortName
  137. for Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs in database.list_Effect:
  138. if appname == AppName:
  139. return Binary
  140. for Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs in database.list_Tool:
  141. if appname == AppName:
  142. return Binary
  143. print("Failed to find binary from App name")
  144. return ""
  145. def startApp(self, app=None):
  146. if not app:
  147. app = self.getSelectedApp()
  148. binary = self.getBinaryFromAppName(app)
  149. os.system("cd '%s' && %s &" % (self.callback_getProjectFolder(), binary))
  150. def addAppToLADISH(self, app=None):
  151. if not app:
  152. app = self.getSelectedApp()
  153. binary = self.getBinaryFromAppName(app)
  154. if binary.startswith("startBristol"):
  155. self.createAppTemplate("bristol", app, binary)
  156. elif app == "Ardour 2.8":
  157. self.createAppTemplate("ardour2", app, binary)
  158. elif app == "Ardour 3.0":
  159. self.createAppTemplate("ardour3", app, binary)
  160. elif app == "Calf Jack Host (GIT)":
  161. self.createAppTemplate("calfjackhost", app, binary)
  162. #elif (app in ("Hydrogen", "Hydrogen (SVN)")):
  163. #self.createAppTemplate("hydrogen", app, binary)
  164. #elif (app == "Jack Mixer"):
  165. #self.createAppTemplate("jack-mixer", app, binary)
  166. #elif (app == "Jack Rack"):
  167. #self.createAppTemplate("jack-rack", app, binary)
  168. #elif (app == "Jacker"):
  169. #self.createAppTemplate("jacker", app, binary)
  170. #elif (app == "Jamin"):
  171. #self.createAppTemplate("jamin", app, binary)
  172. #elif (app == "Non-DAW"):
  173. #self.createAppTemplate("non-daw", app, binary)
  174. #elif (app == "Non-Mixer"):
  175. #self.createAppTemplate("non-mixer", app, binary)
  176. #elif (app == "Non-Sequencer"):
  177. #self.createAppTemplate("non-sequencer", app, binary)
  178. #elif (app == "Qsampler"):
  179. #self.createAppTemplate("qsampler", app, binary)
  180. #elif (app in ("Qtractor", "Qtractor (SVN)")):
  181. #self.createAppTemplate("qtractor", app, binary)
  182. #elif (app == "Renoise"):
  183. #self.createAppTemplate("renoise", app, binary)
  184. #elif (app == "Rosegarden"):
  185. #self.createAppTemplate("rosegarden", app, binary)
  186. #elif (app == "Seq24"):
  187. #self.createAppTemplate("seq24", app, binary)
  188. #elif (app == "Yoshimi"):
  189. #self.createAppTemplate("yoshimi", app, binary)
  190. else:
  191. appBus = self.callback_getAppBus()
  192. appBus.RunCustom2(False, binary, app, "0")
  193. def createAppTemplate(self, app, app_name, binary):
  194. rand_check = randint(1, 99999)
  195. proj_bpm = str(self.callback_getBPM())
  196. proj_srate = str(self.callback_getSampleRate())
  197. proj_folder = self.callback_getProjectFolder()
  198. tmplte_dir = None
  199. tmplte_file = None
  200. tmplte_cmd = ""
  201. tmplte_lvl = "0"
  202. if os.path.exists(os.path.join(sys.path[0], "..", "templates")):
  203. tmplte_dir = os.path.join(sys.path[0], "..", "templates")
  204. elif os.path.exists(os.path.join(sys.path[0], "..", "data", "templates")):
  205. tmplte_dir = os.path.join(sys.path[0], "..", "data", "templates")
  206. else:
  207. app = None
  208. tmplte_cmd = binary
  209. print("Failed to find template dir")
  210. if not os.path.exists(proj_folder):
  211. os.mkdir(proj_folder)
  212. if app == "bristol":
  213. module = binary.replace("startBristol -audio jack -midi jack -", "")
  214. tmplte_folder = os.path.join(proj_folder, "bristol_%s_%i" % (module, rand_check))
  215. os.mkdir(tmplte_folder)
  216. if self.callback_isLadishRoom():
  217. tmplte_folder = os.path.basename(tmplte_folder)
  218. tmplte_cmd = binary
  219. tmplte_cmd += " -emulate %s" % module
  220. tmplte_cmd += " -cache '%s'" % tmplte_folder
  221. tmplte_cmd += " -memdump '%s'" % tmplte_folder
  222. tmplte_cmd += " -import '%s'" % os.path.join(tmplte_folder, "memory")
  223. tmplte_cmd += " -exec"
  224. tmplte_lvl = "1"
  225. elif app == "ardour2":
  226. tmplte_folder = os.path.join(proj_folder, "Ardour2_%i" % rand_check)
  227. tmplte_file = os.path.join(tmplte_folder, "Ardour2_%i.ardour" % rand_check)
  228. os.mkdir(tmplte_folder)
  229. os.system("cp '%s' '%s'" % (os.path.join(tmplte_dir, "Ardour2", "Ardour2.ardour"), tmplte_file))
  230. os.system("cp '%s' '%s'" % (os.path.join(tmplte_dir, "Ardour2", "instant.xml"), tmplte_folder))
  231. os.mkdir(os.path.join(tmplte_folder, "analysis"))
  232. os.mkdir(os.path.join(tmplte_folder, "dead_sounds"))
  233. os.mkdir(os.path.join(tmplte_folder, "export"))
  234. os.mkdir(os.path.join(tmplte_folder, "interchange"))
  235. os.mkdir(os.path.join(tmplte_folder, "interchange", "Ardour"))
  236. os.mkdir(os.path.join(tmplte_folder, "interchange", "Ardour", "audiofiles"))
  237. os.mkdir(os.path.join(tmplte_folder, "peaks"))
  238. tmplte_cmd = binary
  239. tmplte_cmd += " '%s'" % os.path.basename(tmplte_folder) if self.callback_isLadishRoom() else tmplte_folder
  240. tmplte_lvl = "1"
  241. elif app == "ardour3":
  242. tmplte_folder = os.path.join(proj_folder, "Ardour3_%i" % rand_check)
  243. tmplte_file = os.path.join(tmplte_folder, "Ardour3_%i.ardour" % rand_check)
  244. os.mkdir(tmplte_folder)
  245. # Create template
  246. os.system("cp '%s' '%s'" % (os.path.join(tmplte_dir, "Ardour3", "Ardour3.ardour"), tmplte_file))
  247. os.system("cp '%s' '%s'" % (os.path.join(tmplte_dir, "Ardour3", "instant.xml"), tmplte_folder))
  248. os.mkdir(os.path.join(tmplte_folder, "analysis"))
  249. os.mkdir(os.path.join(tmplte_folder, "dead"))
  250. os.mkdir(os.path.join(tmplte_folder, "export"))
  251. os.mkdir(os.path.join(tmplte_folder, "externals"))
  252. os.mkdir(os.path.join(tmplte_folder, "interchange"))
  253. os.mkdir(os.path.join(tmplte_folder, "interchange", "Ardour3"))
  254. os.mkdir(os.path.join(tmplte_folder, "interchange", "Ardour3", "audiofiles"))
  255. os.mkdir(os.path.join(tmplte_folder, "interchange", "Ardour3", "midifiles"))
  256. os.mkdir(os.path.join(tmplte_folder, "peaks"))
  257. os.mkdir(os.path.join(tmplte_folder, "plugins"))
  258. tmplte_cmd = binary
  259. tmplte_cmd += " '%s'" % os.path.basename(tmplte_folder) if self.callback_isLadishRoom() else tmplte_folder
  260. if self.callback_isLadishRoom():
  261. tmplte_lvl = "jacksession"
  262. elif app == "calfjackhost":
  263. tmplte_file = os.path.join(proj_folder, "CalfJackHost_%i" % rand_check)
  264. # Create template
  265. os.system("cp '%s' '%s'" % (os.path.join(tmplte_dir, "CalfJackHost"), tmplte_file))
  266. tmplte_cmd = binary
  267. tmplte_cmd += " --load '%s'" % os.path.basename(tmplte_file) if self.callback_isLadishRoom() else tmplte_file
  268. tmplte_lvl = "1"
  269. #elif (app == "hydrogen"):
  270. #tmplte_file = os.path.join(proj_folder, "Hydrogen_%i.h2song" % (rand_check))
  271. ## Create template
  272. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Hydrogen.h2song"), tmplte_file))
  273. #tmplte_cmd = binary
  274. #tmplte_cmd += " -s '%s'" % (os.path.basename(tmplte_file) if self.callback_isLadishRoom() else tmplte_file)
  275. #tmplte_lvl = "1"
  276. #elif (app == "jack-mixer"):
  277. #tmplte_file_r = os.path.join(proj_folder, "Jack-Mixer_%i.xml" % (rand_check))
  278. ## Create template
  279. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Jack-Mixer.xml"), tmplte_file_r))
  280. #tmplte_cmd = binary
  281. #tmplte_cmd += " -c '%s'" % (os.path.basename(tmplte_file_r) if self.callback_isLadishRoom() else tmplte_file_r)
  282. #tmplte_lvl = "1"
  283. #elif (app == "jack-rack"):
  284. #tmplte_file = os.path.join(proj_folder, "Jack-Rack_%i.xml" % (rand_check))
  285. ## Create template
  286. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Jack-Rack.xml"), tmplte_file))
  287. #tmplte_cmd = binary
  288. #tmplte_cmd += " -s '%s'" % (os.path.basename(tmplte_file) if self.callback_isLadishRoom() else tmplte_file)
  289. #elif (app == "jacker"):
  290. #tmplte_file = os.path.join(proj_folder, "Jacker_%i.jsong" % (rand_check))
  291. ## Create template
  292. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Jacker.jsong"), tmplte_file))
  293. #tmplte_cmd = binary
  294. #tmplte_cmd += " '%s'" % (os.path.basename(tmplte_file) if self.callback_isLadishRoom() else tmplte_file)
  295. ## No decimal bpm support
  296. #proj_bpm = proj_bpm.split(".")[0]
  297. #tmplte_lvl = "1"
  298. #elif (app == "jamin"):
  299. #tmplte_file_r = os.path.join(proj_folder, "Jamin_%i.jam" % (rand_check))
  300. ## Create template
  301. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Jamin.jam"), tmplte_file_r))
  302. #tmplte_cmd = binary
  303. #tmplte_cmd += " -f '%s'" % (os.path.basename(tmplte_file_r) if self.callback_isLadishRoom() else tmplte_file_r)
  304. #elif (app == "muse"):
  305. #tmplte_file_r = os.path.join(proj_folder, "MusE_%i.med" % (rand_check))
  306. ## Create template
  307. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "MusE.med"), tmplte_file_r))
  308. #tmplte_cmd = binary
  309. #tmplte_cmd += " '%s'" % (os.path.basename(tmplte_file_r) if self.callback_isLadishRoom() else tmplte_file_r)
  310. #elif (app == "non-daw"):
  311. #tmplte_folder = os.path.join(proj_folder, "Non-DAW_%i" % (rand_check))
  312. ## Create template
  313. #os.system("cp -r '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Non-DAW"), tmplte_folder))
  314. #os.mkdir(os.path.join(tmplte_folder, "sources"))
  315. #os.system('sed -i "s/X_SR_X-KLAUDIA-X_SR_X/%s/" "%s"' % (proj_srate, os.path.join(tmplte_folder, "info")))
  316. #os.system('sed -i "s/X_BPM_X-KLAUDIA-X_BPM_X/%s/" "%s"' % (proj_bpm, os.path.join(tmplte_folder, "history")))
  317. #tmplte_cmd = binary
  318. #tmplte_cmd += " '%s'" % (os.path.basename(tmplte_folder) if self.callback_isLadishRoom() else tmplte_folder)
  319. #elif (app == "non-mixer"):
  320. #tmplte_folder = os.path.join(proj_folder, "Non-Mixer_%i" % (rand_check))
  321. ## Create template
  322. #os.system("cp -r '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Non-Mixer"), tmplte_folder))
  323. #tmplte_cmd = binary
  324. #tmplte_cmd += " '%s'" % (os.path.basename(tmplte_folder) if self.callback_isLadishRoom() else tmplte_folder)
  325. #elif (app == "non-sequencer"):
  326. #tmplte_file_r = os.path.join(proj_folder, "Non-Sequencer_%i.non" % (rand_check))
  327. ## Create template
  328. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Non-Sequencer.non"), tmplte_file_r))
  329. #tmplte_cmd = binary
  330. #tmplte_cmd += " '%s'" % (os.path.basename(tmplte_file_r) if self.callback_isLadishRoom() else tmplte_file_r)
  331. #elif (app == "qsampler"):
  332. #tmplte_file_r = os.path.join(proj_folder, "Qsampler_%i.lscp" % (rand_check))
  333. ## Create template
  334. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Qsampler.lscp"), tmplte_file_r))
  335. #tmplte_cmd = binary
  336. #tmplte_cmd += " '%s'" % (os.path.basename(tmplte_file_r) if self.callback_isLadishRoom() else tmplte_file_r)
  337. #tmplte_lvl = "1" if (app_name == "Qsampler (SVN)") else "0"
  338. #elif (app == "qtractor"):
  339. #tmplte_file = os.path.join(proj_folder, "Qtractor_%i.qtr" % (rand_check))
  340. ## Create template
  341. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Qtractor.qtr"), tmplte_file))
  342. #tmplte_cmd = binary
  343. #tmplte_cmd += " '%s'" % (os.path.basename(tmplte_file) if self.callback_isLadishRoom() else tmplte_file)
  344. #tmplte_lvl = "1"
  345. #elif (app == "renoise"):
  346. #tmplte_file_r = os.path.join(proj_folder, "Renoise_%i.xrns" % (rand_check))
  347. #tmplte_folder = os.path.join(proj_folder, "tmp_renoise_%i" % (rand_check))
  348. ## Create template
  349. #os.mkdir(tmplte_folder)
  350. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Renoise.xml"), tmplte_folder))
  351. #os.system('sed -i "s/X_SR_X-KLAUDIA-X_SR_X/%s/" "%s"' % (proj_srate, os.path.join(tmplte_folder, "Renoise.xml")))
  352. #os.system("cd '%s' && mv Renoise.xml Song.xml && zip '%s' Song.xml" % (tmplte_folder, tmplte_file_r))
  353. #os.system("rm -rf '%s'" % (tmplte_folder))
  354. #tmplte_cmd = binary
  355. #tmplte_cmd += " '%s'" % (os.path.basename(tmplte_file_r) if self.callback_isLadishRoom() else tmplte_file_r)
  356. #elif (app == "rosegarden"):
  357. #tmplte_file = os.path.join(proj_folder, "Rosegarden_%i.rg" % (rand_check))
  358. ## Create template
  359. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Rosegarden.rg"), tmplte_file))
  360. #tmplte_cmd = binary
  361. #tmplte_cmd += " '%s'" % (os.path.basename(tmplte_file) if self.callback_isLadishRoom() else tmplte_file)
  362. #tmplte_lvl = "1"
  363. #elif (app == "seq24"):
  364. #tmplte_file_r = os.path.join(proj_folder, "Seq24_%i.midi" % (rand_check))
  365. ## Create template
  366. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Seq24.midi"), tmplte_file_r))
  367. #tmplte_cmd = binary
  368. #tmplte_cmd += " '%s'" % (os.path.basename(tmplte_file_r) if self.callback_isLadishRoom() else tmplte_file_r)
  369. #tmplte_lvl = "1"
  370. #elif (app == "yoshimi"):
  371. #tmplte_file = os.path.join(proj_folder, "Yoshimi_%i.state" % (rand_check))
  372. ## Create template
  373. #os.system("cp '%s' '%s'" % (os.path.join(sys.path[0], "..", "templates", "Yoshimi.state"), tmplte_file))
  374. #tmplte_cmd = binary
  375. #tmplte_cmd += " --state='%s'" % (os.path.basename(tmplte_file) if self.callback_isLadishRoom() else tmplte_file)
  376. #tmplte_lvl = "1"
  377. #else:
  378. #print("ERROR: Failed to parse app name")
  379. #return
  380. if tmplte_file != None:
  381. os.system('sed -i "s/X_SR_X-CLAUDIA-X_SR_X/%s/" "%s"' % (proj_srate, tmplte_file))
  382. os.system('sed -i "s/X_BPM_X-CLAUDIA-X_BPM_X/%s/" "%s"' % (proj_bpm, tmplte_file))
  383. os.system('sed -i "s/X_FOLDER_X-CLAUDIA-X_FOLDER_X/%s/" "%s"' % (
  384. proj_folder.replace("/", "\/").replace("$", "\$"), tmplte_file))
  385. appBus = self.callback_getAppBus()
  386. appBus.RunCustom2(False, tmplte_cmd, app_name, tmplte_lvl)
  387. def parentR(self):
  388. return self._parent
  389. def settings(self):
  390. return self._settings
  391. def getIcon(self, icon):
  392. return self.ClaudiaIcons.getIcon(icon)
  393. def getIconForYesNo(self, yesno):
  394. return self.icon_yes if yesno else self.icon_no
  395. def setCallbackApp(self, parent, settings, ladish_only):
  396. self._parent = parent
  397. self._settings = settings
  398. self.m_ladish_only = ladish_only
  399. def clearInfo_DAW(self):
  400. self.ico_app_daw.setPixmap(self.getIcon("start-here").pixmap(48, 48))
  401. self.label_name_daw.setText("App Name")
  402. self.ico_ladspa_daw.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  403. self.ico_dssi_daw.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  404. self.ico_lv2_daw.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  405. self.ico_vst_daw.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  406. self.label_vst_mode_daw.setText("")
  407. self.ico_jack_transport_daw.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  408. self.label_midi_mode_daw.setText("---")
  409. self.label_session_level_daw.setText(database.LEVEL_0)
  410. self.frame_DAW.setEnabled(False)
  411. self.showDoc_DAW("", "")
  412. def clearInfo_Host(self):
  413. self.ico_app_host.setPixmap(self.getIcon("start-here").pixmap(48, 48))
  414. self.label_name_host.setText("App Name")
  415. self.ico_ladspa_host.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  416. self.ico_dssi_host.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  417. self.ico_lv2_host.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  418. self.ico_vst_host.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  419. self.label_vst_mode_host.setText("")
  420. self.label_midi_mode_host.setText("---")
  421. self.label_session_level_host.setText(database.LEVEL_0)
  422. self.frame_Host.setEnabled(False)
  423. self.showDoc_Host("", "")
  424. def clearInfo_Intrument(self):
  425. self.ico_app_ins.setPixmap(self.getIcon("start-here").pixmap(48, 48))
  426. self.label_name_ins.setText("App Name")
  427. self.ico_builtin_fx_ins.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  428. self.ico_audio_input_ins.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  429. self.label_midi_mode_ins.setText("---")
  430. self.label_session_level_ins.setText(database.LEVEL_0)
  431. self.frame_Instrument.setEnabled(False)
  432. self.showDoc_Instrument("", "")
  433. def clearInfo_Bristol(self):
  434. self.ico_app_bristol.setPixmap(self.getIcon("start-here").pixmap(48, 48))
  435. self.label_name_bristol.setText("App Name")
  436. self.ico_builtin_fx_bristol.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  437. self.ico_audio_input_bristol.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  438. self.label_midi_mode_bristol.setText("---")
  439. self.label_session_level_bristol.setText(database.LEVEL_0)
  440. self.frame_Bristol.setEnabled(False)
  441. self.showDoc_Bristol("", "")
  442. def clearInfo_Effect(self):
  443. self.ico_app_effect.setPixmap(self.getIcon("start-here").pixmap(48, 48))
  444. self.label_name_effect.setText("App Name")
  445. self.ico_stereo_effect.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
  446. self.label_midi_mode_effect.setText("---")
  447. self.label_session_level_effect.setText(database.LEVEL_0)
  448. self.frame_Effect.setEnabled(False)
  449. self.showDoc_Effect("", "")
  450. def clearInfo_Tool(self):
  451. self.ico_app_tool.setPixmap(self.getIcon("start-here").pixmap(48, 48))
  452. self.label_name_tool.setText("App Name")
  453. self.label_midi_mode_tool.setText("---")
  454. self.label_session_level_tool.setText(database.LEVEL_0)
  455. self.frame_Tool.setEnabled(False)
  456. self.showDoc_Tool("", "")
  457. def showDoc_DAW(self, doc, web):
  458. self.url_documentation_daw.setVisible(bool(doc))
  459. self.url_website_daw.setVisible(bool(web))
  460. self.label_no_help_daw.setVisible(not(doc or web))
  461. if doc: self.setDocUrl(self.url_documentation_daw, doc)
  462. if web: self.setWebUrl(self.url_website_daw, web)
  463. def showDoc_Host(self, doc, web):
  464. self.url_documentation_host.setVisible(bool(doc))
  465. self.url_website_host.setVisible(bool(web))
  466. self.label_no_help_host.setVisible(not(doc or web))
  467. if doc: self.setDocUrl(self.url_documentation_host, doc)
  468. if web: self.setWebUrl(self.url_website_host, web)
  469. def showDoc_Instrument(self, doc, web):
  470. self.url_documentation_ins.setVisible(bool(doc))
  471. self.url_website_ins.setVisible(bool(web))
  472. self.label_no_help_ins.setVisible(not(doc or web))
  473. if doc: self.setDocUrl(self.url_documentation_ins, doc)
  474. if web: self.setWebUrl(self.url_website_ins, web)
  475. def showDoc_Bristol(self, doc, web):
  476. self.url_documentation_bristol.setVisible(bool(doc))
  477. self.url_website_bristol.setVisible(bool(web))
  478. self.label_no_help_bristol.setVisible(not(doc or web))
  479. if doc: self.setDocUrl(self.url_documentation_bristol, doc)
  480. if web: self.setWebUrl(self.url_website_bristol, web)
  481. def showDoc_Effect(self, doc, web):
  482. self.url_documentation_effect.setVisible(bool(doc))
  483. self.url_website_effect.setVisible(bool(web))
  484. self.label_no_help_effect.setVisible(not(doc or web))
  485. if doc: self.setDocUrl(self.url_documentation_effect, doc)
  486. if web: self.setWebUrl(self.url_website_effect, web)
  487. def showDoc_Tool(self, doc, web):
  488. self.url_documentation_tool.setVisible(bool(doc))
  489. self.url_website_tool.setVisible(bool(web))
  490. self.label_no_help_tool.setVisible(not(doc or web))
  491. if doc: self.setDocUrl(self.url_documentation_tool, doc)
  492. if web: self.setWebUrl(self.url_website_tool, web)
  493. def setDocUrl(self, item, link):
  494. item.setText(self.tr("<a href='%s'>Documentation</a>" % link))
  495. def setWebUrl(self, item, link):
  496. item.setText(self.tr("<a href='%s'>WebSite</a>" % link))
  497. def clearAll(self):
  498. self.listDAW.clearContents()
  499. self.listHost.clearContents()
  500. self.listInstrument.clearContents()
  501. self.listBristol.clearContents()
  502. self.listEffect.clearContents()
  503. self.listTool.clearContents()
  504. for x in range(self.listDAW.rowCount()):
  505. self.listDAW.removeRow(0)
  506. for x in range(self.listHost.rowCount()):
  507. self.listHost.removeRow(0)
  508. for x in range(self.listInstrument.rowCount()):
  509. self.listInstrument.removeRow(0)
  510. for x in range(self.listBristol.rowCount()):
  511. self.listBristol.removeRow(0)
  512. for x in range(self.listEffect.rowCount()):
  513. self.listEffect.removeRow(0)
  514. for x in range(self.listTool.rowCount()):
  515. self.listTool.removeRow(0)
  516. def refreshAll(self):
  517. self.clearAll()
  518. pkglist = []
  519. if not SHOW_ALL:
  520. if os.path.exists("/usr/bin/yaourt"):
  521. pkg_out = getoutput("/usr/bin/yaourt -Qsq").split("\n")
  522. for package in pkg_out:
  523. pkglist.append(package)
  524. elif os.path.exists("/usr/bin/pacman"):
  525. pkg_out = getoutput("/usr/bin/pacman -Qsq").split("\n")
  526. for package in pkg_out:
  527. pkglist.append(package)
  528. elif os.path.exists("/usr/bin/dpkg-query"):
  529. pkg_out = getoutput("/usr/bin/dpkg-query -W --showformat='${Package}\n'").split("\n")
  530. for package in pkg_out:
  531. pkglist.append(package)
  532. if not "bristol" in pkglist:
  533. self.tabWidget.setTabEnabled(TAB_INDEX_BRISTOL, False)
  534. last_pos = 0
  535. for Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs in database.list_DAW:
  536. if SHOW_ALL or Package in pkglist:
  537. w_icon = QTableWidgetItem("")
  538. w_icon.setIcon(QIcon(self.getIcon(Icon)))
  539. w_name = QTableWidgetItem(AppName)
  540. w_type = QTableWidgetItem(Type)
  541. w_save = QTableWidgetItem(Save)
  542. w_licc = QTableWidgetItem(License)
  543. self.listDAW.insertRow(last_pos)
  544. self.listDAW.setItem(last_pos, 0, w_icon)
  545. self.listDAW.setItem(last_pos, 1, w_name)
  546. self.listDAW.setItem(last_pos, 2, w_type)
  547. self.listDAW.setItem(last_pos, 3, w_save)
  548. self.listDAW.setItem(last_pos, 4, w_licc)
  549. last_pos += 1
  550. last_pos = 0
  551. for Package, AppName, Instruments, Effects, Binary, Icon, Save, Level, License, Features, Docs in database.list_Host:
  552. if SHOW_ALL or Package in pkglist:
  553. w_icon = QTableWidgetItem("")
  554. w_icon.setIcon(QIcon(self.getIcon(Icon)))
  555. w_name = QTableWidgetItem(AppName)
  556. w_h_in = QTableWidgetItem(Instruments)
  557. w_h_ef = QTableWidgetItem(Effects)
  558. w_save = QTableWidgetItem(Save)
  559. w_licc = QTableWidgetItem(License)
  560. self.listHost.insertRow(last_pos)
  561. self.listHost.setItem(last_pos, 0, w_icon)
  562. self.listHost.setItem(last_pos, 1, w_name)
  563. self.listHost.setItem(last_pos, 2, w_h_in)
  564. self.listHost.setItem(last_pos, 3, w_h_ef)
  565. self.listHost.setItem(last_pos, 4, w_save)
  566. self.listHost.setItem(last_pos, 5, w_licc)
  567. last_pos += 1
  568. last_pos = 0
  569. for Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs in database.list_Instrument:
  570. if SHOW_ALL or Package in pkglist:
  571. w_icon = QTableWidgetItem("")
  572. w_icon.setIcon(QIcon(self.getIcon(Icon)))
  573. w_name = QTableWidgetItem(AppName)
  574. w_type = QTableWidgetItem(Type)
  575. w_save = QTableWidgetItem(Save)
  576. w_licc = QTableWidgetItem(License)
  577. self.listInstrument.insertRow(last_pos)
  578. self.listInstrument.setItem(last_pos, 0, w_icon)
  579. self.listInstrument.setItem(last_pos, 1, w_name)
  580. self.listInstrument.setItem(last_pos, 2, w_type)
  581. self.listInstrument.setItem(last_pos, 3, w_save)
  582. self.listInstrument.setItem(last_pos, 4, w_licc)
  583. last_pos += 1
  584. last_pos = 0
  585. for Package, FullName, Type, ShortName, Icon, Save, Level, License, Features, Docs in database.list_Bristol:
  586. if SHOW_ALL or Package in pkglist:
  587. w_icon = QTableWidgetItem("")
  588. w_icon.setIcon(QIcon(self.getIcon(Icon)))
  589. w_fullname = QTableWidgetItem(FullName)
  590. w_shortname = QTableWidgetItem(ShortName)
  591. self.listBristol.insertRow(last_pos)
  592. self.listBristol.setItem(last_pos, 0, w_icon)
  593. self.listBristol.setItem(last_pos, 1, w_shortname)
  594. self.listBristol.setItem(last_pos, 2, w_fullname)
  595. last_pos += 1
  596. last_pos = 0
  597. for Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs in database.list_Effect:
  598. if SHOW_ALL or Package in pkglist:
  599. w_icon = QTableWidgetItem("")
  600. w_icon.setIcon(QIcon(self.getIcon(Icon)))
  601. w_name = QTableWidgetItem(AppName)
  602. w_type = QTableWidgetItem(Type)
  603. w_save = QTableWidgetItem(Save)
  604. w_licc = QTableWidgetItem(License)
  605. self.listEffect.insertRow(last_pos)
  606. self.listEffect.setItem(last_pos, 0, w_icon)
  607. self.listEffect.setItem(last_pos, 1, w_name)
  608. self.listEffect.setItem(last_pos, 2, w_type)
  609. self.listEffect.setItem(last_pos, 3, w_save)
  610. self.listEffect.setItem(last_pos, 4, w_licc)
  611. last_pos += 1
  612. last_pos = 0
  613. for Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs in database.list_Tool:
  614. if SHOW_ALL or Package in pkglist:
  615. w_icon = QTableWidgetItem("")
  616. w_icon.setIcon(QIcon(self.getIcon(Icon)))
  617. w_name = QTableWidgetItem(AppName)
  618. w_type = QTableWidgetItem(Type)
  619. w_save = QTableWidgetItem(Save)
  620. w_licc = QTableWidgetItem(License)
  621. self.listTool.insertRow(last_pos)
  622. self.listTool.setItem(last_pos, 0, w_icon)
  623. self.listTool.setItem(last_pos, 1, w_name)
  624. self.listTool.setItem(last_pos, 2, w_type)
  625. self.listTool.setItem(last_pos, 3, w_save)
  626. self.listTool.setItem(last_pos, 4, w_licc)
  627. last_pos += 1
  628. self.listDAW.setCurrentCell(-1, -1)
  629. self.listHost.setCurrentCell(-1, -1)
  630. self.listInstrument.setCurrentCell(-1, -1)
  631. self.listBristol.setCurrentCell(-1, -1)
  632. self.listEffect.setCurrentCell(-1, -1)
  633. self.listTool.setCurrentCell(-1, -1)
  634. self.listDAW.sortByColumn(1, Qt.AscendingOrder)
  635. self.listHost.sortByColumn(1, Qt.AscendingOrder)
  636. self.listInstrument.sortByColumn(1, Qt.AscendingOrder)
  637. self.listBristol.sortByColumn(2, Qt.AscendingOrder)
  638. self.listEffect.sortByColumn(1, Qt.AscendingOrder)
  639. self.listTool.sortByColumn(1, Qt.AscendingOrder)
  640. @pyqtSlot(int)
  641. def slot_checkSelectedTab(self, tab_index):
  642. if tab_index == TAB_INDEX_DAW:
  643. test_selected = (len(self.listDAW.selectedItems()) > 0)
  644. elif tab_index == TAB_INDEX_HOST:
  645. test_selected = (len(self.listHost.selectedItems()) > 0)
  646. elif tab_index == TAB_INDEX_INSTRUMENT:
  647. test_selected = (len(self.listInstrument.selectedItems()) > 0)
  648. elif tab_index == TAB_INDEX_BRISTOL:
  649. test_selected = (len(self.listBristol.selectedItems()) > 0)
  650. elif tab_index == TAB_INDEX_EFFECT:
  651. test_selected = (len(self.listEffect.selectedItems()) > 0)
  652. elif tab_index == TAB_INDEX_TOOL:
  653. test_selected = (len(self.listTool.selectedItems()) > 0)
  654. else:
  655. test_selected = False
  656. self.callback_checkGUI(test_selected)
  657. @pyqtSlot(int)
  658. def slot_checkSelectedDAW(self, row):
  659. if row >= 0:
  660. selected = True
  661. app_name = self.listDAW.item(row, 1).text()
  662. for DAW in database.list_DAW:
  663. if DAW[1] == app_name:
  664. app_info = DAW
  665. break
  666. else:
  667. print("ERROR: Failed to retrieve app info from database")
  668. return
  669. Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs = app_info
  670. self.frame_DAW.setEnabled(True)
  671. self.ico_app_daw.setPixmap(QIcon(self.getIcon(Icon)).pixmap(48, 48))
  672. self.ico_ladspa_daw.setPixmap(QIcon(self.getIconForYesNo(Features[0])).pixmap(16, 16))
  673. self.ico_dssi_daw.setPixmap(QIcon(self.getIconForYesNo(Features[1])).pixmap(16, 16))
  674. self.ico_lv2_daw.setPixmap(QIcon(self.getIconForYesNo(Features[2])).pixmap(16, 16))
  675. self.ico_vst_daw.setPixmap(QIcon(self.getIconForYesNo(Features[3])).pixmap(16, 16))
  676. self.ico_jack_transport_daw.setPixmap(QIcon(self.getIconForYesNo(Features[5])).pixmap(16, 16))
  677. self.label_name_daw.setText(AppName)
  678. self.label_vst_mode_daw.setText(Features[4])
  679. self.ico_midi_mode_daw.setPixmap(QIcon(self.getIconForYesNo(Features[6])).pixmap(16, 16))
  680. self.label_midi_mode_daw.setText(Features[7])
  681. self.label_session_level_daw.setText(Level)
  682. Docs0 = Docs[0] if (os.path.exists(Docs[0].replace("file://", ""))) else ""
  683. self.showDoc_DAW(Docs0, Docs[1])
  684. else:
  685. selected = False
  686. self.clearInfo_DAW()
  687. self.callback_checkGUI(selected)
  688. @pyqtSlot(int)
  689. def slot_checkSelectedHost(self, row):
  690. if row >= 0:
  691. selected = True
  692. app_name = self.listHost.item(row, 1).text()
  693. for Host in database.list_Host:
  694. if Host[1] == app_name:
  695. app_info = Host
  696. break
  697. else:
  698. print("ERROR: Failed to retrieve app info from database")
  699. return
  700. Package, AppName, Instruments, Effects, Binary, Icon, Save, Level, License, Features, Docs = app_info
  701. self.frame_Host.setEnabled(True)
  702. self.ico_app_host.setPixmap(self.getIcon(Icon).pixmap(48, 48))
  703. self.ico_internal_host.setPixmap(self.getIconForYesNo(Features[0]).pixmap(16, 16))
  704. self.ico_ladspa_host.setPixmap(self.getIconForYesNo(Features[1]).pixmap(16, 16))
  705. self.ico_dssi_host.setPixmap(self.getIconForYesNo(Features[2]).pixmap(16, 16))
  706. self.ico_lv2_host.setPixmap(self.getIconForYesNo(Features[3]).pixmap(16, 16))
  707. self.ico_vst_host.setPixmap(self.getIconForYesNo(Features[4]).pixmap(16, 16))
  708. self.label_name_host.setText(AppName)
  709. self.label_vst_mode_host.setText(Features[5])
  710. self.label_midi_mode_host.setText(Features[6])
  711. self.label_session_level_host.setText(str(Level))
  712. Docs0 = Docs[0] if (os.path.exists(Docs[0].replace("file://", ""))) else ""
  713. self.showDoc_Host(Docs0, Docs[1])
  714. else:
  715. selected = False
  716. self.clearInfo_DAW()
  717. self.callback_checkGUI(selected)
  718. @pyqtSlot(int)
  719. def slot_checkSelectedInstrument(self, row):
  720. if row >= 0:
  721. selected = True
  722. app_name = self.listInstrument.item(row, 1).text()
  723. for Instrument in database.list_Instrument:
  724. if Instrument[1] == app_name:
  725. app_info = Instrument
  726. break
  727. else:
  728. print("ERROR: Failed to retrieve app info from database")
  729. return
  730. Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs = app_info
  731. self.frame_Instrument.setEnabled(True)
  732. self.ico_app_ins.setPixmap(self.getIcon(Icon).pixmap(48, 48))
  733. self.ico_builtin_fx_ins.setPixmap(self.getIconForYesNo(Features[0]).pixmap(16, 16))
  734. self.ico_audio_input_ins.setPixmap(self.getIconForYesNo(Features[1]).pixmap(16, 16))
  735. self.label_name_ins.setText(AppName)
  736. self.label_midi_mode_ins.setText(Features[2])
  737. self.label_session_level_ins.setText(str(Level))
  738. Docs0 = Docs[0] if (os.path.exists(Docs[0].replace("file://", ""))) else ""
  739. self.showDoc_Instrument(Docs0, Docs[1])
  740. else:
  741. selected = False
  742. self.clearInfo_Intrument()
  743. self.callback_checkGUI(selected)
  744. @pyqtSlot(int)
  745. def slot_checkSelectedBristol(self, row):
  746. if row >= 0:
  747. selected = True
  748. app_name = self.listBristol.item(row, 2).text()
  749. for Bristol in database.list_Bristol:
  750. if Bristol[1] == app_name:
  751. app_info = Bristol
  752. break
  753. else:
  754. print("ERROR: Failed to retrieve app info from database")
  755. return
  756. Package, AppName, Type, ShortName, Icon, Save, Level, License, Features, Docs = app_info
  757. self.frame_Bristol.setEnabled(True)
  758. self.ico_app_bristol.setPixmap(self.getIcon(Icon).pixmap(48, 48))
  759. self.ico_builtin_fx_bristol.setPixmap(self.getIconForYesNo(Features[0]).pixmap(16, 16))
  760. self.ico_audio_input_bristol.setPixmap(self.getIconForYesNo(Features[1]).pixmap(16, 16))
  761. self.label_name_bristol.setText(AppName)
  762. self.label_midi_mode_bristol.setText(Features[2])
  763. self.label_session_level_bristol.setText(str(Level))
  764. Docs0 = Docs[0] if (os.path.exists(Docs[0].replace("file://", ""))) else ""
  765. self.showDoc_Bristol(Docs0, Docs[1])
  766. else:
  767. selected = False
  768. self.clearInfo_Bristol()
  769. self.callback_checkGUI(selected)
  770. @pyqtSlot(int)
  771. def slot_checkSelectedEffect(self, row):
  772. if row >= 0:
  773. selected = True
  774. app_name = self.listEffect.item(row, 1).text()
  775. for Effect in database.list_Effect:
  776. if Effect[1] == app_name:
  777. app_info = Effect
  778. break
  779. else:
  780. print("ERROR: Failed to retrieve app info from database")
  781. return
  782. Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs = app_info
  783. self.frame_Effect.setEnabled(True)
  784. self.ico_app_effect.setPixmap(self.getIcon(Icon).pixmap(48, 48))
  785. self.ico_stereo_effect.setPixmap(self.getIconForYesNo(Features[0]).pixmap(16, 16))
  786. self.label_name_effect.setText(AppName)
  787. self.label_midi_mode_effect.setText(Features[1])
  788. self.label_session_level_effect.setText(str(Level))
  789. Docs0 = Docs[0] if (os.path.exists(Docs[0].replace("file://", ""))) else ""
  790. self.showDoc_Effect(Docs0, Docs[1])
  791. else:
  792. selected = False
  793. self.clearInfo_Effect()
  794. self.callback_checkGUI(selected)
  795. @pyqtSlot(int)
  796. def slot_checkSelectedTool(self, row):
  797. if row >= 0:
  798. selected = True
  799. app_name = self.listTool.item(row, 1).text()
  800. for Tool in database.list_Tool:
  801. if Tool[1] == app_name:
  802. app_info = Tool
  803. break
  804. else:
  805. print("ERROR: Failed to retrieve app info from database")
  806. return
  807. Package, AppName, Type, Binary, Icon, Save, Level, License, Features, Docs = app_info
  808. self.frame_Tool.setEnabled(True)
  809. self.ico_app_tool.setPixmap(self.getIcon(Icon).pixmap(48, 48))
  810. self.label_name_tool.setText(AppName)
  811. self.label_midi_mode_tool.setText(Features[0])
  812. self.ico_jack_transport_tool.setPixmap(self.getIconForYesNo(Features[1]).pixmap(16, 16))
  813. self.label_session_level_tool.setText(str(Level))
  814. Docs0 = Docs[0] if (os.path.exists(Docs[0].replace("file://", ""))) else ""
  815. self.showDoc_Tool(Docs0, Docs[1])
  816. else:
  817. selected = False
  818. self.clearInfo_Tool()
  819. self.callback_checkGUI(selected)
  820. @pyqtSlot(int)
  821. def slot_doubleClickedListDAW(self, row):
  822. app = self.listDAW.item(row, 1).text()
  823. if self.m_ladish_only:
  824. self.addAppToLADISH(app)
  825. else:
  826. self.startApp(app)
  827. @pyqtSlot(int)
  828. def slot_doubleClickedListHost(self, row):
  829. app = self.listHost.item(row, 1).text()
  830. if self.m_ladish_only:
  831. self.addAppToLADISH(app)
  832. else:
  833. self.startApp(app)
  834. @pyqtSlot(int)
  835. def slot_doubleClickedListInstrument(self, row):
  836. app = self.listInstrument.item(row, 1).text()
  837. if self.m_ladish_only:
  838. self.addAppToLADISH(app)
  839. else:
  840. self.startApp(app)
  841. @pyqtSlot(int)
  842. def slot_doubleClickedListBristol(self, row):
  843. app = self.listBristol.item(row, 2).text()
  844. if self.m_ladish_only:
  845. self.addAppToLADISH(app)
  846. else:
  847. self.startApp(app)
  848. @pyqtSlot(int)
  849. def slot_doubleClickedListEffect(self, row):
  850. app = self.listEffect.item(row, 1).text()
  851. if self.m_ladish_only:
  852. self.addAppToLADISH(app)
  853. else:
  854. self.startApp(app)
  855. @pyqtSlot(int)
  856. def slot_doubleClickedListTool(self, row):
  857. app = self.listTool.item(row, 1).text()
  858. if self.m_ladish_only:
  859. self.addAppToLADISH(app)
  860. else:
  861. self.startApp(app)
  862. def saveSettings(self):
  863. if self.settings():
  864. self.settings().setValue("SplitterDAW", self.splitter_DAW.saveState())
  865. self.settings().setValue("SplitterHost", self.splitter_Host.saveState())
  866. self.settings().setValue("SplitterInstrument", self.splitter_Instrument.saveState())
  867. self.settings().setValue("SplitterBristol", self.splitter_Bristol.saveState())
  868. self.settings().setValue("SplitterEffect", self.splitter_Effect.saveState())
  869. self.settings().setValue("SplitterTool", self.splitter_Tool.saveState())
  870. def loadSettings(self):
  871. if self.settings() and self.settings().contains("SplitterDAW"):
  872. self.splitter_DAW.restoreState(self.settings().value("SplitterDAW", ""))
  873. self.splitter_Host.restoreState(self.settings().value("SplitterHost", ""))
  874. self.splitter_Instrument.restoreState(self.settings().value("SplitterInstrument", ""))
  875. self.splitter_Bristol.restoreState(self.settings().value("SplitterBristol", ""))
  876. self.splitter_Effect.restoreState(self.settings().value("SplitterEffect", ""))
  877. self.splitter_Tool.restoreState(self.settings().value("SplitterTool", ""))
  878. else: # First-Run?
  879. self.splitter_DAW.setSizes([500, 200])
  880. self.splitter_Host.setSizes([500, 200])
  881. self.splitter_Instrument.setSizes([500, 200])
  882. self.splitter_Bristol.setSizes([500, 200])
  883. self.splitter_Effect.setSizes([500, 200])
  884. self.splitter_Tool.setSizes([500, 200])
  885. # ----------------------------------------
  886. # Callbacks
  887. def callback_checkGUI(self, selected):
  888. if self.parentR():
  889. self.parentR().callback_checkGUI(selected)
  890. def callback_getProjectFolder(self):
  891. if self.parentR():
  892. return self.parentR().callback_getProjectFolder()
  893. return HOME
  894. def callback_getAppBus(self):
  895. return self.parentR().callback_getAppBus()
  896. def callback_getBPM(self):
  897. return self.parentR().callback_getBPM()
  898. def callback_getSampleRate(self):
  899. return self.parentR().callback_getSampleRate()
  900. def callback_isLadishRoom(self):
  901. return self.parentR().callback_isLadishRoom()
  902. #--------------- main ------------------
  903. if __name__ == '__main__':
  904. import dbus
  905. from signal import signal, SIG_IGN, SIGUSR1
  906. from PyQt4.QtGui import QApplication
  907. import jacklib, ui_claudia_launcher_app
  908. # DBus connections
  909. class DBus(object):
  910. __slots__ = [
  911. 'loopBus',
  912. 'controlBus',
  913. 'studioBus',
  914. 'appBus',
  915. ]
  916. DBus = DBus()
  917. class ClaudiaLauncherApp(QMainWindow, ui_claudia_launcher_app.Ui_ClaudiaLauncherApp):
  918. def __init__(self, parent=None):
  919. QMainWindow.__init__(self, parent)
  920. self.setupUi(self)
  921. self.settings = QSettings("Cadence", "Claudia-Launcher")
  922. self.launcher.setCallbackApp(self, self.settings, False)
  923. self.loadSettings()
  924. self.test_url = True
  925. self.test_selected = False
  926. self.studio_root_folder = HOME
  927. # Check for JACK
  928. self.jack_client = jacklib.client_open("klaudia", jacklib.JackNoStartServer, None)
  929. if not self.jack_client:
  930. QTimer.singleShot(0, self, SLOT("slot_showJackError()"))
  931. return
  932. # Set-up GUI
  933. self.b_start.setIcon(self.getIcon("go-next"))
  934. self.b_add.setIcon(self.getIcon("list-add"))
  935. self.b_refresh.setIcon(self.getIcon("view-refresh"))
  936. self.b_open.setIcon(self.getIcon("document-open"))
  937. self.b_start.setEnabled(False)
  938. self.b_add.setEnabled(False)
  939. self.le_url.setText(self.studio_root_folder)
  940. self.co_sample_rate.addItem(str(self.getJackSampleRate()))
  941. self.sb_bpm.setValue(self.getJackBPM())
  942. self.refreshStudioList()
  943. if DBus.controlBus:
  944. self.slot_enableLADISH(True)
  945. else:
  946. for iPATH in PATH:
  947. if os.path.exists(os.path.join(iPATH, "ladishd")):
  948. break
  949. else:
  950. self.slot_enableLADISH(False)
  951. self.connect(self.b_start, SIGNAL("clicked()"), SLOT("slot_startApp()"))
  952. self.connect(self.b_add, SIGNAL("clicked()"), SLOT("slot_addAppToLADISH()"))
  953. self.connect(self.b_refresh, SIGNAL("clicked()"), SLOT("slot_refreshStudioList()"))
  954. self.connect(self.co_ladi_room, SIGNAL("currentIndexChanged(int)"), SLOT("slot_checkSelectedRoom(int)"))
  955. self.connect(self.groupLADISH, SIGNAL("toggled(bool)"), SLOT("slot_enableLADISH(bool)"))
  956. self.connect(self.le_url, SIGNAL("textChanged(QString)"), SLOT("slot_checkFolderUrl(QString)"))
  957. self.connect(self.b_open, SIGNAL("clicked()"), SLOT("slot_getAndSetPath()"))
  958. def getIcon(self, icon):
  959. return self.launcher.getIcon(icon)
  960. def getJackBPM(self):
  961. pos = jacklib.jack_position_t()
  962. pos.valid = 0
  963. jacklib.transport_query(self.jack_client, jacklib.pointer(pos))
  964. if pos.valid & jacklib.JackPositionBBT:
  965. return pos.beats_per_minute
  966. return 120.0
  967. def getJackSampleRate(self):
  968. return jacklib.get_sample_rate(self.jack_client)
  969. def refreshStudioList(self):
  970. self.co_ladi_room.clear()
  971. self.co_ladi_room.addItem("<Studio Root>")
  972. if DBus.controlBus:
  973. studio_bus = DBus.loopBus.get_object("org.ladish", "/org/ladish/Studio")
  974. studio_list_dump = studio_bus.GetRoomList()
  975. for i in range(len(studio_list_dump)):
  976. self.co_ladi_room.addItem("%s - %s" % (
  977. str(studio_list_dump[i][0]).replace("/org/ladish/Room", ""), studio_list_dump[i][1]['name']))
  978. # ----------------------------------------
  979. # Callbacks
  980. def callback_checkGUI(self, test_selected=None):
  981. if test_selected != None:
  982. self.test_selected = test_selected
  983. if self.test_url and self.test_selected:
  984. self.b_add.setEnabled(bool(DBus.controlBus))
  985. self.b_start.setEnabled(True)
  986. else:
  987. self.b_add.setEnabled(False)
  988. self.b_start.setEnabled(False)
  989. def callback_getProjectFolder(self):
  990. return self.le_url.text()
  991. def callback_getAppBus(self):
  992. return DBus.appBus
  993. def callback_getBPM(self):
  994. return self.getJackBPM()
  995. def callback_getSampleRate(self):
  996. return self.getJackSampleRate()
  997. def callback_isLadishRoom(self):
  998. return not self.le_url.isEnabled()
  999. # ----------------------------------------
  1000. @pyqtSlot(int)
  1001. def slot_checkSelectedRoom(self, co_n):
  1002. if co_n == -1 or not DBus.controlBus:
  1003. pass
  1004. elif co_n == 0:
  1005. DBus.studioBus = DBus.loopBus.get_object("org.ladish", "/org/ladish/Studio")
  1006. DBus.appBus = dbus.Interface(DBus.studioBus, 'org.ladish.AppSupervisor')
  1007. self.b_open.setEnabled(True)
  1008. self.le_url.setEnabled(True)
  1009. self.le_url.setText(self.studio_root_folder)
  1010. else:
  1011. room_number = self.co_ladi_room.currentText().split(" ")[0]
  1012. room_name = "/org/ladish/Room" + room_number
  1013. DBus.studioBus = DBus.loopBus.get_object("org.ladish", room_name)
  1014. DBus.appBus = dbus.Interface(DBus.studioBus, 'org.ladish.AppSupervisor')
  1015. room_properties = DBus.studioBus.GetProjectProperties()
  1016. if len(room_properties[1]) > 0:
  1017. self.b_open.setEnabled(False)
  1018. self.le_url.setEnabled(False)
  1019. self.le_url.setText(room_properties[1]['dir'])
  1020. else:
  1021. self.b_open.setEnabled(True)
  1022. self.le_url.setEnabled(True)
  1023. self.studio_root_folder = self.le_url.text()
  1024. @pyqtSlot(str)
  1025. def slot_checkFolderUrl(self, url):
  1026. if os.path.exists(url):
  1027. self.test_url = True
  1028. if self.le_url.isEnabled():
  1029. self.studio_root_folder = url
  1030. else:
  1031. self.test_url = False
  1032. self.callback_checkGUI()
  1033. @pyqtSlot(bool)
  1034. def slot_enableLADISH(self, yesno):
  1035. self.groupLADISH.setCheckable(False)
  1036. if yesno:
  1037. try:
  1038. DBus.controlBus = DBus.loopBus.get_object("org.ladish", "/org/ladish/Control")
  1039. self.groupLADISH.setTitle(self.tr("LADISH is enabled"))
  1040. except:
  1041. self.groupLADISH.setEnabled(False)
  1042. self.groupLADISH.setTitle(self.tr("LADISH is sick"))
  1043. return
  1044. DBus.studioBus = DBus.loopBus.get_object("org.ladish", "/org/ladish/Studio")
  1045. DBus.appBus = dbus.Interface(DBus.studioBus, 'org.ladish.AppSupervisor')
  1046. self.refreshStudioList()
  1047. self.callback_checkGUI()
  1048. else:
  1049. self.groupLADISH.setEnabled(False)
  1050. self.groupLADISH.setTitle(self.tr("LADISH is not available"))
  1051. @pyqtSlot()
  1052. def slot_startApp(self):
  1053. self.launcher.startApp()
  1054. @pyqtSlot()
  1055. def slot_addAppToLADISH(self):
  1056. self.launcher.addAppToLADISH()
  1057. @pyqtSlot()
  1058. def slot_getAndSetPath(self):
  1059. getAndSetPath(self, self.le_url.text(), self.le_url)
  1060. @pyqtSlot()
  1061. def slot_refreshStudioList(self):
  1062. self.refreshStudioList()
  1063. @pyqtSlot()
  1064. def slot_showJackError(self):
  1065. QMessageBox.critical(self, self.tr("Error"),
  1066. self.tr("JACK is not started!\nPlease start it first, then re-run Claudia-Launcher again."))
  1067. self.close()
  1068. def saveSettings(self):
  1069. self.settings.setValue("Geometry", self.saveGeometry())
  1070. self.launcher.saveSettings()
  1071. def loadSettings(self):
  1072. self.restoreGeometry(self.settings.value("Geometry", ""))
  1073. self.launcher.loadSettings()
  1074. def closeEvent(self, event):
  1075. self.saveSettings()
  1076. if self.jack_client:
  1077. jacklib.client_close(self.jack_client)
  1078. QMainWindow.closeEvent(self, event)
  1079. # App initialization
  1080. app = QApplication(sys.argv)
  1081. app.setApplicationName("Claudia-Launcher")
  1082. app.setApplicationVersion(VERSION)
  1083. app.setOrganizationName("Cadence")
  1084. app.setWindowIcon(QIcon(":/scalable/claudia-launcher.svg"))
  1085. # Do not close on SIGUSR1
  1086. signal(SIGUSR1, SIG_IGN)
  1087. # Connect to DBus
  1088. DBus.loopBus = dbus.SessionBus()
  1089. if "org.ladish" in DBus.loopBus.list_names():
  1090. DBus.controlBus = DBus.loopBus.get_object("org.ladish", "/org/ladish/Control")
  1091. DBus.studioBus = DBus.loopBus.get_object("org.ladish", "/org/ladish/Studio")
  1092. DBus.appBus = dbus.Interface(DBus.studioBus, "org.ladish.AppSupervisor")
  1093. else:
  1094. DBus.controlBus = None
  1095. DBus.studioBus = None
  1096. DBus.appBus = None
  1097. # Show GUI
  1098. gui = ClaudiaLauncherApp()
  1099. gui.show()
  1100. # App-Loop
  1101. sys.exit(app.exec_())