Audio plugin host https://kx.studio/carla
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.

650 lines
21KB

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # Common Carla code
  4. # Copyright (C) 2011-2014 Filipe Coelho <falktx@falktx.com>
  5. #
  6. # This program is free software; you can redistribute it and/or
  7. # modify it under the terms of the GNU General Public License as
  8. # published by the Free Software Foundation; either version 2 of
  9. # the License, or any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU General Public License for more details.
  15. #
  16. # For a full copy of the GNU General Public License see the doc/GPL.txt file.
  17. # ------------------------------------------------------------------------------------------------------------
  18. # Imports (Config)
  19. from carla_config import *
  20. # ------------------------------------------------------------------------------------------------------------
  21. # Imports (Global)
  22. import os
  23. import sys
  24. if config_UseQt5:
  25. from PyQt5.Qt import PYQT_VERSION_STR
  26. from PyQt5.QtCore import pyqtWrapperType, qFatal, qVersion, qWarning, QDir
  27. from PyQt5.QtGui import QIcon
  28. from PyQt5.QtWidgets import QFileDialog, QMessageBox
  29. else:
  30. from PyQt4.Qt import PYQT_VERSION_STR
  31. from PyQt4.QtCore import pyqtWrapperType, qFatal, qVersion, qWarning, QDir
  32. from PyQt4.QtGui import QFileDialog, QIcon, QMessageBox
  33. # ------------------------------------------------------------------------------------------------------------
  34. # Import ABC
  35. from abc import ABCMeta, abstractmethod
  36. # ------------------------------------------------------------------------------------------------------------
  37. # Import Signal
  38. from signal import signal, SIGINT, SIGTERM
  39. try:
  40. from signal import SIGUSR1
  41. haveSIGUSR1 = True
  42. except:
  43. haveSIGUSR1 = False
  44. # ------------------------------------------------------------------------------------------------------------
  45. # Imports (Custom)
  46. from carla_backend import *
  47. # ------------------------------------------------------------------------------------------------------------
  48. # Platform specific stuff
  49. if MACOS:
  50. if not config_UseQt5:
  51. from PyQt4.QtGui import qt_mac_set_menubar_icons
  52. qt_mac_set_menubar_icons(False)
  53. elif WINDOWS:
  54. WINDIR = os.getenv("WINDIR")
  55. # ------------------------------------------------------------------------------------------------------------
  56. # Set Version
  57. VERSION = "1.9.5 (2.0-beta3)"
  58. # ------------------------------------------------------------------------------------------------------------
  59. # Set TMP
  60. envTMP = os.getenv("TMP")
  61. if envTMP is None:
  62. if WINDOWS:
  63. qWarning("TMP variable not set")
  64. TMP = QDir.tempPath()
  65. else:
  66. TMP = envTMP
  67. if not os.path.exists(TMP):
  68. qWarning("TMP does not exist")
  69. TMP = "/"
  70. del envTMP
  71. # ------------------------------------------------------------------------------------------------------------
  72. # Set HOME
  73. envHOME = os.getenv("HOME")
  74. if envHOME is None:
  75. if LINUX or MACOS:
  76. qWarning("HOME variable not set")
  77. HOME = QDir.homePath()
  78. else:
  79. HOME = envHOME
  80. if not os.path.exists(HOME):
  81. qWarning("HOME does not exist")
  82. HOME = TMP
  83. del envHOME
  84. # ------------------------------------------------------------------------------------------------------------
  85. # Set PATH
  86. envPATH = os.getenv("PATH")
  87. if envPATH is None:
  88. qWarning("PATH variable not set")
  89. if MACOS:
  90. PATH = ("/opt/local/bin", "/usr/local/bin", "/usr/bin", "/bin")
  91. elif WINDOWS:
  92. PATH = (os.path.join(WINDIR, "system32"), WINDIR)
  93. else:
  94. PATH = ("/usr/local/bin", "/usr/bin", "/bin")
  95. else:
  96. PATH = envPATH.split(os.pathsep)
  97. del envPATH
  98. # ------------------------------------------------------------------------------------------------------------
  99. # Static MIDI CC list
  100. MIDI_CC_LIST = (
  101. "0x01 Modulation",
  102. "0x02 Breath",
  103. "0x03 (Undefined)",
  104. "0x04 Foot",
  105. "0x05 Portamento",
  106. "0x07 Volume",
  107. "0x08 Balance",
  108. "0x09 (Undefined)",
  109. "0x0A Pan",
  110. "0x0B Expression",
  111. "0x0C FX Control 1",
  112. "0x0D FX Control 2",
  113. "0x0E (Undefined)",
  114. "0x0F (Undefined)",
  115. "0x10 General Purpose 1",
  116. "0x11 General Purpose 2",
  117. "0x12 General Purpose 3",
  118. "0x13 General Purpose 4",
  119. "0x14 (Undefined)",
  120. "0x15 (Undefined)",
  121. "0x16 (Undefined)",
  122. "0x17 (Undefined)",
  123. "0x18 (Undefined)",
  124. "0x19 (Undefined)",
  125. "0x1A (Undefined)",
  126. "0x1B (Undefined)",
  127. "0x1C (Undefined)",
  128. "0x1D (Undefined)",
  129. "0x1E (Undefined)",
  130. "0x1F (Undefined)",
  131. "0x46 Control 1 [Variation]",
  132. "0x47 Control 2 [Timbre]",
  133. "0x48 Control 3 [Release]",
  134. "0x49 Control 4 [Attack]",
  135. "0x4A Control 5 [Brightness]",
  136. "0x4B Control 6 [Decay]",
  137. "0x4C Control 7 [Vib Rate]",
  138. "0x4D Control 8 [Vib Depth]",
  139. "0x4E Control 9 [Vib Delay]",
  140. "0x4F Control 10 [Undefined]",
  141. "0x50 General Purpose 5",
  142. "0x51 General Purpose 6",
  143. "0x52 General Purpose 7",
  144. "0x53 General Purpose 8",
  145. "0x54 Portamento Control",
  146. "0x5B FX 1 Depth [Reverb]",
  147. "0x5C FX 2 Depth [Tremolo]",
  148. "0x5D FX 3 Depth [Chorus]",
  149. "0x5E FX 4 Depth [Detune]",
  150. "0x5F FX 5 Depth [Phaser]"
  151. )
  152. # ------------------------------------------------------------------------------------------------------------
  153. # PatchCanvas defines
  154. CANVAS_ANTIALIASING_SMALL = 1
  155. CANVAS_EYECANDY_SMALL = 1
  156. # ------------------------------------------------------------------------------------------------------------
  157. # Carla Settings keys
  158. CARLA_KEY_MAIN_PROJECT_FOLDER = "Main/ProjectFolder" # str
  159. CARLA_KEY_MAIN_USE_PRO_THEME = "Main/UseProTheme" # bool
  160. CARLA_KEY_MAIN_PRO_THEME_COLOR = "Main/ProThemeColor" # str
  161. CARLA_KEY_MAIN_REFRESH_INTERVAL = "Main/RefreshInterval" # int
  162. CARLA_KEY_MAIN_USE_CUSTOM_SKINS = "Main/UseCustomSkins" # bool
  163. CARLA_KEY_CANVAS_THEME = "Canvas/Theme" # str
  164. CARLA_KEY_CANVAS_SIZE = "Canvas/Size" # str "NxN"
  165. CARLA_KEY_CANVAS_USE_BEZIER_LINES = "Canvas/UseBezierLines" # bool
  166. CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS = "Canvas/AutoHideGroups" # bool
  167. CARLA_KEY_CANVAS_EYE_CANDY = "Canvas/EyeCandy" # enum
  168. CARLA_KEY_CANVAS_USE_OPENGL = "Canvas/UseOpenGL" # bool
  169. CARLA_KEY_CANVAS_ANTIALIASING = "Canvas/Antialiasing" # enum
  170. CARLA_KEY_CANVAS_HQ_ANTIALIASING = "Canvas/HQAntialiasing" # bool
  171. CARLA_KEY_ENGINE_DRIVER_PREFIX = "Engine/Driver-"
  172. CARLA_KEY_ENGINE_AUDIO_DRIVER = "Engine/AudioDriver" # str
  173. CARLA_KEY_ENGINE_PROCESS_MODE = "Engine/ProcessMode" # enum
  174. CARLA_KEY_ENGINE_TRANSPORT_MODE = "Engine/TransportMode" # enum
  175. CARLA_KEY_ENGINE_FORCE_STEREO = "Engine/ForceStereo" # bool
  176. CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES = "Engine/PreferPluginBridges" # bool
  177. CARLA_KEY_ENGINE_PREFER_UI_BRIDGES = "Engine/PreferUiBridges" # bool
  178. CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP = "Engine/UIsAlwaysOnTop" # bool
  179. CARLA_KEY_ENGINE_MAX_PARAMETERS = "Engine/MaxParameters" # int
  180. CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT = "Engine/UiBridgesTimeout" # int
  181. CARLA_KEY_PATHS_LADSPA = "Paths/LADSPA"
  182. CARLA_KEY_PATHS_DSSI = "Paths/DSSI"
  183. CARLA_KEY_PATHS_LV2 = "Paths/LV2"
  184. CARLA_KEY_PATHS_VST = "Paths/VST"
  185. CARLA_KEY_PATHS_VST3 = "Paths/VST3"
  186. CARLA_KEY_PATHS_AU = "Paths/AU"
  187. CARLA_KEY_PATHS_GIG = "Paths/GIG"
  188. CARLA_KEY_PATHS_SF2 = "Paths/SF2"
  189. CARLA_KEY_PATHS_SFZ = "Paths/SFZ"
  190. # if pro theme is on and color is black
  191. CARLA_KEY_CUSTOM_PAINTING = "UseCustomPainting" # bool
  192. # ------------------------------------------------------------------------------------------------------------
  193. # Carla Settings defaults
  194. # Main
  195. CARLA_DEFAULT_MAIN_PROJECT_FOLDER = QDir.homePath()
  196. CARLA_DEFAULT_MAIN_USE_PRO_THEME = True
  197. CARLA_DEFAULT_MAIN_PRO_THEME_COLOR = "Black"
  198. CARLA_DEFAULT_MAIN_REFRESH_INTERVAL = 20
  199. CARLA_DEFAULT_MAIN_USE_CUSTOM_SKINS = True
  200. # Canvas
  201. CARLA_DEFAULT_CANVAS_THEME = "Modern Dark"
  202. CARLA_DEFAULT_CANVAS_SIZE = "3100x2400"
  203. CARLA_DEFAULT_CANVAS_SIZE_WIDTH = 3100
  204. CARLA_DEFAULT_CANVAS_SIZE_HEIGHT = 2400
  205. CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES = True
  206. CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS = True
  207. CARLA_DEFAULT_CANVAS_EYE_CANDY = CANVAS_EYECANDY_SMALL
  208. CARLA_DEFAULT_CANVAS_USE_OPENGL = False
  209. CARLA_DEFAULT_CANVAS_ANTIALIASING = CANVAS_ANTIALIASING_SMALL
  210. CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING = False
  211. # Engine
  212. CARLA_DEFAULT_FORCE_STEREO = False
  213. CARLA_DEFAULT_PREFER_PLUGIN_BRIDGES = False
  214. CARLA_DEFAULT_PREFER_UI_BRIDGES = True
  215. CARLA_DEFAULT_UIS_ALWAYS_ON_TOP = True
  216. CARLA_DEFAULT_MAX_PARAMETERS = MAX_DEFAULT_PARAMETERS
  217. CARLA_DEFAULT_UI_BRIDGES_TIMEOUT = 4000
  218. CARLA_DEFAULT_AUDIO_NUM_PERIODS = 2
  219. CARLA_DEFAULT_AUDIO_BUFFER_SIZE = 512
  220. CARLA_DEFAULT_AUDIO_SAMPLE_RATE = 44100
  221. if WINDOWS:
  222. CARLA_DEFAULT_AUDIO_DRIVER = "DirectSound"
  223. elif MACOS:
  224. CARLA_DEFAULT_AUDIO_DRIVER = "CoreAudio"
  225. else:
  226. CARLA_DEFAULT_AUDIO_DRIVER = "JACK"
  227. if LINUX:
  228. CARLA_DEFAULT_PROCESS_MODE = ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS
  229. CARLA_DEFAULT_TRANSPORT_MODE = ENGINE_TRANSPORT_MODE_JACK
  230. else:
  231. CARLA_DEFAULT_PROCESS_MODE = ENGINE_PROCESS_MODE_CONTINUOUS_RACK
  232. CARLA_DEFAULT_TRANSPORT_MODE = ENGINE_TRANSPORT_MODE_INTERNAL
  233. # ------------------------------------------------------------------------------------------------------------
  234. # Global Carla object
  235. class CarlaObject(object):
  236. __slots__ = [
  237. # Host library object
  238. 'host',
  239. # Host Window
  240. 'gui',
  241. # bool, is controller
  242. 'isControl',
  243. # bool, is running local
  244. 'isLocal',
  245. # bool, is plugin
  246. 'isPlugin',
  247. # current buffer size
  248. 'bufferSize',
  249. # current sample rate
  250. 'sampleRate',
  251. # current process mode
  252. 'processMode',
  253. # check if process mode is forced (rack/patchbay)
  254. 'processModeForced',
  255. # current transport mode
  256. 'transportMode',
  257. # current max parameters
  258. 'maxParameters',
  259. # wherever to use external patchbay mode
  260. 'externalPatchbay',
  261. # wherever to use custom skins
  262. 'useCustomSkins',
  263. # binary dir
  264. 'pathBinaries',
  265. # resources dir
  266. 'pathResources',
  267. # default paths
  268. 'DEFAULT_LADSPA_PATH',
  269. 'DEFAULT_DSSI_PATH',
  270. 'DEFAULT_LV2_PATH',
  271. 'DEFAULT_VST_PATH',
  272. 'DEFAULT_VST3_PATH',
  273. 'DEFAULT_AU_PATH',
  274. 'DEFAULT_GIG_PATH',
  275. 'DEFAULT_SF2_PATH',
  276. 'DEFAULT_SFZ_PATH'
  277. ]
  278. gCarla = CarlaObject()
  279. gCarla.host = None
  280. gCarla.gui = None
  281. gCarla.isControl = False
  282. gCarla.isLocal = True
  283. gCarla.isPlugin = False
  284. gCarla.bufferSize = 0
  285. gCarla.sampleRate = 0.0
  286. gCarla.processMode = CARLA_DEFAULT_PROCESS_MODE
  287. gCarla.processModeForced = False
  288. gCarla.transportMode = CARLA_DEFAULT_TRANSPORT_MODE
  289. gCarla.maxParameters = MAX_DEFAULT_PARAMETERS
  290. gCarla.externalPatchbay = False
  291. gCarla.useCustomSkins = True
  292. gCarla.pathBinaries = ""
  293. gCarla.pathResources = ""
  294. # ------------------------------------------------------------------------------------------------------------
  295. # Default Plugin Folders (get)
  296. DEFAULT_LADSPA_PATH = ""
  297. DEFAULT_DSSI_PATH = ""
  298. DEFAULT_LV2_PATH = ""
  299. DEFAULT_VST_PATH = ""
  300. DEFAULT_VST3_PATH = ""
  301. DEFAULT_AU_PATH = ""
  302. DEFAULT_GIG_PATH = ""
  303. DEFAULT_SF2_PATH = ""
  304. DEFAULT_SFZ_PATH = ""
  305. if WINDOWS:
  306. splitter = ";"
  307. APPDATA = os.getenv("APPDATA")
  308. PROGRAMFILES = os.getenv("PROGRAMFILES")
  309. PROGRAMFILESx86 = os.getenv("PROGRAMFILES(x86)")
  310. COMMONPROGRAMFILES = os.getenv("COMMONPROGRAMFILES")
  311. COMMONPROGRAMFILESx86 = os.getenv("COMMONPROGRAMFILES(x86)")
  312. # Small integrity tests
  313. if not APPDATA:
  314. qFatal("APPDATA variable not set, cannot continue")
  315. sys.exit(1)
  316. if not PROGRAMFILES:
  317. qFatal("PROGRAMFILES variable not set, cannot continue")
  318. sys.exit(1)
  319. if not COMMONPROGRAMFILES:
  320. qFatal("COMMONPROGRAMFILES variable not set, cannot continue")
  321. sys.exit(1)
  322. DEFAULT_LADSPA_PATH = APPDATA + "\\LADSPA"
  323. DEFAULT_LADSPA_PATH += ";" + PROGRAMFILES + "\\LADSPA"
  324. DEFAULT_DSSI_PATH = APPDATA + "\\DSSI"
  325. DEFAULT_DSSI_PATH += ";" + PROGRAMFILES + "\\DSSI"
  326. DEFAULT_LV2_PATH = APPDATA + "\\LV2"
  327. DEFAULT_LV2_PATH += ";" + COMMONPROGRAMFILES + "\\LV2"
  328. DEFAULT_VST_PATH = PROGRAMFILES + "\\VstPlugins"
  329. DEFAULT_VST_PATH += ";" + PROGRAMFILES + "\\Steinberg\\VstPlugins"
  330. DEFAULT_VST3_PATH = COMMONPROGRAMFILES + "\\VST3"
  331. DEFAULT_GIG_PATH = APPDATA + "\\GIG"
  332. DEFAULT_SF2_PATH = APPDATA + "\\SF2"
  333. DEFAULT_SFZ_PATH = APPDATA + "\\SFZ"
  334. if PROGRAMFILESx86:
  335. DEFAULT_LADSPA_PATH += ";" + PROGRAMFILESx86 + "\\LADSPA"
  336. DEFAULT_DSSI_PATH += ";" + PROGRAMFILESx86 + "\\DSSI"
  337. DEFAULT_VST_PATH += ";" + PROGRAMFILESx86 + "\\VstPlugins"
  338. DEFAULT_VST_PATH += ";" + PROGRAMFILESx86 + "\\Steinberg\\VstPlugins"
  339. if COMMONPROGRAMFILESx86:
  340. DEFAULT_VST3_PATH += COMMONPROGRAMFILESx86 + "\\VST3"
  341. elif HAIKU:
  342. splitter = ":"
  343. DEFAULT_LADSPA_PATH = HOME + "/.ladspa"
  344. DEFAULT_LADSPA_PATH += ":/boot/common/add-ons/ladspa"
  345. DEFAULT_DSSI_PATH = HOME + "/.dssi"
  346. DEFAULT_DSSI_PATH += ":/boot/common/add-ons/dssi"
  347. DEFAULT_LV2_PATH = HOME + "/.lv2"
  348. DEFAULT_LV2_PATH += ":/boot/common/add-ons/lv2"
  349. DEFAULT_VST_PATH = HOME + "/.vst"
  350. DEFAULT_VST_PATH += ":/boot/common/add-ons/vst"
  351. DEFAULT_VST3_PATH = HOME + "/.vst3"
  352. DEFAULT_VST3_PATH += ":/boot/common/add-ons/vst3"
  353. elif MACOS:
  354. splitter = ":"
  355. DEFAULT_LADSPA_PATH = HOME + "/Library/Audio/Plug-Ins/LADSPA"
  356. DEFAULT_LADSPA_PATH += ":/Library/Audio/Plug-Ins/LADSPA"
  357. DEFAULT_DSSI_PATH = HOME + "/Library/Audio/Plug-Ins/DSSI"
  358. DEFAULT_DSSI_PATH += ":/Library/Audio/Plug-Ins/DSSI"
  359. DEFAULT_LV2_PATH = HOME + "/Library/Audio/Plug-Ins/LV2"
  360. DEFAULT_LV2_PATH += ":/Library/Audio/Plug-Ins/LV2"
  361. DEFAULT_VST_PATH = HOME + "/Library/Audio/Plug-Ins/VST"
  362. DEFAULT_VST_PATH += ":/Library/Audio/Plug-Ins/VST"
  363. DEFAULT_VST3_PATH = HOME + "/Library/Audio/Plug-Ins/VST3"
  364. DEFAULT_VST3_PATH += ":/Library/Audio/Plug-Ins/VST3"
  365. DEFAULT_AU_PATH = HOME + "/Library/Audio/Plug-Ins/Components"
  366. DEFAULT_AU_PATH += ":/Library/Audio/Plug-Ins/Components"
  367. else:
  368. splitter = ":"
  369. DEFAULT_LADSPA_PATH = HOME + "/.ladspa"
  370. DEFAULT_LADSPA_PATH += ":/usr/lib/ladspa"
  371. DEFAULT_LADSPA_PATH += ":/usr/local/lib/ladspa"
  372. DEFAULT_DSSI_PATH = HOME + "/.dssi"
  373. DEFAULT_DSSI_PATH += ":/usr/lib/dssi"
  374. DEFAULT_DSSI_PATH += ":/usr/local/lib/dssi"
  375. DEFAULT_LV2_PATH = HOME + "/.lv2"
  376. DEFAULT_LV2_PATH += ":/usr/lib/lv2"
  377. DEFAULT_LV2_PATH += ":/usr/local/lib/lv2"
  378. DEFAULT_VST_PATH = HOME + "/.vst"
  379. DEFAULT_VST_PATH += ":/usr/lib/vst"
  380. DEFAULT_VST_PATH += ":/usr/local/lib/vst"
  381. DEFAULT_VST3_PATH = HOME + "/.vst3"
  382. DEFAULT_VST3_PATH += ":/usr/lib/vst3"
  383. DEFAULT_VST3_PATH += ":/usr/local/lib/vst3"
  384. DEFAULT_GIG_PATH = HOME + "/.sounds/gig"
  385. DEFAULT_GIG_PATH += ":/usr/share/sounds/gig"
  386. DEFAULT_SF2_PATH = HOME + "/.sounds/sf2"
  387. DEFAULT_SF2_PATH += ":/usr/share/sounds/sf2"
  388. DEFAULT_SFZ_PATH = HOME + "/.sounds/sfz"
  389. DEFAULT_SFZ_PATH += ":/usr/share/sounds/sfz"
  390. if not WINDOWS:
  391. winePrefix = os.getenv("WINEPREFIX")
  392. if not winePrefix:
  393. winePrefix = HOME + "/.wine"
  394. if os.path.exists(winePrefix):
  395. DEFAULT_VST_PATH += ":" + winePrefix + "/drive_c/Program Files/VstPlugins"
  396. DEFAULT_VST3_PATH += ":" + winePrefix + "/drive_c/Program Files/Common Files/VST3"
  397. if kIs64bit and os.path.exists(winePrefix + "/drive_c/Program Files (x86)"):
  398. DEFAULT_VST_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/VstPlugins"
  399. DEFAULT_VST3_PATH += ":" + winePrefix + "/drive_c/Program Files (x86)/Common Files/VST3"
  400. # ------------------------------------------------------------------------------------------------------------
  401. # Default Plugin Folders (set)
  402. readEnvVars = True
  403. if WINDOWS:
  404. # Check if running Wine. If yes, ignore env vars
  405. from winreg import ConnectRegistry, OpenKey, CloseKey, HKEY_CURRENT_USER
  406. reg = ConnectRegistry(None, HKEY_CURRENT_USER)
  407. try:
  408. key = OpenKey(reg, r"SOFTWARE\Wine")
  409. CloseKey(key)
  410. readEnvVars = False
  411. except:
  412. pass
  413. CloseKey(reg)
  414. del reg
  415. if readEnvVars:
  416. gCarla.DEFAULT_LADSPA_PATH = os.getenv("LADSPA_PATH", DEFAULT_LADSPA_PATH).split(splitter)
  417. gCarla.DEFAULT_DSSI_PATH = os.getenv("DSSI_PATH", DEFAULT_DSSI_PATH).split(splitter)
  418. gCarla.DEFAULT_LV2_PATH = os.getenv("LV2_PATH", DEFAULT_LV2_PATH).split(splitter)
  419. gCarla.DEFAULT_VST_PATH = os.getenv("VST_PATH", DEFAULT_VST_PATH).split(splitter)
  420. gCarla.DEFAULT_VST3_PATH = os.getenv("VST3_PATH", DEFAULT_VST3_PATH).split(splitter)
  421. gCarla.DEFAULT_AU_PATH = os.getenv("AU_PATH", DEFAULT_AU_PATH).split(splitter)
  422. gCarla.DEFAULT_GIG_PATH = os.getenv("GIG_PATH", DEFAULT_GIG_PATH).split(splitter)
  423. gCarla.DEFAULT_SF2_PATH = os.getenv("SF2_PATH", DEFAULT_SF2_PATH).split(splitter)
  424. gCarla.DEFAULT_SFZ_PATH = os.getenv("SFZ_PATH", DEFAULT_SFZ_PATH).split(splitter)
  425. else:
  426. gCarla.DEFAULT_LADSPA_PATH = DEFAULT_LADSPA_PATH.split(splitter)
  427. gCarla.DEFAULT_DSSI_PATH = DEFAULT_DSSI_PATH.split(splitter)
  428. gCarla.DEFAULT_LV2_PATH = DEFAULT_LV2_PATH.split(splitter)
  429. gCarla.DEFAULT_VST_PATH = DEFAULT_VST_PATH.split(splitter)
  430. gCarla.DEFAULT_VST3_PATH = DEFAULT_VST3_PATH.split(splitter)
  431. gCarla.DEFAULT_AU_PATH = DEFAULT_AU_PATH.split(splitter)
  432. gCarla.DEFAULT_GIG_PATH = DEFAULT_GIG_PATH.split(splitter)
  433. gCarla.DEFAULT_SF2_PATH = DEFAULT_SF2_PATH.split(splitter)
  434. gCarla.DEFAULT_SFZ_PATH = DEFAULT_SFZ_PATH.split(splitter)
  435. # ------------------------------------------------------------------------------------------------------------
  436. # Set CWD
  437. CWD = sys.path[0]
  438. # make it work with cxfreeze
  439. if os.path.isfile(CWD):
  440. CWD = os.path.dirname(CWD)
  441. # ------------------------------------------------------------------------------------------------------------
  442. # Check if a value is a number (float support)
  443. def isNumber(value):
  444. try:
  445. float(value)
  446. return True
  447. except:
  448. return False
  449. # ------------------------------------------------------------------------------------------------------------
  450. # Convert a value to a list
  451. def toList(value):
  452. if value is None:
  453. return []
  454. elif not isinstance(value, list):
  455. return [value]
  456. else:
  457. return value
  458. # ------------------------------------------------------------------------------------------------------------
  459. # Get Icon from user theme, using our own as backup (Oxygen)
  460. def getIcon(icon, size = 16):
  461. return QIcon.fromTheme(icon, QIcon(":/%ix%i/%s.png" % (size, size, icon)))
  462. # ------------------------------------------------------------------------------------------------------------
  463. # Signal handler
  464. # TODO move to carla_host.py or something
  465. def signalHandler(sig, frame):
  466. if gCarla.gui is None:
  467. return
  468. if sig in (SIGINT, SIGTERM):
  469. gCarla.gui.SIGTERM.emit()
  470. elif haveSIGUSR1 and sig == SIGUSR1:
  471. gCarla.gui.SIGUSR1.emit()
  472. def setUpSignals():
  473. signal(SIGINT, signalHandler)
  474. signal(SIGTERM, signalHandler)
  475. if not haveSIGUSR1:
  476. return
  477. signal(SIGUSR1, signalHandler)
  478. # ------------------------------------------------------------------------------------------------------------
  479. # QLineEdit and QPushButton combo
  480. def getAndSetPath(parent, currentPath, lineEdit):
  481. newPath = QFileDialog.getExistingDirectory(parent, parent.tr("Set Path"), currentPath, QFileDialog.ShowDirsOnly)
  482. if newPath:
  483. lineEdit.setText(newPath)
  484. return newPath
  485. # ------------------------------------------------------------------------------------------------------------
  486. # Get plugin type as string
  487. # TODO - move into new carla_utils.py
  488. def getPluginTypeAsString(ptype):
  489. if ptype == PLUGIN_INTERNAL:
  490. return "Internal"
  491. if ptype == PLUGIN_LADSPA:
  492. return "LADSPA"
  493. if ptype == PLUGIN_DSSI:
  494. return "DSSI"
  495. if ptype == PLUGIN_LV2:
  496. return "LV2"
  497. if ptype == PLUGIN_VST:
  498. return "VST"
  499. if ptype == PLUGIN_VST3:
  500. return "VST3"
  501. if ptype == PLUGIN_AU:
  502. return "AU"
  503. if ptype == PLUGIN_GIG:
  504. return "GIG"
  505. if ptype == PLUGIN_SF2:
  506. return "SF2"
  507. if ptype == PLUGIN_SFZ:
  508. return "SFZ"
  509. return "Unknown"
  510. # ------------------------------------------------------------------------------------------------------------
  511. # Custom MessageBox
  512. def CustomMessageBox(parent, icon, title, text, extraText="", buttons=QMessageBox.Yes|QMessageBox.No, defButton=QMessageBox.No):
  513. msgBox = QMessageBox(parent)
  514. msgBox.setIcon(icon)
  515. msgBox.setWindowTitle(title)
  516. msgBox.setText(text)
  517. msgBox.setInformativeText(extraText)
  518. msgBox.setStandardButtons(buttons)
  519. msgBox.setDefaultButton(defButton)
  520. return msgBox.exec_()
  521. # ------------------------------------------------------------------------------------------------------------
  522. # An empty class used to resolve metaclass conflicts between ABC and PyQt modules
  523. class PyQtMetaClass(pyqtWrapperType, ABCMeta):
  524. pass
  525. # ------------------------------------------------------------------------------------------------------------