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.

carla_settings.py 47KB

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