@@ -81,6 +81,12 @@ public: | |||||
return fWriteLock; | return fWriteLock; | ||||
} | } | ||||
void show() noexcept | |||||
{ | |||||
const CarlaMutexLocker cml(fWriteLock); | |||||
writeMsg("show\n", 5); | |||||
} | |||||
protected: | protected: | ||||
bool msgReceived(const char* const msg) noexcept override | bool msgReceived(const char* const msg) noexcept override | ||||
{ | { | ||||
@@ -568,6 +574,7 @@ public: | |||||
fIsActive(false), | fIsActive(false), | ||||
fIsRunning(false), | fIsRunning(false), | ||||
fUiServer(this), | fUiServer(this), | ||||
fOptionsForced(false), | |||||
leakDetector_CarlaEngineNative() | leakDetector_CarlaEngineNative() | ||||
{ | { | ||||
carla_debug("CarlaEngineNative::CarlaEngineNative()"); | carla_debug("CarlaEngineNative::CarlaEngineNative()"); | ||||
@@ -939,51 +946,71 @@ protected: | |||||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PROCESS_MODE); | std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PROCESS_MODE); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "%s\n", bool2str(fOptionsForced)); | |||||
fUiServer.writeMsg(fTmpBuf); | |||||
std::sprintf(fTmpBuf, "%i\n", options.processMode); | std::sprintf(fTmpBuf, "%i\n", options.processMode); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_TRANSPORT_MODE); | std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_TRANSPORT_MODE); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "%s\n", bool2str(fOptionsForced)); | |||||
fUiServer.writeMsg(fTmpBuf); | |||||
std::sprintf(fTmpBuf, "%i\n", options.transportMode); | std::sprintf(fTmpBuf, "%i\n", options.transportMode); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_FORCE_STEREO); | std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_FORCE_STEREO); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "%s\n", bool2str(fOptionsForced)); | |||||
fUiServer.writeMsg(fTmpBuf); | |||||
std::sprintf(fTmpBuf, "%s\n", bool2str(options.forceStereo)); | std::sprintf(fTmpBuf, "%s\n", bool2str(options.forceStereo)); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PREFER_PLUGIN_BRIDGES); | std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PREFER_PLUGIN_BRIDGES); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "%s\n", bool2str(fOptionsForced)); | |||||
fUiServer.writeMsg(fTmpBuf); | |||||
std::sprintf(fTmpBuf, "%s\n", bool2str(options.preferPluginBridges)); | std::sprintf(fTmpBuf, "%s\n", bool2str(options.preferPluginBridges)); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PREFER_UI_BRIDGES); | std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PREFER_UI_BRIDGES); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "%s\n", bool2str(fOptionsForced)); | |||||
fUiServer.writeMsg(fTmpBuf); | |||||
std::sprintf(fTmpBuf, "%s\n", bool2str(options.preferUiBridges)); | std::sprintf(fTmpBuf, "%s\n", bool2str(options.preferUiBridges)); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_UIS_ALWAYS_ON_TOP); | std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_UIS_ALWAYS_ON_TOP); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "%s\n", bool2str(fOptionsForced)); | |||||
fUiServer.writeMsg(fTmpBuf); | |||||
std::sprintf(fTmpBuf, "%s\n", bool2str(options.uisAlwaysOnTop)); | std::sprintf(fTmpBuf, "%s\n", bool2str(options.uisAlwaysOnTop)); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_MAX_PARAMETERS); | std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_MAX_PARAMETERS); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "%s\n", bool2str(fOptionsForced)); | |||||
fUiServer.writeMsg(fTmpBuf); | |||||
std::sprintf(fTmpBuf, "%i\n", options.maxParameters); | std::sprintf(fTmpBuf, "%i\n", options.maxParameters); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_UI_BRIDGES_TIMEOUT); | std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_UI_BRIDGES_TIMEOUT); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "%s\n", bool2str(fOptionsForced)); | |||||
fUiServer.writeMsg(fTmpBuf); | |||||
std::sprintf(fTmpBuf, "%i\n", options.uiBridgesTimeout); | std::sprintf(fTmpBuf, "%i\n", options.uiBridgesTimeout); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PATH_BINARIES); | std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PATH_BINARIES); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "%s\n", bool2str(fOptionsForced)); | |||||
fUiServer.writeMsg(fTmpBuf); | |||||
std::sprintf(fTmpBuf, "%s\n", options.binaryDir); | std::sprintf(fTmpBuf, "%s\n", options.binaryDir); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PATH_RESOURCES); | std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PATH_RESOURCES); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
std::sprintf(fTmpBuf, "%s\n", bool2str(fOptionsForced)); | |||||
fUiServer.writeMsg(fTmpBuf); | |||||
std::sprintf(fTmpBuf, "%s\n", options.resourceDir); | std::sprintf(fTmpBuf, "%s\n", options.resourceDir); | ||||
fUiServer.writeMsg(fTmpBuf); | fUiServer.writeMsg(fTmpBuf); | ||||
} | } | ||||
@@ -1327,10 +1354,12 @@ protected: | |||||
carla_stdout("Trying to start carla-plugin using \"%s\"", path.buffer()); | carla_stdout("Trying to start carla-plugin using \"%s\"", path.buffer()); | ||||
fUiServer.setData(path, pData->sampleRate, pHost->uiName); | fUiServer.setData(path, pData->sampleRate, pHost->uiName); | ||||
fUiServer.start(); | |||||
fUiServer.start(false); | |||||
uiServerOptions(); | uiServerOptions(); | ||||
fUiServer.show(); | |||||
for (uint i=0; i < pData->curPluginCount; ++i) | for (uint i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
CarlaPlugin* const plugin(pData->plugins[i].plugin); | CarlaPlugin* const plugin(pData->plugins[i].plugin); | ||||
@@ -1414,6 +1443,7 @@ protected: | |||||
void setState(const char* const data) | void setState(const char* const data) | ||||
{ | { | ||||
fOptionsForced = true; | |||||
const String state(data); | const String state(data); | ||||
XmlDocument xml(state); | XmlDocument xml(state); | ||||
loadProjectInternal(xml); | loadProjectInternal(xml); | ||||
@@ -1561,6 +1591,7 @@ private: | |||||
bool fIsActive, fIsRunning; | bool fIsActive, fIsRunning; | ||||
CarlaEngineNativeUI fUiServer; | CarlaEngineNativeUI fUiServer; | ||||
bool fOptionsForced; | |||||
char fTmpBuf[STR_MAX+1]; | char fTmpBuf[STR_MAX+1]; | ||||
CarlaPlugin* _getFirstPlugin() const noexcept | CarlaPlugin* _getFirstPlugin() const noexcept | ||||
@@ -454,32 +454,33 @@ class CarlaSettingsW(QDialog): | |||||
settings.setValue(CARLA_KEY_ENGINE_AUDIO_DRIVER, audioDriver) | settings.setValue(CARLA_KEY_ENGINE_AUDIO_DRIVER, audioDriver) | ||||
if not self.host.processModeForced: | if not self.host.processModeForced: | ||||
# engine sends callback if processMode really changes | |||||
processMode = self.ui.cb_engine_process_mode_jack.currentIndex() if audioDriver == "JACK" else self.ui.cb_engine_process_mode_other.currentIndex()+self.PROCESS_MODE_NON_JACK_PADDING | processMode = self.ui.cb_engine_process_mode_jack.currentIndex() if audioDriver == "JACK" else self.ui.cb_engine_process_mode_other.currentIndex()+self.PROCESS_MODE_NON_JACK_PADDING | ||||
settings.setValue(CARLA_KEY_ENGINE_PROCESS_MODE, processMode) | |||||
self.host.set_engine_option(ENGINE_OPTION_PROCESS_MODE, processMode, "") | self.host.set_engine_option(ENGINE_OPTION_PROCESS_MODE, processMode, "") | ||||
forceStereo = self.ui.ch_engine_force_stereo.isChecked() | |||||
preferPluginBridges = self.ui.ch_engine_prefer_plugin_bridges.isChecked() | |||||
preferUIBridges = self.ui.ch_engine_prefer_ui_bridges.isChecked() | |||||
uisAlwaysOnTop = self.ui.ch_engine_uis_always_on_top.isChecked() | |||||
maxParameters = self.ui.sb_engine_max_params.value() | |||||
uiBridgesTimeout = self.ui.sb_engine_ui_bridges_timeout.value() | |||||
settings.setValue(CARLA_KEY_ENGINE_FORCE_STEREO, forceStereo) | |||||
settings.setValue(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, preferPluginBridges) | |||||
settings.setValue(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, preferUIBridges) | |||||
settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, uisAlwaysOnTop) | |||||
settings.setValue(CARLA_KEY_ENGINE_MAX_PARAMETERS, maxParameters) | |||||
settings.setValue(CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT, uiBridgesTimeout) | |||||
self.host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, forceStereo, "") | |||||
self.host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, preferPluginBridges, "") | |||||
self.host.set_engine_option(ENGINE_OPTION_PREFER_UI_BRIDGES, preferUIBridges, "") | |||||
self.host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, uisAlwaysOnTop, "") | |||||
self.host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, maxParameters, "") | |||||
self.host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, uiBridgesTimeout, "") | |||||
settings.setValue(CARLA_KEY_ENGINE_PROCESS_MODE, processMode) | |||||
self.host.forceStereo = self.ui.ch_engine_force_stereo.isChecked() | |||||
self.host.preferPluginBridges = self.ui.ch_engine_prefer_plugin_bridges.isChecked() | |||||
self.host.preferUIBridges = self.ui.ch_engine_prefer_ui_bridges.isChecked() | |||||
self.host.uisAlwaysOnTop = self.ui.ch_engine_uis_always_on_top.isChecked() | |||||
self.host.maxParameters = self.ui.sb_engine_max_params.value() | |||||
self.host.uiBridgesTimeout = self.ui.sb_engine_ui_bridges_timeout.value() | |||||
self.host.set_engine_option(ENGINE_OPTION_FORCE_STEREO, self.host.forceStereo, "") | |||||
self.host.set_engine_option(ENGINE_OPTION_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges, "") | |||||
self.host.set_engine_option(ENGINE_OPTION_PREFER_UI_BRIDGES, self.host.preferUIBridges, "") | |||||
self.host.set_engine_option(ENGINE_OPTION_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop, "") | |||||
self.host.set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, self.host.maxParameters, "") | |||||
self.host.set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout, "") | |||||
settings.setValue(CARLA_KEY_ENGINE_FORCE_STEREO, self.host.forceStereo) | |||||
settings.setValue(CARLA_KEY_ENGINE_PREFER_PLUGIN_BRIDGES, self.host.preferPluginBridges) | |||||
settings.setValue(CARLA_KEY_ENGINE_PREFER_UI_BRIDGES, self.host.preferUIBridges) | |||||
settings.setValue(CARLA_KEY_ENGINE_UIS_ALWAYS_ON_TOP, self.host.uisAlwaysOnTop) | |||||
settings.setValue(CARLA_KEY_ENGINE_MAX_PARAMETERS, self.host.maxParameters) | |||||
settings.setValue(CARLA_KEY_ENGINE_UI_BRIDGES_TIMEOUT, self.host.uiBridgesTimeout) | |||||
# ---------------------------------------------------------------------------------------------------- | # ---------------------------------------------------------------------------------------------------- | ||||
# Paths | # Paths | ||||
@@ -521,16 +522,6 @@ class CarlaSettingsW(QDialog): | |||||
for i in range(self.ui.lw_sfz.count()): | for i in range(self.ui.lw_sfz.count()): | ||||
sfzs.append(self.ui.lw_sfz.item(i).text()) | sfzs.append(self.ui.lw_sfz.item(i).text()) | ||||
settings.setValue(CARLA_KEY_PATHS_LADSPA, ladspas) | |||||
settings.setValue(CARLA_KEY_PATHS_DSSI, dssis) | |||||
settings.setValue(CARLA_KEY_PATHS_LV2, lv2s) | |||||
settings.setValue(CARLA_KEY_PATHS_VST, vsts) | |||||
settings.setValue(CARLA_KEY_PATHS_VST3, vst3s) | |||||
settings.setValue(CARLA_KEY_PATHS_AU, aus) | |||||
settings.setValue(CARLA_KEY_PATHS_GIG, gigs) | |||||
settings.setValue(CARLA_KEY_PATHS_SF2, sf2s) | |||||
settings.setValue(CARLA_KEY_PATHS_SFZ, sfzs) | |||||
self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LADSPA, splitter.join(ladspas)) | self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LADSPA, splitter.join(ladspas)) | ||||
self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_DSSI, splitter.join(dssis)) | self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_DSSI, splitter.join(dssis)) | ||||
self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LV2, splitter.join(lv2s)) | self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LV2, splitter.join(lv2s)) | ||||
@@ -541,6 +532,16 @@ class CarlaSettingsW(QDialog): | |||||
self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SF2, splitter.join(sf2s)) | self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SF2, splitter.join(sf2s)) | ||||
self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SFZ, splitter.join(sfzs)) | self.host.set_engine_option(ENGINE_OPTION_PLUGIN_PATH, PLUGIN_SFZ, splitter.join(sfzs)) | ||||
settings.setValue(CARLA_KEY_PATHS_LADSPA, ladspas) | |||||
settings.setValue(CARLA_KEY_PATHS_DSSI, dssis) | |||||
settings.setValue(CARLA_KEY_PATHS_LV2, lv2s) | |||||
settings.setValue(CARLA_KEY_PATHS_VST, vsts) | |||||
settings.setValue(CARLA_KEY_PATHS_VST3, vst3s) | |||||
settings.setValue(CARLA_KEY_PATHS_AU, aus) | |||||
settings.setValue(CARLA_KEY_PATHS_GIG, gigs) | |||||
settings.setValue(CARLA_KEY_PATHS_SF2, sf2s) | |||||
settings.setValue(CARLA_KEY_PATHS_SFZ, sfzs) | |||||
# -------------------------------------------------------------------------------------------------------- | # -------------------------------------------------------------------------------------------------------- | ||||
@pyqtSlot() | @pyqtSlot() | ||||
@@ -855,7 +856,7 @@ if __name__ == '__main__': | |||||
host = initHost("Settings", None, False, False, False) | host = initHost("Settings", None, False, False, False) | ||||
loadHostSettings(host) | loadHostSettings(host) | ||||
gui = CarlaSettingsW(None, host, True, True, True) | |||||
gui = CarlaSettingsW(None, host, True, True) | |||||
gui.show() | gui.show() | ||||
app.exit_exec() | app.exit_exec() | ||||
@@ -99,6 +99,8 @@ class CarlaMiniW(ExternalUI, HostWindow): | |||||
self.fContainer = CarlaRackW(self, host) | self.fContainer = CarlaRackW(self, host) | ||||
self.setupContainer(False) | self.setupContainer(False) | ||||
self.fFirstInit = True | |||||
self.setWindowTitle(self.fUiName) | self.setWindowTitle(self.fUiName) | ||||
self.ready() | self.ready() | ||||
@@ -183,8 +185,12 @@ class CarlaMiniW(ExternalUI, HostWindow): | |||||
elif msg.startswith("ENGINE_OPTION_"): | elif msg.startswith("ENGINE_OPTION_"): | ||||
option = int(msg.replace("ENGINE_OPTION_", "")) | option = int(msg.replace("ENGINE_OPTION_", "")) | ||||
forced = bool(self.readlineblock() == "true") | |||||
value = self.readlineblock() | value = self.readlineblock() | ||||
if self.fFirstInit and not forced: | |||||
continue | |||||
if option == ENGINE_OPTION_PROCESS_MODE: | if option == ENGINE_OPTION_PROCESS_MODE: | ||||
self.host.processMode = int(value) | self.host.processMode = int(value) | ||||
elif option == ENGINE_OPTION_TRANSPORT_MODE: | elif option == ENGINE_OPTION_TRANSPORT_MODE: | ||||
@@ -313,6 +319,7 @@ class CarlaMiniW(ExternalUI, HostWindow): | |||||
engineCallback(self.host, ENGINE_CALLBACK_ERROR, 0, 0, 0, 0.0, error) | engineCallback(self.host, ENGINE_CALLBACK_ERROR, 0, 0, 0, 0.0, error) | ||||
elif msg == "show": | elif msg == "show": | ||||
self.fFirstInit = False | |||||
self.d_uiShow() | self.d_uiShow() | ||||
elif msg == "hide": | elif msg == "hide": | ||||
@@ -58,10 +58,13 @@ public: | |||||
fUiTitle = uiTitle; | fUiTitle = uiTitle; | ||||
} | } | ||||
void start() noexcept | |||||
void start(const bool show = true) noexcept | |||||
{ | { | ||||
CarlaPipeServer::start(fFilename, fSampleRate, fUiTitle); | CarlaPipeServer::start(fFilename, fSampleRate, fUiTitle); | ||||
if (! show) | |||||
return; | |||||
const CarlaMutexLocker cml(fWriteLock); | const CarlaMutexLocker cml(fWriteLock); | ||||
writeMsg("show\n", 5); | writeMsg("show\n", 5); | ||||
} | } | ||||