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.

1116 lines
53KB

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # Carla settings code
  4. # Copyright (C) 2011-2019 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 (Global)
  19. from PyQt5.QtCore import pyqtSlot, QByteArray, QDir, QSettings
  20. from PyQt5.QtGui import QColor, QCursor, QPainter, QPainterPath
  21. from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QFrame, QInputDialog, QLineEdit, QMenu, QVBoxLayout, QWidget
  22. # ------------------------------------------------------------------------------------------------------------
  23. # Imports (Custom)
  24. import ui_carla_settings
  25. import ui_carla_settings_driver
  26. from carla_shared import *
  27. from patchcanvas.theme import *
  28. # ------------------------------------------------------------------------------------------------------------
  29. # ...
  30. BUFFER_SIZE_LIST = (16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192)
  31. SAMPLE_RATE_LIST = (22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000)
  32. # ------------------------------------------------------------------------------------------------------------
  33. # Driver Settings
  34. class DriverSettingsW(QDialog):
  35. AUTOMATIC_OPTION = "(Auto)"
  36. def __init__(self, parent, host, driverIndex, driverName):
  37. QDialog.__init__(self, parent)
  38. self.host = host
  39. self.ui = ui_carla_settings_driver.Ui_DriverSettingsW()
  40. self.ui.setupUi(self)
  41. if False:
  42. # kdevelop likes this :)
  43. host = CarlaHostNull()
  44. self.host = host
  45. # ----------------------------------------------------------------------------------------------------
  46. # Internal stuff
  47. self.fDriverIndex = driverIndex
  48. self.fDriverName = driverName
  49. self.fDeviceNames = host.get_engine_driver_device_names(driverIndex)
  50. self.fBufferSizes = BUFFER_SIZE_LIST
  51. self.fSampleRates = SAMPLE_RATE_LIST
  52. # ----------------------------------------------------------------------------------------------------
  53. # Set-up GUI
  54. for name in self.fDeviceNames:
  55. self.ui.cb_device.addItem(name)
  56. self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
  57. # ----------------------------------------------------------------------------------------------------
  58. # Load settings
  59. self.loadSettings()
  60. # ----------------------------------------------------------------------------------------------------
  61. # Set-up connections
  62. self.accepted.connect(self.slot_saveSettings)
  63. self.ui.cb_device.currentIndexChanged.connect(self.slot_updateDeviceInfo)
  64. # ----------------------------------------------------------------------------------------------------
  65. def loadSettings(self):
  66. settings = QSettings("falkTX", "Carla2")
  67. audioDevice = settings.value("%s%s/Device" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, self.fDriverName), "", type=str)
  68. audioBufferSize = settings.value("%s%s/BufferSize" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, self.fDriverName), CARLA_DEFAULT_AUDIO_BUFFER_SIZE, type=int)
  69. audioSampleRate = settings.value("%s%s/SampleRate" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, self.fDriverName), CARLA_DEFAULT_AUDIO_SAMPLE_RATE, type=int)
  70. audioTripleBuffer = settings.value("%s%s/TripleBuffer" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, self.fDriverName), CARLA_DEFAULT_AUDIO_TRIPLE_BUFFER, type=bool)
  71. if audioDevice and audioDevice in self.fDeviceNames:
  72. self.ui.cb_device.setCurrentIndex(self.fDeviceNames.index(audioDevice))
  73. else:
  74. self.ui.cb_device.setCurrentIndex(-1)
  75. # fill combo-boxes first
  76. self.slot_updateDeviceInfo()
  77. if audioBufferSize and audioBufferSize in self.fBufferSizes:
  78. self.ui.cb_buffersize.setCurrentIndex(self.fBufferSizes.index(audioBufferSize))
  79. elif self.fBufferSizes == BUFFER_SIZE_LIST:
  80. self.ui.cb_buffersize.setCurrentIndex(BUFFER_SIZE_LIST.index(CARLA_DEFAULT_AUDIO_BUFFER_SIZE))
  81. else:
  82. self.ui.cb_buffersize.setCurrentIndex(len(self.fBufferSizes)/2)
  83. if audioSampleRate and audioSampleRate in self.fSampleRates:
  84. self.ui.cb_samplerate.setCurrentIndex(self.fSampleRates.index(audioSampleRate))
  85. elif self.fSampleRates == SAMPLE_RATE_LIST:
  86. self.ui.cb_samplerate.setCurrentIndex(SAMPLE_RATE_LIST.index(CARLA_DEFAULT_AUDIO_SAMPLE_RATE))
  87. else:
  88. self.ui.cb_samplerate.setCurrentIndex(len(self.fSampleRates)/2)
  89. self.ui.cb_triple_buffer.setChecked(audioTripleBuffer and self.ui.cb_triple_buffer.isEnabled())
  90. # --------------------------------------------------------------------------------------------------------
  91. @pyqtSlot()
  92. def slot_saveSettings(self):
  93. settings = QSettings("falkTX", "Carla2")
  94. bufferSize = self.ui.cb_buffersize.currentText()
  95. sampleRate = self.ui.cb_samplerate.currentText()
  96. if bufferSize == self.AUTOMATIC_OPTION:
  97. bufferSize = "0"
  98. if sampleRate == self.AUTOMATIC_OPTION:
  99. sampleRate = "0"
  100. settings.setValue("%s%s/Device" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, self.fDriverName), self.ui.cb_device.currentText())
  101. settings.setValue("%s%s/BufferSize" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, self.fDriverName), bufferSize)
  102. settings.setValue("%s%s/SampleRate" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, self.fDriverName), sampleRate)
  103. settings.setValue("%s%s/TripleBuffer" % (CARLA_KEY_ENGINE_DRIVER_PREFIX, self.fDriverName), self.ui.cb_triple_buffer.isChecked())
  104. # --------------------------------------------------------------------------------------------------------
  105. @pyqtSlot()
  106. def slot_updateDeviceInfo(self):
  107. deviceName = self.ui.cb_device.currentText()
  108. oldBufferSize = self.ui.cb_buffersize.currentText()
  109. oldSampleRate = self.ui.cb_samplerate.currentText()
  110. self.ui.cb_buffersize.clear()
  111. self.ui.cb_samplerate.clear()
  112. driverDeviceInfo = self.host.get_engine_driver_device_info(self.fDriverIndex, deviceName)
  113. driverDeviceHints = driverDeviceInfo['hints']
  114. self.fBufferSizes = driverDeviceInfo['bufferSizes']
  115. self.fSampleRates = driverDeviceInfo['sampleRates']
  116. if driverDeviceHints & ENGINE_DRIVER_DEVICE_CAN_TRIPLE_BUFFER:
  117. self.ui.cb_triple_buffer.setEnabled(True)
  118. else:
  119. self.ui.cb_triple_buffer.setEnabled(False)
  120. if len(self.fBufferSizes) > 0:
  121. for bsize in self.fBufferSizes:
  122. sbsize = str(bsize)
  123. self.ui.cb_buffersize.addItem(sbsize)
  124. if oldBufferSize == sbsize:
  125. self.ui.cb_buffersize.setCurrentIndex(self.ui.cb_buffersize.count()-1)
  126. else:
  127. self.ui.cb_buffersize.addItem(self.AUTOMATIC_OPTION)
  128. self.ui.cb_buffersize.setCurrentIndex(0)
  129. if len(self.fSampleRates) > 0:
  130. for srate in self.fSampleRates:
  131. ssrate = str(int(srate))
  132. self.ui.cb_samplerate.addItem(ssrate)
  133. if oldSampleRate == ssrate:
  134. self.ui.cb_samplerate.setCurrentIndex(self.ui.cb_samplerate.count()-1)
  135. else:
  136. self.ui.cb_samplerate.addItem(self.AUTOMATIC_OPTION)
  137. self.ui.cb_samplerate.setCurrentIndex(0)
  138. # --------------------------------------------------------------------------------------------------------
  139. def done(self, r):
  140. QDialog.done(self, r)
  141. self.close()
  142. # ------------------------------------------------------------------------------------------------------------
  143. # Settings Dialog
  144. class CarlaSettingsW(QDialog):
  145. # Tab indexes
  146. TAB_INDEX_MAIN = 0
  147. TAB_INDEX_CANVAS = 1
  148. TAB_INDEX_ENGINE = 2
  149. TAB_INDEX_OSC = 3
  150. TAB_INDEX_PATHS = 4
  151. TAB_INDEX_WINE = 5
  152. TAB_INDEX_EXPERIMENTAL = 6
  153. TAB_INDEX_NONE = 7
  154. # Path indexes
  155. PATH_INDEX_LADSPA = 0
  156. PATH_INDEX_DSSI = 1
  157. PATH_INDEX_LV2 = 2
  158. PATH_INDEX_VST2 = 3
  159. PATH_INDEX_VST3 = 4
  160. PATH_INDEX_SF2 = 5
  161. PATH_INDEX_SFZ = 6
  162. # Single and Multiple client mode is only for JACK,
  163. # but we still want to match QComboBox index to backend defines,
  164. # so add +2 pos padding if driverName != "JACK".
  165. PROCESS_MODE_NON_JACK_PADDING = 2
  166. # --------------------------------------------------------------------------------------------------------
  167. def __init__(self, parent, host, hasCanvas, hasCanvasGL):
  168. QDialog.__init__(self, parent)
  169. self.host = host
  170. self.ui = ui_carla_settings.Ui_CarlaSettingsW()
  171. self.ui.setupUi(self)
  172. if False:
  173. # kdevelop likes this :)
  174. host = CarlaHostNull()
  175. self.host = host
  176. # ----------------------------------------------------------------------------------------------------
  177. # Set-up GUI
  178. self.ui.lw_page.setFixedWidth(48 + 6*3 + self.ui.lw_page.fontMetrics().width(" Experimental "))
  179. for i in range(host.get_engine_driver_count()):
  180. self.ui.cb_engine_audio_driver.addItem(host.get_engine_driver_name(i))
  181. for i in range(Theme.THEME_MAX):
  182. self.ui.cb_canvas_theme.addItem(getThemeName(i))
  183. if MACOS:
  184. self.ui.group_main_theme.setEnabled(False)
  185. self.ui.group_main_theme.setVisible(False)
  186. if WINDOWS or host.isControl:
  187. self.ui.ch_main_show_logs.setEnabled(False)
  188. self.ui.ch_main_show_logs.setVisible(False)
  189. if host.isControl:
  190. self.ui.lw_page.hideRow(self.TAB_INDEX_CANVAS)
  191. self.ui.lw_page.hideRow(self.TAB_INDEX_ENGINE)
  192. self.ui.lw_page.hideRow(self.TAB_INDEX_PATHS)
  193. self.ui.lw_page.hideRow(self.TAB_INDEX_EXPERIMENTAL)
  194. self.ui.ch_main_experimental.setEnabled(False)
  195. self.ui.group_main_experimental.setEnabled(False)
  196. self.ui.group_main_experimental.setVisible(False)
  197. elif not hasCanvas:
  198. self.ui.lw_page.hideRow(self.TAB_INDEX_CANVAS)
  199. elif not hasCanvasGL:
  200. self.ui.cb_canvas_use_opengl.setEnabled(False)
  201. self.ui.cb_canvas_render_hq_aa.setEnabled(False)
  202. if host.isPlugin:
  203. self.ui.cb_engine_audio_driver.setEnabled(False)
  204. if host.audioDriverForced is not None:
  205. self.ui.cb_engine_audio_driver.setEnabled(False)
  206. self.ui.tb_engine_driver_config.setEnabled(False)
  207. if host.processModeForced:
  208. self.ui.cb_engine_process_mode_jack.setEnabled(False)
  209. self.ui.cb_engine_process_mode_other.setEnabled(False)
  210. if self.host.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK:
  211. self.ui.ch_engine_force_stereo.setEnabled(False)
  212. if host.isControl or host.isPlugin:
  213. self.ui.ch_main_confirm_exit.hide()
  214. self.ui.ch_exp_load_lib_global.hide()
  215. self.ui.lw_page.hideRow(self.TAB_INDEX_OSC)
  216. self.ui.lw_page.hideRow(self.TAB_INDEX_WINE)
  217. if not LINUX:
  218. self.ui.ch_exp_wine_bridges.setVisible(False)
  219. self.ui.ch_exp_jack_apps.setVisible(False)
  220. self.ui.ch_exp_prevent_bad_behaviour.setVisible(False)
  221. self.ui.lw_page.hideRow(self.TAB_INDEX_WINE)
  222. if not MACOS:
  223. self.ui.label_engine_ui_bridges_mac_note.setVisible(False)
  224. # FIXME, not implemented yet
  225. self.ui.ch_engine_uis_always_on_top.hide()
  226. self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
  227. # ----------------------------------------------------------------------------------------------------
  228. # Load settings
  229. self.loadSettings()
  230. # ----------------------------------------------------------------------------------------------------
  231. # Set-up connections
  232. self.accepted.connect(self.slot_saveSettings)
  233. self.ui.buttonBox.button(QDialogButtonBox.Reset).clicked.connect(self.slot_resetSettings)
  234. self.ui.b_main_proj_folder_open.clicked.connect(self.slot_getAndSetProjectPath)
  235. self.ui.cb_engine_audio_driver.currentIndexChanged.connect(self.slot_engineAudioDriverChanged)
  236. self.ui.tb_engine_driver_config.clicked.connect(self.slot_showAudioDriverSettings)
  237. self.ui.b_paths_add.clicked.connect(self.slot_addPluginPath)
  238. self.ui.b_paths_remove.clicked.connect(self.slot_removePluginPath)
  239. self.ui.b_paths_change.clicked.connect(self.slot_changePluginPath)
  240. self.ui.cb_paths.currentIndexChanged.connect(self.slot_pluginPathTabChanged)
  241. self.ui.lw_ladspa.currentRowChanged.connect(self.slot_pluginPathRowChanged)
  242. self.ui.lw_dssi.currentRowChanged.connect(self.slot_pluginPathRowChanged)
  243. self.ui.lw_lv2.currentRowChanged.connect(self.slot_pluginPathRowChanged)
  244. self.ui.lw_vst.currentRowChanged.connect(self.slot_pluginPathRowChanged)
  245. self.ui.lw_vst3.currentRowChanged.connect(self.slot_pluginPathRowChanged)
  246. self.ui.lw_sf2.currentRowChanged.connect(self.slot_pluginPathRowChanged)
  247. self.ui.lw_sfz.currentRowChanged.connect(self.slot_pluginPathRowChanged)
  248. self.ui.ch_main_experimental.toggled.connect(self.slot_enableExperimental)
  249. self.ui.ch_exp_wine_bridges.toggled.connect(self.slot_enableWineBridges)
  250. self.ui.cb_exp_plugin_bridges.toggled.connect(self.slot_pluginBridgesToggled)
  251. self.ui.cb_canvas_eyecandy.toggled.connect(self.slot_canvasEyeCandyToggled)
  252. self.ui.cb_canvas_fancy_eyecandy.toggled.connect(self.slot_canvasFancyEyeCandyToggled)
  253. self.ui.cb_canvas_use_opengl.toggled.connect(self.slot_canvasOpenGLToggled)
  254. # ----------------------------------------------------------------------------------------------------
  255. # Post-connect setup
  256. self.ui.lw_ladspa.setCurrentRow(0)
  257. self.ui.lw_dssi.setCurrentRow(0)
  258. self.ui.lw_lv2.setCurrentRow(0)
  259. self.ui.lw_vst.setCurrentRow(0)
  260. self.ui.lw_vst3.setCurrentRow(0)
  261. self.ui.lw_sf2.setCurrentRow(0)
  262. self.ui.lw_sfz.setCurrentRow(0)
  263. self.ui.lw_page.setCurrentCell(0, 0)
  264. self.adjustSize()
  265. # --------------------------------------------------------------------------------------------------------
  266. def loadSettings(self):
  267. settings = QSettings()
  268. # ----------------------------------------------------------------------------------------------------
  269. # Main
  270. self.ui.ch_main_show_logs.setChecked(self.host.showLogs)
  271. self.ui.ch_engine_uis_always_on_top.setChecked(self.host.uisAlwaysOnTop)
  272. self.ui.le_main_proj_folder.setText(settings.value(CARLA_KEY_MAIN_PROJECT_FOLDER, CARLA_DEFAULT_MAIN_PROJECT_FOLDER, type=str))
  273. self.ui.ch_main_theme_pro.setChecked(settings.value(CARLA_KEY_MAIN_USE_PRO_THEME, CARLA_DEFAULT_MAIN_USE_PRO_THEME, type=bool) and self.ui.group_main_theme.isEnabled())
  274. self.ui.cb_main_theme_color.setCurrentIndex(self.ui.cb_main_theme_color.findText(settings.value(CARLA_KEY_MAIN_PRO_THEME_COLOR, CARLA_DEFAULT_MAIN_PRO_THEME_COLOR, type=str)))
  275. self.ui.sb_main_refresh_interval.setValue(settings.value(CARLA_KEY_MAIN_REFRESH_INTERVAL, CARLA_DEFAULT_MAIN_REFRESH_INTERVAL, type=int))
  276. self.ui.ch_main_confirm_exit.setChecked(settings.value(CARLA_KEY_MAIN_CONFIRM_EXIT, CARLA_DEFAULT_MAIN_CONFIRM_EXIT, type=bool))
  277. # ----------------------------------------------------------------------------------------------------
  278. # Canvas
  279. self.ui.cb_canvas_theme.setCurrentIndex(self.ui.cb_canvas_theme.findText(settings.value(CARLA_KEY_CANVAS_THEME, CARLA_DEFAULT_CANVAS_THEME, type=str)))
  280. self.ui.cb_canvas_size.setCurrentIndex(self.ui.cb_canvas_size.findText(settings.value(CARLA_KEY_CANVAS_SIZE, CARLA_DEFAULT_CANVAS_SIZE, type=str)))
  281. self.ui.cb_canvas_bezier_lines.setChecked(settings.value(CARLA_KEY_CANVAS_USE_BEZIER_LINES, CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES, type=bool))
  282. self.ui.cb_canvas_hide_groups.setChecked(settings.value(CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS, CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS, type=bool))
  283. self.ui.cb_canvas_auto_select.setChecked(settings.value(CARLA_KEY_CANVAS_AUTO_SELECT_ITEMS, CARLA_DEFAULT_CANVAS_AUTO_SELECT_ITEMS, type=bool))
  284. self.ui.cb_canvas_eyecandy.setChecked(settings.value(CARLA_KEY_CANVAS_EYE_CANDY, CARLA_DEFAULT_CANVAS_EYE_CANDY, type=bool))
  285. self.ui.cb_canvas_fancy_eyecandy.setChecked(settings.value(CARLA_KEY_CANVAS_FANCY_EYE_CANDY, CARLA_DEFAULT_CANVAS_FANCY_EYE_CANDY, type=bool))
  286. self.ui.cb_canvas_use_opengl.setChecked(settings.value(CARLA_KEY_CANVAS_USE_OPENGL, CARLA_DEFAULT_CANVAS_USE_OPENGL, type=bool) and self.ui.cb_canvas_use_opengl.isEnabled())
  287. self.ui.cb_canvas_render_aa.setCheckState(settings.value(CARLA_KEY_CANVAS_ANTIALIASING, CARLA_DEFAULT_CANVAS_ANTIALIASING, type=int))
  288. self.ui.cb_canvas_render_hq_aa.setChecked(settings.value(CARLA_KEY_CANVAS_HQ_ANTIALIASING, CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING, type=bool) and self.ui.cb_canvas_render_hq_aa.isEnabled())
  289. # ----------------------------------------------------------------------------------------------------
  290. settings = QSettings("falkTX", "Carla2")
  291. # ----------------------------------------------------------------------------------------------------
  292. # Main
  293. if not self.host.isControl:
  294. self.ui.ch_main_experimental.setChecked(self.host.experimental)
  295. if not self.host.experimental:
  296. self.ui.lw_page.hideRow(self.TAB_INDEX_EXPERIMENTAL)
  297. self.ui.lw_page.hideRow(self.TAB_INDEX_WINE)
  298. elif not self.host.showWineBridges:
  299. self.ui.lw_page.hideRow(self.TAB_INDEX_WINE)
  300. # ----------------------------------------------------------------------------------------------------
  301. # Engine
  302. if self.host.isPlugin:
  303. audioDriver = "Plugin"
  304. self.ui.cb_engine_audio_driver.setCurrentIndex(0)
  305. elif self.host.audioDriverForced:
  306. audioDriver = self.host.audioDriverForced
  307. self.ui.cb_engine_audio_driver.setCurrentIndex(0)
  308. else:
  309. audioDriver = settings.value(CARLA_KEY_ENGINE_AUDIO_DRIVER, CARLA_DEFAULT_AUDIO_DRIVER, type=str)
  310. for i in range(self.ui.cb_engine_audio_driver.count()):
  311. if self.ui.cb_engine_audio_driver.itemText(i) == audioDriver:
  312. self.ui.cb_engine_audio_driver.setCurrentIndex(i)
  313. break
  314. else:
  315. self.ui.cb_engine_audio_driver.setCurrentIndex(-1)
  316. if audioDriver == "JACK":
  317. self.ui.sw_engine_process_mode.setCurrentIndex(0)
  318. else:
  319. self.ui.sw_engine_process_mode.setCurrentIndex(1)
  320. self.ui.tb_engine_driver_config.setEnabled(self.host.audioDriverForced is None and not self.host.isPlugin)
  321. self.ui.cb_engine_process_mode_jack.setCurrentIndex(self.host.nextProcessMode)
  322. if self.host.nextProcessMode >= self.PROCESS_MODE_NON_JACK_PADDING:
  323. self.ui.cb_engine_process_mode_other.setCurrentIndex(self.host.nextProcessMode-self.PROCESS_MODE_NON_JACK_PADDING)
  324. else:
  325. self.ui.cb_engine_process_mode_other.setCurrentIndex(0)
  326. self.ui.sb_engine_max_params.setValue(self.host.maxParameters)
  327. self.ui.ch_engine_manage_uis.setChecked(self.host.manageUIs)
  328. self.ui.ch_engine_prefer_ui_bridges.setChecked(self.host.preferUIBridges)
  329. self.ui.sb_engine_ui_bridges_timeout.setValue(self.host.uiBridgesTimeout)
  330. self.ui.ch_engine_force_stereo.setChecked(self.host.forceStereo or not self.ui.ch_engine_force_stereo.isEnabled())
  331. self.ui.ch_engine_prefer_plugin_bridges.setChecked(self.host.preferPluginBridges)
  332. self.ui.ch_exp_export_lv2.setChecked(self.host.exportLV2)
  333. self.ui.cb_exp_plugin_bridges.setChecked(self.host.showPluginBridges)
  334. self.ui.ch_exp_wine_bridges.setChecked(self.host.showWineBridges)
  335. # ----------------------------------------------------------------------------------------------------
  336. # OSC
  337. self.ui.ch_osc_enable.setChecked(settings.value(CARLA_KEY_OSC_ENABLED,
  338. CARLA_DEFAULT_OSC_ENABLED,
  339. type=bool))
  340. self.ui.group_osc_tcp_port.setChecked(settings.value(CARLA_KEY_OSC_TCP_PORT_ENABLED,
  341. CARLA_DEFAULT_OSC_TCP_PORT_ENABLED,
  342. type=bool))
  343. self.ui.group_osc_udp_port.setChecked(settings.value(CARLA_KEY_OSC_UDP_PORT_ENABLED,
  344. CARLA_DEFAULT_OSC_UDP_PORT_ENABLED,
  345. type=bool))
  346. self.ui.sb_osc_tcp_port_number.setValue(settings.value(CARLA_KEY_OSC_TCP_PORT_NUMBER,
  347. CARLA_DEFAULT_OSC_TCP_PORT_NUMBER,
  348. type=int))
  349. self.ui.sb_osc_udp_port_number.setValue(settings.value(CARLA_KEY_OSC_UDP_PORT_NUMBER,
  350. CARLA_DEFAULT_OSC_UDP_PORT_NUMBER,
  351. type=int))
  352. if settings.value(CARLA_KEY_OSC_TCP_PORT_RANDOM, CARLA_DEFAULT_OSC_TCP_PORT_RANDOM, type=bool):
  353. self.ui.rb_osc_tcp_port_specific.setChecked(False)
  354. self.ui.rb_osc_tcp_port_random.setChecked(True)
  355. else:
  356. self.ui.rb_osc_tcp_port_random.setChecked(False)
  357. self.ui.rb_osc_tcp_port_specific.setChecked(True)
  358. if settings.value(CARLA_KEY_OSC_UDP_PORT_RANDOM, CARLA_DEFAULT_OSC_UDP_PORT_RANDOM, type=bool):
  359. self.ui.rb_osc_udp_port_specific.setChecked(False)
  360. self.ui.rb_osc_udp_port_random.setChecked(True)
  361. else:
  362. self.ui.rb_osc_udp_port_random.setChecked(False)
  363. self.ui.rb_osc_udp_port_specific.setChecked(True)
  364. # ----------------------------------------------------------------------------------------------------
  365. # Paths
  366. ladspas = toList(settings.value(CARLA_KEY_PATHS_LADSPA, CARLA_DEFAULT_LADSPA_PATH))
  367. dssis = toList(settings.value(CARLA_KEY_PATHS_DSSI, CARLA_DEFAULT_DSSI_PATH))
  368. lv2s = toList(settings.value(CARLA_KEY_PATHS_LV2, CARLA_DEFAULT_LV2_PATH))
  369. vst2s = toList(settings.value(CARLA_KEY_PATHS_VST2, CARLA_DEFAULT_VST2_PATH))
  370. vst3s = toList(settings.value(CARLA_KEY_PATHS_VST3, CARLA_DEFAULT_VST3_PATH))
  371. sf2s = toList(settings.value(CARLA_KEY_PATHS_SF2, CARLA_DEFAULT_SF2_PATH))
  372. sfzs = toList(settings.value(CARLA_KEY_PATHS_SFZ, CARLA_DEFAULT_SFZ_PATH))
  373. ladspas.sort()
  374. dssis.sort()
  375. lv2s.sort()
  376. vst2s.sort()
  377. vst3s.sort()
  378. sf2s.sort()
  379. sfzs.sort()
  380. for ladspa in ladspas:
  381. if not ladspa: continue
  382. self.ui.lw_ladspa.addItem(ladspa)
  383. for dssi in dssis:
  384. if not dssi: continue
  385. self.ui.lw_dssi.addItem(dssi)
  386. for lv2 in lv2s:
  387. if not lv2: continue
  388. self.ui.lw_lv2.addItem(lv2)
  389. for vst2 in vst2s:
  390. if not vst2: continue
  391. self.ui.lw_vst.addItem(vst2)
  392. for vst3 in vst3s:
  393. if not vst3: continue
  394. self.ui.lw_vst3.addItem(vst3)
  395. for sf2 in sf2s:
  396. if not sf2: continue
  397. self.ui.lw_sf2.addItem(sf2)
  398. for sfz in sfzs:
  399. if not sfz: continue
  400. self.ui.lw_sfz.addItem(sfz)
  401. # ----------------------------------------------------------------------------------------------------
  402. # Wine
  403. self.ui.le_wine_exec.setText(settings.value(CARLA_KEY_WINE_EXECUTABLE,
  404. CARLA_DEFAULT_WINE_EXECUTABLE,
  405. type=str))
  406. self.ui.cb_wine_prefix_detect.setChecked(settings.value(CARLA_KEY_WINE_AUTO_PREFIX,
  407. CARLA_DEFAULT_WINE_AUTO_PREFIX,
  408. type=bool))
  409. self.ui.le_wine_prefix_fallback.setText(settings.value(CARLA_KEY_WINE_FALLBACK_PREFIX,
  410. CARLA_DEFAULT_WINE_FALLBACK_PREFIX,
  411. type=str))
  412. self.ui.group_wine_realtime.setChecked(settings.value(CARLA_KEY_WINE_RT_PRIO_ENABLED,
  413. CARLA_DEFAULT_WINE_RT_PRIO_ENABLED,
  414. type=bool))
  415. self.ui.sb_wine_base_prio.setValue(settings.value(CARLA_KEY_WINE_BASE_RT_PRIO,
  416. CARLA_DEFAULT_WINE_BASE_RT_PRIO,
  417. type=int))
  418. self.ui.sb_wine_server_prio.setValue(settings.value(CARLA_KEY_WINE_SERVER_RT_PRIO,
  419. CARLA_DEFAULT_WINE_SERVER_RT_PRIO,
  420. type=int))
  421. # ----------------------------------------------------------------------------------------------------
  422. # Experimental
  423. self.ui.ch_exp_jack_apps.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_JACK_APPS,
  424. CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS,
  425. type=bool))
  426. self.ui.ch_exp_export_lv2.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_EXPORT_LV2,
  427. CARLA_DEFAULT_EXPERIMENTAL_LV2_EXPORT,
  428. type=bool))
  429. self.ui.ch_exp_load_lib_global.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL,
  430. CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL,
  431. type=bool))
  432. self.ui.ch_exp_prevent_bad_behaviour.setChecked(settings.value(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR,
  433. CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR,
  434. type=bool))
  435. # --------------------------------------------------------------------------------------------------------
  436. @pyqtSlot()
  437. def slot_saveSettings(self):
  438. settings = QSettings()
  439. self.host.experimental = self.ui.ch_main_experimental.isChecked()
  440. if not self.host.experimental:
  441. self.resetExperimentalSettings()
  442. # ----------------------------------------------------------------------------------------------------
  443. # Main
  444. settings.setValue(CARLA_KEY_MAIN_PROJECT_FOLDER, self.ui.le_main_proj_folder.text())
  445. settings.setValue(CARLA_KEY_MAIN_CONFIRM_EXIT, self.ui.ch_main_confirm_exit.isChecked())
  446. settings.setValue(CARLA_KEY_MAIN_USE_PRO_THEME, self.ui.ch_main_theme_pro.isChecked())
  447. settings.setValue(CARLA_KEY_MAIN_PRO_THEME_COLOR, self.ui.cb_main_theme_color.currentText())
  448. settings.setValue(CARLA_KEY_MAIN_REFRESH_INTERVAL, self.ui.sb_main_refresh_interval.value())
  449. # ----------------------------------------------------------------------------------------------------
  450. # Canvas
  451. settings.setValue(CARLA_KEY_CANVAS_THEME, self.ui.cb_canvas_theme.currentText())
  452. settings.setValue(CARLA_KEY_CANVAS_SIZE, self.ui.cb_canvas_size.currentText())
  453. settings.setValue(CARLA_KEY_CANVAS_USE_BEZIER_LINES, self.ui.cb_canvas_bezier_lines.isChecked())
  454. settings.setValue(CARLA_KEY_CANVAS_AUTO_HIDE_GROUPS, self.ui.cb_canvas_hide_groups.isChecked())
  455. settings.setValue(CARLA_KEY_CANVAS_AUTO_SELECT_ITEMS, self.ui.cb_canvas_auto_select.isChecked())
  456. settings.setValue(CARLA_KEY_CANVAS_EYE_CANDY, self.ui.cb_canvas_eyecandy.isChecked())
  457. settings.setValue(CARLA_KEY_CANVAS_FANCY_EYE_CANDY, self.ui.cb_canvas_fancy_eyecandy.isChecked())
  458. settings.setValue(CARLA_KEY_CANVAS_USE_OPENGL, self.ui.cb_canvas_use_opengl.isChecked())
  459. settings.setValue(CARLA_KEY_CANVAS_HQ_ANTIALIASING, self.ui.cb_canvas_render_hq_aa.isChecked())
  460. settings.setValue(CARLA_KEY_CANVAS_ANTIALIASING, self.ui.cb_canvas_render_aa.checkState()) # 0, 1, 2 match their enum variants
  461. # ----------------------------------------------------------------------------------------------------
  462. settings = QSettings("falkTX", "Carla2")
  463. # ----------------------------------------------------------------------------------------------------
  464. # Main
  465. settings.setValue(CARLA_KEY_MAIN_EXPERIMENTAL, self.host.experimental)
  466. # ----------------------------------------------------------------------------------------------------
  467. # Engine
  468. audioDriver = self.ui.cb_engine_audio_driver.currentText()
  469. if audioDriver and self.host.audioDriverForced is None and not self.host.isPlugin:
  470. settings.setValue(CARLA_KEY_ENGINE_AUDIO_DRIVER, audioDriver)
  471. if not self.host.processModeForced:
  472. # engine sends callback if processMode really changes
  473. if audioDriver == "JACK":
  474. self.host.nextProcessMode = self.ui.cb_engine_process_mode_jack.currentIndex()
  475. else:
  476. self.host.nextProcessMode = self.ui.cb_engine_process_mode_other.currentIndex() + self.PROCESS_MODE_NON_JACK_PADDING
  477. settings.setValue(CARLA_KEY_ENGINE_PROCESS_MODE, self.host.nextProcessMode)
  478. self.host.exportLV2 = self.ui.ch_exp_export_lv2.isChecked()
  479. self.host.forceStereo = self.ui.ch_engine_force_stereo.isChecked()
  480. self.host.maxParameters = self.ui.sb_engine_max_params.value()
  481. self.host.manageUIs = self.ui.ch_engine_manage_uis.isChecked()
  482. self.host.preferPluginBridges = self.ui.ch_engine_prefer_plugin_bridges.isChecked()
  483. self.host.preferUIBridges = self.ui.ch_engine_prefer_ui_bridges.isChecked()
  484. self.host.showLogs = self.ui.ch_main_show_logs.isChecked()
  485. self.host.showPluginBridges = self.ui.cb_exp_plugin_bridges.isChecked()
  486. self.host.showWineBridges = self.ui.ch_exp_wine_bridges.isChecked()
  487. self.host.uiBridgesTimeout = self.ui.sb_engine_ui_bridges_timeout.value()
  488. self.host.uisAlwaysOnTop = self.ui.ch_engine_uis_always_on_top.isChecked()
  489. if self.ui.ch_engine_force_stereo.isEnabled():
  490. settings.setValue(CARLA_KEY_ENGINE_FORCE_STEREO, self.host.forceStereo)
  491. settings.setValue(CARLA_KEY_MAIN_SHOW_LOGS, self.host.showLogs)
  492. settings.setValue(CARLA_KEY_ENGINE_MAX_PARAMETERS, self.host.maxParameters)
  493. settings.setValue(CARLA_KEY_ENGINE_MANAGE_UIS, self.host.manageUIs)
  494. settings.setValue(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges)
  495. settings.setValue(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, self.host.preferUIBridges)
  496. settings.setValue(CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout)
  497. settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop)
  498. settings.setValue(CARLA_KEY_EXPERIMENTAL_EXPORT_LV2, self.host.exportLV2)
  499. settings.setValue(CARLA_KEY_EXPERIMENTAL_PLUGIN_BRIDGES, self.host.showPluginBridges)
  500. settings.setValue(CARLA_KEY_EXPERIMENTAL_WINE_BRIDGES, self.host.showWineBridges)
  501. # ----------------------------------------------------------------------------------------------------
  502. # OSC
  503. settings.setValue(CARLA_KEY_OSC_ENABLED, self.ui.ch_osc_enable.isChecked())
  504. settings.setValue(CARLA_KEY_OSC_TCP_PORT_ENABLED, self.ui.group_osc_tcp_port.isChecked())
  505. settings.setValue(CARLA_KEY_OSC_UDP_PORT_ENABLED, self.ui.group_osc_udp_port.isChecked())
  506. settings.setValue(CARLA_KEY_OSC_TCP_PORT_RANDOM, self.ui.rb_osc_tcp_port_random.isChecked())
  507. settings.setValue(CARLA_KEY_OSC_UDP_PORT_RANDOM, self.ui.rb_osc_udp_port_random.isChecked())
  508. settings.setValue(CARLA_KEY_OSC_TCP_PORT_NUMBER, self.ui.sb_osc_tcp_port_number.value())
  509. settings.setValue(CARLA_KEY_OSC_UDP_PORT_NUMBER, self.ui.sb_osc_udp_port_number.value())
  510. # ----------------------------------------------------------------------------------------------------
  511. # Paths
  512. ladspas = []
  513. dssis = []
  514. lv2s = []
  515. vst2s = []
  516. vst3s = []
  517. sf2s = []
  518. sfzs = []
  519. for i in range(self.ui.lw_ladspa.count()):
  520. ladspas.append(self.ui.lw_ladspa.item(i).text())
  521. for i in range(self.ui.lw_dssi.count()):
  522. dssis.append(self.ui.lw_dssi.item(i).text())
  523. for i in range(self.ui.lw_lv2.count()):
  524. lv2s.append(self.ui.lw_lv2.item(i).text())
  525. for i in range(self.ui.lw_vst.count()):
  526. vst2s.append(self.ui.lw_vst.item(i).text())
  527. for i in range(self.ui.lw_vst3.count()):
  528. vst3s.append(self.ui.lw_vst3.item(i).text())
  529. for i in range(self.ui.lw_sf2.count()):
  530. sf2s.append(self.ui.lw_sf2.item(i).text())
  531. for i in range(self.ui.lw_sfz.count()):
  532. sfzs.append(self.ui.lw_sfz.item(i).text())
  533. self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LADSPA, splitter.join(ladspas))
  534. self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_DSSI, splitter.join(dssis))
  535. self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LV2, splitter.join(lv2s))
  536. self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_VST2, splitter.join(vst2s))
  537. self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_VST3, splitter.join(vst3s))
  538. self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SF2, splitter.join(sf2s))
  539. self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SFZ, splitter.join(sfzs))
  540. settings.setValue(CARLA_KEY_PATHS_LADSPA, ladspas)
  541. settings.setValue(CARLA_KEY_PATHS_DSSI, dssis)
  542. settings.setValue(CARLA_KEY_PATHS_LV2, lv2s)
  543. settings.setValue(CARLA_KEY_PATHS_VST2, vst2s)
  544. settings.setValue(CARLA_KEY_PATHS_VST3, vst3s)
  545. settings.setValue(CARLA_KEY_PATHS_SF2, sf2s)
  546. settings.setValue(CARLA_KEY_PATHS_SFZ, sfzs)
  547. # ----------------------------------------------------------------------------------------------------
  548. # Wine
  549. settings.setValue(CARLA_KEY_WINE_EXECUTABLE, self.ui.le_wine_exec.text())
  550. settings.setValue(CARLA_KEY_WINE_AUTO_PREFIX, self.ui.cb_wine_prefix_detect.isChecked())
  551. settings.setValue(CARLA_KEY_WINE_FALLBACK_PREFIX, self.ui.le_wine_prefix_fallback.text())
  552. settings.setValue(CARLA_KEY_WINE_RT_PRIO_ENABLED, self.ui.group_wine_realtime.isChecked())
  553. settings.setValue(CARLA_KEY_WINE_BASE_RT_PRIO, self.ui.sb_wine_base_prio.value())
  554. settings.setValue(CARLA_KEY_WINE_SERVER_RT_PRIO, self.ui.sb_wine_server_prio.value())
  555. # ----------------------------------------------------------------------------------------------------
  556. # Experimental
  557. settings.setValue(CARLA_KEY_EXPERIMENTAL_JACK_APPS, self.ui.ch_exp_jack_apps.isChecked())
  558. settings.setValue(CARLA_KEY_EXPERIMENTAL_LOAD_LIB_GLOBAL, self.ui.ch_exp_load_lib_global.isChecked())
  559. settings.setValue(CARLA_KEY_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR, self.ui.ch_exp_prevent_bad_behaviour.isChecked())
  560. # --------------------------------------------------------------------------------------------------------
  561. @pyqtSlot()
  562. def slot_resetSettings(self):
  563. currentRow = self.ui.lw_page.currentRow()
  564. # ----------------------------------------------------------------------------------------------------
  565. # Main
  566. if currentRow == self.TAB_INDEX_MAIN:
  567. self.ui.le_main_proj_folder.setText(CARLA_DEFAULT_MAIN_PROJECT_FOLDER)
  568. self.ui.ch_main_theme_pro.setChecked(CARLA_DEFAULT_MAIN_USE_PRO_THEME and self.ui.group_main_theme.isEnabled())
  569. self.ui.cb_main_theme_color.setCurrentIndex(self.ui.cb_main_theme_color.findText(CARLA_DEFAULT_MAIN_PRO_THEME_COLOR))
  570. self.ui.sb_main_refresh_interval.setValue(CARLA_DEFAULT_MAIN_REFRESH_INTERVAL)
  571. self.ui.ch_main_confirm_exit.setChecked(CARLA_DEFAULT_MAIN_CONFIRM_EXIT)
  572. self.ui.ch_main_show_logs.setChecked(CARLA_DEFAULT_MAIN_SHOW_LOGS)
  573. # ----------------------------------------------------------------------------------------------------
  574. # Canvas
  575. elif currentRow == self.TAB_INDEX_CANVAS:
  576. self.ui.cb_canvas_theme.setCurrentIndex(self.ui.cb_canvas_theme.findText(CARLA_DEFAULT_CANVAS_THEME))
  577. self.ui.cb_canvas_size.setCurrentIndex(self.ui.cb_canvas_size.findText(CARLA_DEFAULT_CANVAS_SIZE))
  578. self.ui.cb_canvas_bezier_lines.setChecked(CARLA_DEFAULT_CANVAS_USE_BEZIER_LINES)
  579. self.ui.cb_canvas_hide_groups.setChecked(CARLA_DEFAULT_CANVAS_AUTO_HIDE_GROUPS)
  580. self.ui.cb_canvas_auto_select.setChecked(CARLA_DEFAULT_CANVAS_AUTO_SELECT_ITEMS)
  581. self.ui.cb_canvas_eyecandy.setChecked(CARLA_DEFAULT_CANVAS_EYE_CANDY)
  582. self.ui.cb_canvas_render_aa.setCheckState(Qt.PartiallyChecked) # CARLA_DEFAULT_CANVAS_ANTIALIASING
  583. # ----------------------------------------------------------------------------------------------------
  584. # Engine
  585. elif currentRow == self.TAB_INDEX_ENGINE:
  586. if not self.host.isPlugin:
  587. self.ui.cb_engine_audio_driver.setCurrentIndex(0)
  588. if not self.host.processModeForced:
  589. if self.ui.cb_engine_audio_driver.currentText() == "JACK":
  590. self.ui.cb_engine_process_mode_jack.setCurrentIndex(CARLA_DEFAULT_PROCESS_MODE)
  591. self.ui.sw_engine_process_mode.setCurrentIndex(0) # show all modes
  592. else:
  593. self.ui.cb_engine_process_mode_other.setCurrentIndex(CARLA_DEFAULT_PROCESS_MODE-self.PROCESS_MODE_NON_JACK_PADDING)
  594. self.ui.sw_engine_process_mode.setCurrentIndex(1) # hide single+multi client modes
  595. self.ui.sb_engine_max_params.setValue(CARLA_DEFAULT_MAX_PARAMETERS)
  596. self.ui.ch_engine_uis_always_on_top.setChecked(CARLA_DEFAULT_UIS_ALWAYS_ON_TOP)
  597. self.ui.ch_engine_prefer_ui_bridges.setChecked(CARLA_DEFAULT_PREFER_UI_BRIDGES)
  598. self.ui.sb_engine_ui_bridges_timeout.setValue(CARLA_DEFAULT_UI_BRIDGES_TIMEOUT)
  599. self.ui.ch_engine_manage_uis.setChecked(CARLA_DEFAULT_MANAGE_UIS)
  600. # ----------------------------------------------------------------------------------------------------
  601. # OSC
  602. elif currentRow == self.TAB_INDEX_OSC:
  603. self.ui.ch_osc_enable.setChecked(CARLA_DEFAULT_OSC_ENABLED)
  604. self.ui.group_osc_tcp_port.setChecked(CARLA_DEFAULT_OSC_TCP_PORT_ENABLED)
  605. self.ui.group_osc_udp_port.setChecked(CARLA_DEFAULT_OSC_UDP_PORT_ENABLED)
  606. self.ui.sb_osc_tcp_port_number.setValue(CARLA_DEFAULT_OSC_TCP_PORT_NUMBER)
  607. self.ui.sb_osc_udp_port_number.setValue(CARLA_DEFAULT_OSC_UDP_PORT_NUMBER)
  608. if CARLA_DEFAULT_OSC_TCP_PORT_RANDOM:
  609. self.ui.rb_osc_tcp_port_specific.setChecked(False)
  610. self.ui.rb_osc_tcp_port_random.setChecked(True)
  611. else:
  612. self.ui.rb_osc_tcp_port_random.setChecked(False)
  613. self.ui.rb_osc_tcp_port_specific.setChecked(True)
  614. if CARLA_DEFAULT_OSC_UDP_PORT_RANDOM:
  615. self.ui.rb_osc_udp_port_specific.setChecked(False)
  616. self.ui.rb_osc_udp_port_random.setChecked(True)
  617. else:
  618. self.ui.rb_osc_udp_port_random.setChecked(False)
  619. self.ui.rb_osc_udp_port_specific.setChecked(True)
  620. # ----------------------------------------------------------------------------------------------------
  621. # Paths
  622. elif currentRow == self.TAB_INDEX_PATHS:
  623. curIndex = self.ui.tw_paths.currentIndex()
  624. if curIndex == self.PATH_INDEX_LADSPA:
  625. paths = CARLA_DEFAULT_LADSPA_PATH
  626. paths.sort()
  627. self.ui.lw_ladspa.clear()
  628. for path in paths:
  629. if not path: continue
  630. self.ui.lw_ladspa.addItem(path)
  631. elif curIndex == self.PATH_INDEX_DSSI:
  632. paths = CARLA_DEFAULT_DSSI_PATH
  633. paths.sort()
  634. self.ui.lw_dssi.clear()
  635. for path in paths:
  636. if not path: continue
  637. self.ui.lw_dssi.addItem(path)
  638. elif curIndex == self.PATH_INDEX_LV2:
  639. paths = CARLA_DEFAULT_LV2_PATH
  640. paths.sort()
  641. self.ui.lw_lv2.clear()
  642. for path in paths:
  643. if not path: continue
  644. self.ui.lw_lv2.addItem(path)
  645. elif curIndex == self.PATH_INDEX_VST2:
  646. paths = CARLA_DEFAULT_VST2_PATH
  647. paths.sort()
  648. self.ui.lw_vst.clear()
  649. for path in paths:
  650. if not path: continue
  651. self.ui.lw_vst.addItem(path)
  652. elif curIndex == self.PATH_INDEX_VST3:
  653. paths = CARLA_DEFAULT_VST3_PATH
  654. paths.sort()
  655. self.ui.lw_vst3.clear()
  656. for path in paths:
  657. if not path: continue
  658. self.ui.lw_vst3.addItem(path)
  659. elif curIndex == self.PATH_INDEX_SF2:
  660. paths = CARLA_DEFAULT_SF2_PATH
  661. paths.sort()
  662. self.ui.lw_sf2.clear()
  663. for path in paths:
  664. if not path: continue
  665. self.ui.lw_sf2.addItem(path)
  666. elif curIndex == self.PATH_INDEX_SFZ:
  667. paths = CARLA_DEFAULT_SFZ_PATH
  668. paths.sort()
  669. self.ui.lw_sfz.clear()
  670. for path in paths:
  671. if not path: continue
  672. self.ui.lw_sfz.addItem(path)
  673. # ----------------------------------------------------------------------------------------------------
  674. # Wine
  675. elif currentRow == self.TAB_INDEX_WINE:
  676. self.ui.le_wine_exec.setText(CARLA_DEFAULT_WINE_EXECUTABLE)
  677. self.ui.cb_wine_prefix_detect.setChecked(CARLA_DEFAULT_WINE_AUTO_PREFIX)
  678. self.ui.le_wine_prefix_fallback.setText(CARLA_DEFAULT_WINE_FALLBACK_PREFIX)
  679. self.ui.group_wine_realtime.setChecked(CARLA_DEFAULT_WINE_RT_PRIO_ENABLED)
  680. self.ui.sb_wine_base_prio.setValue(CARLA_DEFAULT_WINE_BASE_RT_PRIO)
  681. self.ui.sb_wine_server_prio.setValue(CARLA_DEFAULT_WINE_SERVER_RT_PRIO)
  682. # ----------------------------------------------------------------------------------------------------
  683. # Experimental
  684. elif currentRow == self.TAB_INDEX_EXPERIMENTAL:
  685. self.resetExperimentalSettings()
  686. def resetExperimentalSettings(self):
  687. # Forever experimental
  688. self.ui.cb_exp_plugin_bridges.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PLUGIN_BRIDGES)
  689. self.ui.ch_exp_wine_bridges.setChecked(CARLA_DEFAULT_EXPERIMENTAL_WINE_BRIDGES)
  690. self.ui.ch_exp_jack_apps.setChecked(CARLA_DEFAULT_EXPERIMENTAL_JACK_APPS)
  691. self.ui.ch_exp_export_lv2.setChecked(CARLA_DEFAULT_EXPERIMENTAL_LV2_EXPORT)
  692. self.ui.ch_exp_load_lib_global.setChecked(CARLA_DEFAULT_EXPERIMENTAL_LOAD_LIB_GLOBAL)
  693. self.ui.ch_exp_prevent_bad_behaviour.setChecked(CARLA_DEFAULT_EXPERIMENTAL_PREVENT_BAD_BEHAVIOUR)
  694. # Temporary, until stable
  695. self.ui.cb_canvas_fancy_eyecandy.setChecked(CARLA_DEFAULT_CANVAS_FANCY_EYE_CANDY)
  696. self.ui.cb_canvas_use_opengl.setChecked(CARLA_DEFAULT_CANVAS_USE_OPENGL and self.ui.cb_canvas_use_opengl.isEnabled())
  697. self.ui.cb_canvas_render_hq_aa.setChecked(CARLA_DEFAULT_CANVAS_HQ_ANTIALIASING and self.ui.cb_canvas_render_hq_aa.isEnabled())
  698. self.ui.ch_engine_force_stereo.setChecked(CARLA_DEFAULT_FORCE_STEREO)
  699. self.ui.ch_engine_prefer_plugin_bridges.setChecked(CARLA_DEFAULT_PREFER_PLUGIN_BRIDGES)
  700. # --------------------------------------------------------------------------------------------------------
  701. @pyqtSlot(bool)
  702. def slot_enableExperimental(self, toggled):
  703. if toggled:
  704. self.ui.lw_page.showRow(self.TAB_INDEX_EXPERIMENTAL)
  705. if self.ui.ch_exp_wine_bridges.isChecked():
  706. self.ui.lw_page.showRow(self.TAB_INDEX_WINE)
  707. else:
  708. self.ui.lw_page.hideRow(self.TAB_INDEX_EXPERIMENTAL)
  709. self.ui.lw_page.hideRow(self.TAB_INDEX_WINE)
  710. @pyqtSlot(bool)
  711. def slot_enableWineBridges(self, toggled):
  712. if toggled:
  713. self.ui.lw_page.showRow(self.TAB_INDEX_WINE)
  714. else:
  715. self.ui.lw_page.hideRow(self.TAB_INDEX_WINE)
  716. @pyqtSlot(bool)
  717. def slot_pluginBridgesToggled(self, toggled):
  718. if not toggled:
  719. self.ui.ch_exp_wine_bridges.setChecked(False)
  720. self.ui.ch_engine_prefer_plugin_bridges.setChecked(False)
  721. self.ui.lw_page.hideRow(self.TAB_INDEX_WINE)
  722. @pyqtSlot(bool)
  723. def slot_canvasEyeCandyToggled(self, toggled):
  724. if not toggled:
  725. self.ui.cb_canvas_fancy_eyecandy.setChecked(False)
  726. @pyqtSlot(bool)
  727. def slot_canvasFancyEyeCandyToggled(self, toggled):
  728. if toggled:
  729. self.ui.cb_canvas_eyecandy.setChecked(True)
  730. @pyqtSlot(bool)
  731. def slot_canvasOpenGLToggled(self, toggled):
  732. if not toggled:
  733. self.ui.cb_canvas_render_hq_aa.setChecked(False)
  734. # --------------------------------------------------------------------------------------------------------
  735. @pyqtSlot()
  736. def slot_getAndSetProjectPath(self):
  737. # FIXME
  738. getAndSetPath(self, self.ui.le_main_proj_folder)
  739. # --------------------------------------------------------------------------------------------------------
  740. @pyqtSlot()
  741. def slot_engineAudioDriverChanged(self):
  742. if self.ui.cb_engine_audio_driver.currentText() == "JACK":
  743. self.ui.sw_engine_process_mode.setCurrentIndex(0)
  744. else:
  745. self.ui.sw_engine_process_mode.setCurrentIndex(1)
  746. @pyqtSlot()
  747. def slot_showAudioDriverSettings(self):
  748. driverIndex = self.ui.cb_engine_audio_driver.currentIndex()
  749. driverName = self.ui.cb_engine_audio_driver.currentText()
  750. DriverSettingsW(self, self.host, driverIndex, driverName).exec_()
  751. # --------------------------------------------------------------------------------------------------------
  752. @pyqtSlot()
  753. def slot_addPluginPath(self):
  754. newPath = QFileDialog.getExistingDirectory(self, self.tr("Add Path"), "", QFileDialog.ShowDirsOnly)
  755. if not newPath:
  756. return
  757. curIndex = self.ui.tw_paths.currentIndex()
  758. if curIndex == self.PATH_INDEX_LADSPA:
  759. self.ui.lw_ladspa.addItem(newPath)
  760. elif curIndex == self.PATH_INDEX_DSSI:
  761. self.ui.lw_dssi.addItem(newPath)
  762. elif curIndex == self.PATH_INDEX_LV2:
  763. self.ui.lw_lv2.addItem(newPath)
  764. elif curIndex == self.PATH_INDEX_VST2:
  765. self.ui.lw_vst.addItem(newPath)
  766. elif curIndex == self.PATH_INDEX_VST3:
  767. self.ui.lw_vst3.addItem(newPath)
  768. elif curIndex == self.PATH_INDEX_SF2:
  769. self.ui.lw_sf2.addItem(newPath)
  770. elif curIndex == self.PATH_INDEX_SFZ:
  771. self.ui.lw_sfz.addItem(newPath)
  772. @pyqtSlot()
  773. def slot_removePluginPath(self):
  774. curIndex = self.ui.tw_paths.currentIndex()
  775. if curIndex == self.PATH_INDEX_LADSPA:
  776. self.ui.lw_ladspa.takeItem(self.ui.lw_ladspa.currentRow())
  777. elif curIndex == self.PATH_INDEX_DSSI:
  778. self.ui.lw_dssi.takeItem(self.ui.lw_dssi.currentRow())
  779. elif curIndex == self.PATH_INDEX_LV2:
  780. self.ui.lw_lv2.takeItem(self.ui.lw_lv2.currentRow())
  781. elif curIndex == self.PATH_INDEX_VST2:
  782. self.ui.lw_vst.takeItem(self.ui.lw_vst.currentRow())
  783. elif curIndex == self.PATH_INDEX_VST3:
  784. self.ui.lw_vst3.takeItem(self.ui.lw_vst3.currentRow())
  785. elif curIndex == self.PATH_INDEX_SF2:
  786. self.ui.lw_sf2.takeItem(self.ui.lw_sf2.currentRow())
  787. elif curIndex == self.PATH_INDEX_SFZ:
  788. self.ui.lw_sfz.takeItem(self.ui.lw_sfz.currentRow())
  789. @pyqtSlot()
  790. def slot_changePluginPath(self):
  791. curIndex = self.ui.tw_paths.currentIndex()
  792. if curIndex == self.PATH_INDEX_LADSPA:
  793. currentPath = self.ui.lw_ladspa.currentItem().text()
  794. elif curIndex == self.PATH_INDEX_DSSI:
  795. currentPath = self.ui.lw_dssi.currentItem().text()
  796. elif curIndex == self.PATH_INDEX_LV2:
  797. currentPath = self.ui.lw_lv2.currentItem().text()
  798. elif curIndex == self.PATH_INDEX_VST2:
  799. currentPath = self.ui.lw_vst.currentItem().text()
  800. elif curIndex == self.PATH_INDEX_VST3:
  801. currentPath = self.ui.lw_vst3.currentItem().text()
  802. elif curIndex == self.PATH_INDEX_SF2:
  803. currentPath = self.ui.lw_sf2.currentItem().text()
  804. elif curIndex == self.PATH_INDEX_SFZ:
  805. currentPath = self.ui.lw_sfz.currentItem().text()
  806. else:
  807. currentPath = ""
  808. newPath = QFileDialog.getExistingDirectory(self, self.tr("Add Path"), currentPath, QFileDialog.ShowDirsOnly)
  809. if not newPath:
  810. return
  811. if curIndex == self.PATH_INDEX_LADSPA:
  812. self.ui.lw_ladspa.currentItem().setText(newPath)
  813. elif curIndex == self.PATH_INDEX_DSSI:
  814. self.ui.lw_dssi.currentItem().setText(newPath)
  815. elif curIndex == self.PATH_INDEX_LV2:
  816. self.ui.lw_lv2.currentItem().setText(newPath)
  817. elif curIndex == self.PATH_INDEX_VST2:
  818. self.ui.lw_vst.currentItem().setText(newPath)
  819. elif curIndex == self.PATH_INDEX_VST3:
  820. self.ui.lw_vst3.currentItem().setText(newPath)
  821. elif curIndex == self.PATH_INDEX_SF2:
  822. self.ui.lw_sf2.currentItem().setText(newPath)
  823. elif curIndex == self.PATH_INDEX_SFZ:
  824. self.ui.lw_sfz.currentItem().setText(newPath)
  825. # --------------------------------------------------------------------------------------------------------
  826. @pyqtSlot(int)
  827. def slot_pluginPathTabChanged(self, index):
  828. if index == self.PATH_INDEX_LADSPA:
  829. row = self.ui.lw_ladspa.currentRow()
  830. elif index == self.PATH_INDEX_DSSI:
  831. row = self.ui.lw_dssi.currentRow()
  832. elif index == self.PATH_INDEX_LV2:
  833. row = self.ui.lw_lv2.currentRow()
  834. elif index == self.PATH_INDEX_VST2:
  835. row = self.ui.lw_vst.currentRow()
  836. elif index == self.PATH_INDEX_VST3:
  837. row = self.ui.lw_vst3.currentRow()
  838. elif index == self.PATH_INDEX_SF2:
  839. row = self.ui.lw_sf2.currentRow()
  840. elif index == self.PATH_INDEX_SFZ:
  841. row = self.ui.lw_sfz.currentRow()
  842. else:
  843. row = -1
  844. check = bool(row >= 0)
  845. self.ui.b_paths_remove.setEnabled(check)
  846. self.ui.b_paths_change.setEnabled(check)
  847. @pyqtSlot(int)
  848. def slot_pluginPathRowChanged(self, row):
  849. check = bool(row >= 0)
  850. self.ui.b_paths_remove.setEnabled(check)
  851. self.ui.b_paths_change.setEnabled(check)
  852. # --------------------------------------------------------------------------------------------------------
  853. def done(self, r):
  854. QDialog.done(self, r)
  855. self.close()
  856. # ------------------------------------------------------------------------------------------------------------
  857. # Main
  858. if __name__ == '__main__':
  859. from carla_app import CarlaApplication
  860. from carla_host import initHost, loadHostSettings
  861. initName, libPrefix = handleInitialCommandLineArguments(__file__ if "__file__" in dir() else None)
  862. app = CarlaApplication("Carla2-Settings", libPrefix)
  863. host = initHost("Carla2-Settings", libPrefix, False, False, False)
  864. loadHostSettings(host)
  865. gui = CarlaSettingsW(None, host, True, True)
  866. gui.show()
  867. app.exit_exec()
  868. # ------------------------------------------------------------------------------------------------------------