diff --git a/c++/carla-backend/carla_backend.h b/c++/carla-backend/carla_backend.h index 92545d5..5e9749d 100644 --- a/c++/carla-backend/carla_backend.h +++ b/c++/carla-backend/carla_backend.h @@ -164,134 +164,144 @@ enum OptionsType { */ OPTION_PROCESS_MODE = 1, + /*! + * High-Precision processing mode.\n + * When enabled, audio will be processed by blocks of 8 samples at a time, indenpendently of the buffer size.\n + * Default is off.\n + * EXPERIMENTAL! + */ + OPTION_PROCESS_HIGH_PRECISION = 2, + /*! * Maximum number of parameters allowed.\n * Default is MAX_PARAMETERS. */ - OPTION_MAX_PARAMETERS = 2, + OPTION_MAX_PARAMETERS = 3, /*! - * Use OSC-UI bridges whenever possible, otherwise UIs will be handled in the main thread.\n - * Default is yes. + * Prefered buffer size. + */ + OPTION_PREFERRED_BUFFER_SIZE = 4, + + /*! + * Prefered sample rate. */ - OPTION_PREFER_UI_BRIDGES = 3, + OPTION_PREFERRED_SAMPLE_RATE = 5, /*! * Force mono plugins as stereo, by running 2 instances at the same time.\n * Not supported in VST plugins. */ - OPTION_FORCE_STEREO = 4, + OPTION_FORCE_STEREO = 6, /*! - * High-Precision processing mode.\n - * When enabled, audio will be processed by blocks of 8 samples at a time, indenpendently of the buffer size.\n - * Default is off.\n + * Use (unofficial) dssi-vst chunks feature.\n + * Default is no. * EXPERIMENTAL! */ - OPTION_PROCESS_HIGH_PRECISION = 5, + OPTION_USE_DSSI_VST_CHUNKS = 7, /*! - * Timeout value in ms for how much to wait for OSC-GUIs to respond.\n - * Default is 4000 ms (4 secs). + * Use OSC-UI bridges whenever possible, otherwise UIs will be handled in the main thread.\n + * Default is yes. */ - OPTION_OSC_GUI_TIMEOUT = 6, + OPTION_PREFER_UI_BRIDGES = 8, /*! - * Use (unofficial) dssi-vst chunks feature.\n - * Default is no. - * EXPERIMENTAL! + * Timeout value in ms for how much to wait for OSC-UIs to respond.\n + * Default is 4000 ms (4 secs). */ - OPTION_USE_DSSI_CHUNKS = 7, + OPTION_OSC_UI_TIMEOUT = 9, /*! * Set LADSPA_PATH environment variable.\n * Default undefined. */ - OPTION_PATH_LADSPA = 8, + OPTION_PATH_LADSPA = 10, /*! * Set DSSI_PATH environment variable.\n * Default undefined. */ - OPTION_PATH_DSSI = 9, + OPTION_PATH_DSSI = 11, /*! * Set LV2_PATH environment variable.\n * Default undefined. */ - OPTION_PATH_LV2 = 10, + OPTION_PATH_LV2 = 12, /*! * Set VST_PATH environment variable.\n * Default undefined. */ - OPTION_PATH_VST = 11, + OPTION_PATH_VST = 13, /*! * Set GIG_PATH environment variable.\n * Default undefined. */ - OPTION_PATH_GIG = 12, + OPTION_PATH_GIG = 14, /*! * Set SF2_PATH environment variable.\n * Default undefined. */ - OPTION_PATH_SF2 = 13, + OPTION_PATH_SF2 = 15, /*! * Set SFZ_PATH environment variable.\n * Default undefined. */ - OPTION_PATH_SFZ = 14, + OPTION_PATH_SFZ = 16, /*! * Set path to the Unix 32bit plugin bridge executable.\n * Default unset. */ - OPTION_PATH_BRIDGE_UNIX32 = 15, + OPTION_PATH_BRIDGE_UNIX32 = 17, /*! * Set path to the Unix 64bit plugin bridge executable.\n * Default unset. */ - OPTION_PATH_BRIDGE_UNIX64 = 16, + OPTION_PATH_BRIDGE_UNIX64 = 18, /*! * Set path to the Windows 32bit plugin bridge executable.\n * Default unset. */ - OPTION_PATH_BRIDGE_WIN32 = 17, + OPTION_PATH_BRIDGE_WIN32 = 19, /*! * Set path to the Windows 64bit plugin bridge executable.\n * Default unset. */ - OPTION_PATH_BRIDGE_WIN64 = 18, + OPTION_PATH_BRIDGE_WIN64 = 20, /*! * Set path to the LV2 Gtk2 UI bridge executable.\n * Default unset. */ - OPTION_PATH_BRIDGE_LV2_GTK2 = 19, + OPTION_PATH_BRIDGE_LV2_GTK2 = 21, /*! * Set path to the LV2 Qt4 UI bridge executable.\n * Default unset. */ - OPTION_PATH_BRIDGE_LV2_QT4 = 20, + OPTION_PATH_BRIDGE_LV2_QT4 = 22, /*! * Set path to the LV2 X11 UI bridge executable.\n * Default unset. */ - OPTION_PATH_BRIDGE_LV2_X11 = 21, + OPTION_PATH_BRIDGE_LV2_X11 = 23, /*! * Set path to the VST X11 UI bridge executable.\n * Default unset. */ - OPTION_PATH_BRIDGE_VST_X11 = 22 + OPTION_PATH_BRIDGE_VST_X11 = 24 }; /*! diff --git a/c++/carla-backend/carla_backend_standalone.cpp b/c++/carla-backend/carla_backend_standalone.cpp index 237a6ec..2347c50 100644 --- a/c++/carla-backend/carla_backend_standalone.cpp +++ b/c++/carla-backend/carla_backend_standalone.cpp @@ -240,6 +240,9 @@ const PluginInfo* get_plugin_info(unsigned short plugin_id) info.copyright = nullptr; } + if (! carlaEngine->isRunning()) + return nullptr; + CarlaBackend::CarlaPlugin* const plugin = carlaEngine->getPlugin(plugin_id); if (plugin) @@ -265,9 +268,7 @@ const PluginInfo* get_plugin_info(unsigned short plugin_id) return &info; } - if (carlaEngine->isRunning()) - qCritical("CarlaBackendStandalone::get_plugin_info(%i) - could not find plugin", plugin_id); - + qCritical("CarlaBackendStandalone::get_plugin_info(%i) - could not find plugin", plugin_id); return &info; } diff --git a/c++/carla-backend/carla_bridge.cpp b/c++/carla-backend/carla_bridge.cpp index 3680be5..9bb3187 100644 --- a/c++/carla-backend/carla_bridge.cpp +++ b/c++/carla-backend/carla_bridge.cpp @@ -255,7 +255,7 @@ public: } // create new if needed - param.count = (pTotal < (int)carlaOptions.max_parameters) ? pTotal : 0; + param.count = (pTotal < (int)carlaOptions.maxParameters) ? pTotal : 0; if (param.count > 0) { @@ -721,7 +721,7 @@ CarlaPlugin* CarlaPlugin::newBridge(const initializer& init, BinaryType btype, P plugin->reload(); - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { if (/* inputs */ ((plugin->audioInCount() != 0 && plugin->audioInCount() != 2)) || /* outputs */ ((plugin->audioOutCount() != 0 && plugin->audioOutCount() != 2))) { diff --git a/c++/carla-backend/carla_engine.cpp b/c++/carla-backend/carla_engine.cpp index d8641dd..f84fd90 100644 --- a/c++/carla-backend/carla_engine.cpp +++ b/c++/carla-backend/carla_engine.cpp @@ -78,7 +78,7 @@ int CarlaEngine::maxClientNameSize() { #ifdef CARLA_ENGINE_JACK # ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK) # endif return jack_client_name_size(); #endif @@ -89,7 +89,7 @@ int CarlaEngine::maxPortNameSize() { #ifdef CARLA_ENGINE_JACK # ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK) # endif return jack_port_name_size(); #endif @@ -103,8 +103,6 @@ bool CarlaEngine::init(const char* const clientName) m_osc.init(clientName); m_oscData = m_osc.getControllerData(); - m_checkThread.start(QThread::HighPriority); - return true; } @@ -127,13 +125,6 @@ short CarlaEngine::getNewPluginId() const { qDebug("CarlaEngine::getNewPluginId()"); - if (maxPluginNumber == 0) -#ifdef BUILD_BRIDGE - maxPluginNumber = MAX_PLUGINS; -#else - maxPluginNumber = (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) ? 16 : MAX_PLUGINS; -#endif - for (unsigned short i=0; i < maxPluginNumber; i++) { if (! m_carlaPlugins[i]) @@ -157,7 +148,7 @@ CarlaPlugin* CarlaEngine::getPlugin(const unsigned short id) const CarlaPlugin* CarlaEngine::getPluginUnchecked(const unsigned short id) const { - Q_ASSERT(maxPluginNumber != 0); + //Q_ASSERT(maxPluginNumber != 0); Q_ASSERT(id < maxPluginNumber); return m_carlaPlugins[id]; @@ -233,12 +224,18 @@ short CarlaEngine::addPlugin(const PluginType ptype, const char* const filename, short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra) { qDebug("CarlaEngine::addPlugin(%s, %s, \"%s\", \"%s\", \"%s\", %p)", BinaryType2str(btype), PluginType2str(ptype), filename, name, label, extra); - Q_ASSERT(maxPluginNumber != 0); Q_ASSERT(btype != BINARY_NONE); Q_ASSERT(ptype != PLUGIN_NONE); Q_ASSERT(filename); Q_ASSERT(label); + if (maxPluginNumber == 0) +#ifdef BUILD_BRIDGE + maxPluginNumber = MAX_PLUGINS; +#else + maxPluginNumber = (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) ? 16 : MAX_PLUGINS; +#endif + CarlaPlugin::initializer init = { this, filename, @@ -252,7 +249,7 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con if (btype != BINARY_NATIVE) { # ifdef CARLA_ENGINE_JACK - if (carlaOptions.process_mode != CarlaBackend::PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != CarlaBackend::PROCESS_MODE_MULTIPLE_CLIENTS) { setLastError("Can only use bridged plugins in JACK Multi-Client mode"); return -1; @@ -306,6 +303,9 @@ short CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, con m_carlaPlugins[id] = plugin; m_uniqueNames[id] = plugin->name(); + if (! m_checkThread.isRunning()) + m_checkThread.start(QThread::HighPriority); + return id; } @@ -321,7 +321,7 @@ bool CarlaEngine::removePlugin(const unsigned short id) { Q_ASSERT(plugin->id() == id); - const CarlaCheckThread::ScopedLocker m(&m_checkThread); + m_checkThread.stopNow(); processLock(); plugin->setEnabled(false); @@ -331,7 +331,7 @@ bool CarlaEngine::removePlugin(const unsigned short id) m_carlaPlugins[id] = nullptr; m_uniqueNames[id] = nullptr; - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { for (unsigned short i=id; i < maxPluginNumber-1; i++) { @@ -343,6 +343,9 @@ bool CarlaEngine::removePlugin(const unsigned short id) } } + if (isRunning()) + m_checkThread.start(QThread::HighPriority); + return true; } @@ -356,7 +359,7 @@ void CarlaEngine::removeAllPlugins() qDebug("CarlaEngine::removeAllPlugins()"); Q_ASSERT(maxPluginNumber != 0); - const CarlaCheckThread::ScopedLocker m(&m_checkThread); + m_checkThread.stopNow(); for (unsigned short i=0; i < maxPluginNumber; i++) { @@ -546,7 +549,7 @@ CarlaEngineClient::~CarlaEngineClient() Q_ASSERT(! m_active); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS) #endif { #ifdef CARLA_ENGINE_JACK @@ -566,7 +569,7 @@ void CarlaEngineClient::activate() Q_ASSERT(! m_active); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS) #endif { if (! m_active) @@ -591,7 +594,7 @@ void CarlaEngineClient::deactivate() Q_ASSERT(m_active); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS) #endif { if (m_active) @@ -622,7 +625,7 @@ bool CarlaEngineClient::isOk() const qDebug("CarlaEngineClient::isOk()"); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK) #endif { #ifdef CARLA_ENGINE_JACK @@ -645,7 +648,7 @@ const CarlaEngineBasePort* CarlaEngineClient::addPort(const CarlaEnginePortType #ifdef CARLA_ENGINE_JACK # ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK) # endif { switch (type) @@ -694,7 +697,7 @@ CarlaEngineBasePort::~CarlaEngineBasePort() #ifdef CARLA_ENGINE_JACK # ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode != PROCESS_MODE_CONTINUOUS_RACK) # endif { if (handle.jackClient && handle.jackPort) @@ -720,7 +723,7 @@ void CarlaEngineAudioPort::initBuffer(CarlaEngine* const /*engine*/) float* CarlaEngineAudioPort::getJackAudioBuffer(uint32_t nframes) { # ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) return nullptr; # endif Q_ASSERT(handle.jackPort); @@ -742,7 +745,7 @@ void CarlaEngineControlPort::initBuffer(CarlaEngine* const engine) Q_ASSERT(engine); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { buffer = isInput ? engine->rackControlEventsIn : engine->rackControlEventsOut; return; @@ -768,7 +771,7 @@ uint32_t CarlaEngineControlPort::getEventCount() Q_ASSERT(buffer); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { uint32_t count = 0; const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer; @@ -801,7 +804,7 @@ const CarlaEngineControlEvent* CarlaEngineControlPort::getEvent(uint32_t index) Q_ASSERT(index < CarlaEngine::MAX_ENGINE_CONTROL_EVENTS); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { const CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer; @@ -876,7 +879,7 @@ void CarlaEngineControlPort::writeEvent(CarlaEngineControlEventType type, uint32 Q_ASSERT(type != CarlaEngineEventNull); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { CarlaEngineControlEvent* const events = (CarlaEngineControlEvent*)buffer; @@ -952,7 +955,7 @@ void CarlaEngineMidiPort::initBuffer(CarlaEngine* const engine) Q_ASSERT(engine); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { buffer = isInput ? engine->rackMidiEventsIn : engine->rackMidiEventsOut; return; @@ -978,7 +981,7 @@ uint32_t CarlaEngineMidiPort::getEventCount() Q_ASSERT(buffer); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { uint32_t count = 0; const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer; @@ -1011,7 +1014,7 @@ const CarlaEngineMidiEvent* CarlaEngineMidiPort::getEvent(uint32_t index) Q_ASSERT(index < CarlaEngine::MAX_ENGINE_MIDI_EVENTS); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { const CarlaEngineMidiEvent* const events = (CarlaEngineMidiEvent*)buffer; @@ -1048,7 +1051,7 @@ void CarlaEngineMidiPort::writeEvent(uint32_t time, uint8_t* data, uint8_t size) Q_ASSERT(size > 0); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { if (size > 4) return; diff --git a/c++/carla-backend/carla_engine_jack.cpp b/c++/carla-backend/carla_engine_jack.cpp index 60df205..e832999 100644 --- a/c++/carla-backend/carla_engine_jack.cpp +++ b/c++/carla-backend/carla_engine_jack.cpp @@ -129,7 +129,7 @@ bool CarlaEngineJack::init(const char* const clientName) jack_on_shutdown(client, carla_jack_shutdown_callback, this); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { rackJackPorts[rackPortAudioIn1] = jack_port_register(client, "in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); rackJackPorts[rackPortAudioIn2] = jack_port_register(client, "in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); @@ -186,7 +186,7 @@ bool CarlaEngineJack::close() if (jack_deactivate(client) == 0) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { jack_port_unregister(client, rackJackPorts[rackPortAudioIn1]); jack_port_unregister(client, rackJackPorts[rackPortAudioIn2]); @@ -234,11 +234,11 @@ CarlaEngineClient* CarlaEngineJack::addClient(CarlaPlugin* const plugin) CarlaEngineClientNativeHandle handle; #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_SINGLE_CLIENT) + if (carlaOptions.processMode == PROCESS_MODE_SINGLE_CLIENT) { handle.jackClient = client; } - else if (carlaOptions.process_mode == PROCESS_MODE_MULTIPLE_CLIENTS) + else if (carlaOptions.processMode == PROCESS_MODE_MULTIPLE_CLIENTS) #endif { handle.jackClient = jack_client_open(plugin->name(), JackNullOption, nullptr); @@ -261,7 +261,7 @@ void CarlaEngineJack::handleSampleRateCallback(double newSampleRate) void CarlaEngineJack::handleBufferSizeCallback(uint32_t newBufferSize) { #ifndef BUILD_BRIDGE - if (carlaOptions.proccess_hp) + if (carlaOptions.processHighPrecision) return; #endif @@ -309,7 +309,7 @@ void CarlaEngineJack::handleProcessCallback(uint32_t nframes) } #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_SINGLE_CLIENT) + if (carlaOptions.processMode == PROCESS_MODE_SINGLE_CLIENT) { for (unsigned short i=0; i < MAX_PLUGINS; i++) { @@ -324,7 +324,7 @@ void CarlaEngineJack::handleProcessCallback(uint32_t nframes) } } } - else if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + else if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { // get buffers from jack float* audioIn1 = (float*)jack_port_get_buffer(rackJackPorts[rackPortAudioIn1], nframes); @@ -469,7 +469,7 @@ void CarlaEngineJack::handleProcessCallback(uint32_t nframes) plugin->initBuffers(); - if (carlaOptions.proccess_hp) + if (carlaOptions.processHighPrecision) { float* ains_buffer2[2]; float* aouts_buffer2[2]; diff --git a/c++/carla-backend/carla_engine_rtaudio.cpp b/c++/carla-backend/carla_engine_rtaudio.cpp index e3b26d5..15db6a6 100644 --- a/c++/carla-backend/carla_engine_rtaudio.cpp +++ b/c++/carla-backend/carla_engine_rtaudio.cpp @@ -254,7 +254,7 @@ void CarlaEngineRtAudio::handleProcessCallback(void* outputBuffer, void* inputBu plugin->initBuffers(); - if (carlaOptions.proccess_hp) + if (carlaOptions.processHighPrecision) { float* ains_buffer2[2]; float* aouts_buffer2[2]; diff --git a/c++/carla-backend/carla_plugin.h b/c++/carla-backend/carla_plugin.h index 8ccd954..cb0424b 100644 --- a/c++/carla-backend/carla_plugin.h +++ b/c++/carla-backend/carla_plugin.h @@ -217,7 +217,7 @@ public: m_filename = nullptr; #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) cin_channel = m_id; else #endif @@ -741,7 +741,7 @@ public: { m_id = id; - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) cin_channel = id; } @@ -1330,7 +1330,7 @@ public: outBuffer[i] = aout.ports[i]->getJackAudioBuffer(nframes); #ifndef BUILD_BRIDGE - if (carlaOptions.proccess_hp) + if (carlaOptions.processHighPrecision) { float* inBuffer2[ain.count]; float* outBuffer2[aout.count]; @@ -1419,7 +1419,7 @@ public: } // Plugin Parameters - if (param.count > 0 && param.count < carlaOptions.max_parameters) + if (param.count > 0 && param.count < carlaOptions.maxParameters) { char bufName[STR_MAX], bufUnit[STR_MAX]; @@ -1556,7 +1556,7 @@ public: bool showOscGui() { // wait for UI 'update' call - for (int i=0; i < carlaOptions.osc_gui_timeout; i++) + for (uint i=0; i < carlaOptions.oscUiTimeout; i++) { if (osc.data.target) { diff --git a/c++/carla-backend/carla_shared.cpp b/c++/carla-backend/carla_shared.cpp index 882e9aa..4ba5207 100644 --- a/c++/carla-backend/carla_shared.cpp +++ b/c++/carla-backend/carla_shared.cpp @@ -200,18 +200,22 @@ const char* OptionsType2str(const OptionsType type) { case OPTION_PROCESS_MODE: return "OPTION_PROCESS_MODE"; + case OPTION_PROCESS_HIGH_PRECISION: + return "OPTION_PROCESS_HIGH_PRECISION"; case OPTION_MAX_PARAMETERS: return "OPTION_MAX_PARAMETERS"; - case OPTION_PREFER_UI_BRIDGES: - return "OPTION_PREFER_UI_BRIDGES"; + case OPTION_PREFERRED_BUFFER_SIZE: + return "OPTION_PREFERRED_BUFFER_SIZE"; + case OPTION_PREFERRED_SAMPLE_RATE: + return "OPTION_PREFERRED_SAMPLE_RATE"; case OPTION_FORCE_STEREO: return "OPTION_FORCE_STEREO"; - case OPTION_PROCESS_HIGH_PRECISION: - return "OPTION_PROCESS_HIGH_PRECISION"; - case OPTION_OSC_GUI_TIMEOUT: - return "OPTION_OSC_GUI_TIMEOUT"; - case OPTION_USE_DSSI_CHUNKS: - return "OPTION_USE_DSSI_CHUNKS"; + case OPTION_USE_DSSI_VST_CHUNKS: + return "OPTION_USE_DSSI_VST_CHUNKS"; + case OPTION_PREFER_UI_BRIDGES: + return "OPTION_PREFER_UI_BRIDGES"; + case OPTION_OSC_UI_TIMEOUT: + return "OPTION_OSC_UI_TIMEOUT"; case OPTION_PATH_LADSPA: return "OPTION_PATH_LADSPA"; case OPTION_PATH_DSSI: @@ -480,25 +484,31 @@ void setOption(const OptionsType option, const int value, const char* const valu case OPTION_PROCESS_MODE: if (value < PROCESS_MODE_SINGLE_CLIENT || value > PROCESS_MODE_CONTINUOUS_RACK) return qCritical("CarlaBackend::setOption(%s, %i, \"%s\") - invalid value", OptionsType2str(option), value, valueStr); - carlaOptions.process_mode = (ProcessModeType)value; + carlaOptions.processMode = (ProcessModeType)value; + break; + case OPTION_PROCESS_HIGH_PRECISION: + carlaOptions.processHighPrecision = value; break; case OPTION_MAX_PARAMETERS: - carlaOptions.max_parameters = (value > 0) ? value : MAX_PARAMETERS; + carlaOptions.maxParameters = (value > 0) ? value : MAX_PARAMETERS; break; - case OPTION_PREFER_UI_BRIDGES: - carlaOptions.prefer_ui_bridges = value; + case OPTION_PREFERRED_BUFFER_SIZE: + carlaOptions.preferredBufferSize = value; + break; + case OPTION_PREFERRED_SAMPLE_RATE: + carlaOptions.preferredSampleRate = value; break; case OPTION_FORCE_STEREO: - carlaOptions.force_stereo = value; + carlaOptions.forceStereo = value; break; - case OPTION_PROCESS_HIGH_PRECISION: - carlaOptions.proccess_hp = value; + case OPTION_USE_DSSI_VST_CHUNKS: + carlaOptions.useDssiVstChunks = value; break; - case OPTION_OSC_GUI_TIMEOUT: - carlaOptions.osc_gui_timeout = value/100; + case OPTION_PREFER_UI_BRIDGES: + carlaOptions.preferUiBridges = value; break; - case OPTION_USE_DSSI_CHUNKS: - carlaOptions.use_dssi_chunks = value; + case OPTION_OSC_UI_TIMEOUT: + carlaOptions.oscUiTimeout = value/100; break; case OPTION_PATH_LADSPA: carla_setenv("LADSPA_PATH", valueStr); @@ -576,20 +586,24 @@ void resetOptions() if (carlaOptions.bridge_vstx11) free((void*)carlaOptions.bridge_vstx11); - carlaOptions.process_mode = PROCESS_MODE_MULTIPLE_CLIENTS; - carlaOptions.max_parameters = MAX_PARAMETERS; - carlaOptions.prefer_ui_bridges = true; - carlaOptions.proccess_hp = false; - carlaOptions.osc_gui_timeout = 4000/100; - carlaOptions.use_dssi_chunks = false; - carlaOptions.bridge_unix32 = nullptr; - carlaOptions.bridge_unix64 = nullptr; - carlaOptions.bridge_win32 = nullptr; - carlaOptions.bridge_win64 = nullptr; - carlaOptions.bridge_lv2gtk2 = nullptr; - carlaOptions.bridge_lv2qt4 = nullptr; - carlaOptions.bridge_lv2x11 = nullptr; - carlaOptions.bridge_vstx11 = nullptr; + carlaOptions.processMode = PROCESS_MODE_MULTIPLE_CLIENTS; + carlaOptions.processHighPrecision = false; + carlaOptions.maxParameters = MAX_PARAMETERS; + carlaOptions.preferredBufferSize = 512; + carlaOptions.preferredSampleRate = 44100; + carlaOptions.forceStereo = false; + carlaOptions.useDssiVstChunks = false; + carlaOptions.preferUiBridges = true; + carlaOptions.oscUiTimeout = 4000/100; + + carlaOptions.bridge_unix32 = nullptr; + carlaOptions.bridge_unix64 = nullptr; + carlaOptions.bridge_win32 = nullptr; + carlaOptions.bridge_win64 = nullptr; + carlaOptions.bridge_lv2gtk2 = nullptr; + carlaOptions.bridge_lv2qt4 = nullptr; + carlaOptions.bridge_lv2x11 = nullptr; + carlaOptions.bridge_vstx11 = nullptr; } #endif // BUILD_BRIDGE diff --git a/c++/carla-backend/carla_shared.h b/c++/carla-backend/carla_shared.h index f8ebd3f..0ab6866 100644 --- a/c++/carla-backend/carla_shared.h +++ b/c++/carla-backend/carla_shared.h @@ -55,13 +55,19 @@ void resetOptions(); // Global options struct carla_options_t { - ProcessModeType process_mode; - uint max_parameters; - bool prefer_ui_bridges; - bool force_stereo; - bool proccess_hp; - int osc_gui_timeout; - bool use_dssi_chunks; + ProcessModeType processMode; + bool processHighPrecision; + + uint maxParameters; + uint preferredBufferSize; + uint preferredSampleRate; + + bool forceStereo; + bool useDssiVstChunks; + + bool preferUiBridges; + uint oscUiTimeout; + const char* bridge_unix32; const char* bridge_unix64; const char* bridge_win32; @@ -72,13 +78,15 @@ struct carla_options_t { const char* bridge_vstx11; carla_options_t() - : process_mode(PROCESS_MODE_MULTIPLE_CLIENTS), - max_parameters(MAX_PARAMETERS), - prefer_ui_bridges(true), - force_stereo(false), - proccess_hp(false), - osc_gui_timeout(4000/100), - use_dssi_chunks(false), + : processMode(PROCESS_MODE_MULTIPLE_CLIENTS), + processHighPrecision(false), + maxParameters(MAX_PARAMETERS), + preferredBufferSize(512), + preferredSampleRate(44100), + forceStereo(false), + useDssiVstChunks(false), + preferUiBridges(true), + oscUiTimeout(4000/100), bridge_unix32(nullptr), bridge_unix64(nullptr), bridge_win32(nullptr), diff --git a/c++/carla-backend/carla_threads.h b/c++/carla-backend/carla_threads.h index cea27c9..06e6649 100644 --- a/c++/carla-backend/carla_threads.h +++ b/c++/carla-backend/carla_threads.h @@ -34,6 +34,16 @@ public: void stopNow(); +protected: + void run(); + +private: + CarlaBackend::CarlaEngine* const engine; + QMutex mutex; + bool m_stopNow; + + // ---------------------------------------------- + class ScopedLocker { public: @@ -51,14 +61,6 @@ public: private: CarlaCheckThread* const m_thread; }; - -protected: - void run(); - -private: - CarlaBackend::CarlaEngine* const engine; - QMutex mutex; - bool m_stopNow; }; // -------------------------------------------------------------------------------------------------------- diff --git a/c++/carla-backend/dssi.cpp b/c++/carla-backend/dssi.cpp index 6bfb68b..ef05291 100644 --- a/c++/carla-backend/dssi.cpp +++ b/c++/carla-backend/dssi.cpp @@ -345,7 +345,7 @@ public: params += 1; } - if (carlaOptions.force_stereo && (ains == 1 || aouts == 1) && ! h2) + if (carlaOptions.forceStereo && (ains == 1 || aouts == 1) && ! h2) h2 = ldescriptor->instantiate(ldescriptor, sampleRate); if (descriptor->run_synth || descriptor->run_multiple_synths) @@ -383,7 +383,7 @@ public: if (LADSPA_IS_PORT_AUDIO(PortType)) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":"); @@ -612,7 +612,7 @@ public: if (needsCin) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":control-in"); @@ -627,7 +627,7 @@ public: if (needsCout) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":control-out"); @@ -642,7 +642,7 @@ public: if (mins > 0) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":midi-in"); @@ -665,7 +665,7 @@ public: m_hints |= PLUGIN_IS_SYNTH; #ifndef BUILD_BRIDGE - if (carlaOptions.use_dssi_chunks && QString(m_filename).endsWith("dssi-vst.so", Qt::CaseInsensitive)) + if (carlaOptions.useDssiVstChunks && QString(m_filename).endsWith("dssi-vst.so", Qt::CaseInsensitive)) { if (descriptor->get_custom_data && descriptor->set_custom_data) m_hints |= PLUGIN_USES_CHUNKS; @@ -1508,7 +1508,7 @@ CarlaPlugin* CarlaPlugin::newDSSI(const initializer& init, const void* const ext plugin->reload(); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { const uint32_t ins = plugin->audioInCount(); const uint32_t outs = plugin->audioOutCount(); diff --git a/c++/carla-backend/fluidsynth.cpp b/c++/carla-backend/fluidsynth.cpp index 12bfb50..74b481f 100644 --- a/c++/carla-backend/fluidsynth.cpp +++ b/c++/carla-backend/fluidsynth.cpp @@ -415,7 +415,7 @@ public: // Audio Outputs #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":out-left"); @@ -428,7 +428,7 @@ public: aout.rindexes[0] = 0; #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":out-right"); @@ -444,7 +444,7 @@ public: // MIDI Input #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":midi-in"); @@ -459,7 +459,7 @@ public: // Parameters #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":control-in"); @@ -471,7 +471,7 @@ public: param.portCin = (CarlaEngineControlPort*)x_client->addPort(CarlaEnginePortTypeControl, portName, true); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":control-out"); diff --git a/c++/carla-backend/ladspa.cpp b/c++/carla-backend/ladspa.cpp index 5ed4ce3..8cf8260 100644 --- a/c++/carla-backend/ladspa.cpp +++ b/c++/carla-backend/ladspa.cpp @@ -331,7 +331,7 @@ public: params += 1; } - if (carlaOptions.force_stereo && (ains == 1 || aouts == 1) && ! h2) + if (carlaOptions.forceStereo && (ains == 1 || aouts == 1) && ! h2) h2 = descriptor->instantiate(descriptor, sampleRate); if (ains > 0) @@ -367,7 +367,7 @@ public: if (LADSPA_IS_PORT_AUDIO(PortType)) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":"); @@ -591,7 +591,7 @@ public: if (needsCin) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":control-in"); @@ -606,7 +606,7 @@ public: if (needsCout) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":control-out"); @@ -1114,7 +1114,7 @@ CarlaPlugin* CarlaPlugin::newLADSPA(const initializer& init, const void* const e plugin->reload(); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { const uint32_t ins = plugin->audioInCount(); const uint32_t outs = plugin->audioOutCount(); diff --git a/c++/carla-backend/linuxsampler.cpp b/c++/carla-backend/linuxsampler.cpp index afc57dc..e66718f 100644 --- a/c++/carla-backend/linuxsampler.cpp +++ b/c++/carla-backend/linuxsampler.cpp @@ -159,7 +159,7 @@ public: // Audio Outputs #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":out-left"); @@ -172,7 +172,7 @@ public: aout.rindexes[0] = 0; #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":out-right"); @@ -188,7 +188,7 @@ public: // MIDI Input #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":midi-in"); diff --git a/c++/carla-backend/lv2.cpp b/c++/carla-backend/lv2.cpp index e0c0dbd..e0e0cf9 100644 --- a/c++/carla-backend/lv2.cpp +++ b/c++/carla-backend/lv2.cpp @@ -984,7 +984,7 @@ public: bool forcedStereoIn, forcedStereoOut; forcedStereoIn = forcedStereoOut = true; - if (carlaOptions.force_stereo && (ains == 1 || aouts == 1) && ! h2) + if (carlaOptions.forceStereo && (ains == 1 || aouts == 1) && ! h2) { h2 = descriptor->instantiate(descriptor, sampleRate, rdf_descriptor->Bundle, features); @@ -1100,7 +1100,7 @@ public: if (LV2_IS_PORT_AUDIO(PortType) || LV2_IS_PORT_ATOM_SEQUENCE(PortType) || LV2_IS_PORT_CV(PortType) || LV2_IS_PORT_EVENT(PortType) || LV2_IS_PORT_MIDI_LL(PortType)) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":"); @@ -1434,7 +1434,7 @@ public: if (needsCin) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":control-in"); @@ -1449,7 +1449,7 @@ public: if (needsCout) { #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS) + if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS) { strcpy(portName, m_name); strcat(portName, ":control-out"); @@ -3446,7 +3446,7 @@ public: { case LV2_UI_QT4: #ifndef BUILD_BRIDGE - if (isUiBridgeable(i) && carlaOptions.prefer_ui_bridges) + if (isUiBridgeable(i) && carlaOptions.preferUiBridges) eQt4 = i; #endif iQt4 = i; @@ -3454,7 +3454,7 @@ public: case LV2_UI_WINDOWS: #ifndef BUILD_BRIDGE - if (isUiBridgeable(i) && carlaOptions.prefer_ui_bridges) + if (isUiBridgeable(i) && carlaOptions.preferUiBridges) eHWND = i; #endif iHWND = i; @@ -3462,7 +3462,7 @@ public: case LV2_UI_X11: #ifndef BUILD_BRIDGE - if (isUiBridgeable(i) && carlaOptions.prefer_ui_bridges) + if (isUiBridgeable(i) && carlaOptions.preferUiBridges) eX11 = i; #endif iX11 = i; @@ -3473,7 +3473,7 @@ public: if (false) #else # ifdef HAVE_SUIL - if (isUiBridgeable(i) && carlaOptions.prefer_ui_bridges) + if (isUiBridgeable(i) && carlaOptions.preferUiBridges) # else if (isUiBridgeable(i)) # endif @@ -3825,7 +3825,7 @@ CarlaPlugin* CarlaPlugin::newLV2(const initializer& init) plugin->reload(); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { const uint32_t ins = plugin->audioInCount(); const uint32_t outs = plugin->audioOutCount(); diff --git a/c++/carla-backend/vst.cpp b/c++/carla-backend/vst.cpp index 04367c1..95eb5bb 100644 --- a/c++/carla-backend/vst.cpp +++ b/c++/carla-backend/vst.cpp @@ -371,7 +371,7 @@ public: for (j=0; jreload(); #ifndef BUILD_BRIDGE - if (carlaOptions.process_mode == PROCESS_MODE_CONTINUOUS_RACK) + if (carlaOptions.processMode == PROCESS_MODE_CONTINUOUS_RACK) { const uint32_t ins = plugin->audioInCount(); const uint32_t outs = plugin->audioOutCount(); diff --git a/src/carla.py b/src/carla.py index d2bed1b..184dda5 100755 --- a/src/carla.py +++ b/src/carla.py @@ -1060,6 +1060,7 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): self.m_engine_started = False self.m_project_filename = None + self.m_pluginCount = 0 self.m_plugin_list = [] for x in range(MAX_PLUGINS): @@ -1068,6 +1069,8 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): # ------------------------------------------------------------- # Set-up GUI stuff + self.act_engine_start.setEnabled(False) + self.act_engine_stop.setEnabled(False) self.act_plugin_remove_all.setEnabled(False) self.resize(self.width(), 0) @@ -1079,6 +1082,9 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): self.connect(self.act_file_save, SIGNAL("triggered()"), SLOT("slot_file_save()")) self.connect(self.act_file_save_as, SIGNAL("triggered()"), SLOT("slot_file_save_as()")) + self.connect(self.act_engine_start, SIGNAL("triggered()"), SLOT("slot_engine_start()")) + self.connect(self.act_engine_stop, SIGNAL("triggered()"), SLOT("slot_engine_stop()")) + self.connect(self.act_plugin_add, SIGNAL("triggered()"), SLOT("slot_plugin_add()")) self.connect(self.act_plugin_remove_all, SIGNAL("triggered()"), SLOT("slot_remove_all()")) @@ -1105,6 +1111,132 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): self.TIMER_GUI_STUFF = self.startTimer(self.m_savedSettings["Main/RefreshInterval"]) # Peaks self.TIMER_GUI_STUFF2 = self.startTimer(self.m_savedSettings["Main/RefreshInterval"] * 2) # LEDs and edit dialog + QTimer.singleShot(0, self, SLOT("slot_engine_start()")) + + def loadProjectLater(self): + QTimer.singleShot(0, self.load_project) + + def startEngine(self): + # --------------------------------------------- + # engine + + Carla.processMode = self.settings.value("Engine/ProcessMode", PROCESS_MODE_MULTIPLE_CLIENTS, type=int) + Carla.maxParameters = self.settings.value("Engine/MaxParameters", MAX_PARAMETERS, type=int) + + processHighPrecision = self.settings.value("Engine/ProcessHighPrecision", False, type=bool) + preferredBufferSize = self.settings.value("Engine/PreferredBufferSize", 512, type=int) + preferredSampleRate = self.settings.value("Engine/PreferredSampleRate", 44100, type=int) + + forceStereo = self.settings.value("Engine/ForceStereo", False, type=bool) + useDssiVstChunks = self.settings.value("Engine/UseDssiVstChunks", False, type=bool) + + preferUiBridges = self.settings.value("Engine/PreferUiBridges", True, type=bool) + oscUiTimeout = self.settings.value("Engine/OscUiTimeout", 40, type=int) + disableChecks = self.settings.value("Engine/DisableChecks", bool(not WINDOWS), type=bool) + + if Carla.processMode == PROCESS_MODE_CONTINUOUS_RACK: + forceStereo = True + elif Carla.processMode == PROCESS_MODE_MULTIPLE_CLIENTS and os.getenv("LADISH_APP_NAME"): + print("LADISH detected but using multiple clients (not allowed), forcing single client now") + Carla.processMode = PROCESS_MODE_SINGLE_CLIENT + + if disableChecks: + os.environ["CARLA_DISCOVERY_NO_PROCESSING_CHECKS"] = "true" + + Carla.Host.set_option(OPTION_PROCESS_MODE, Carla.processMode, "") + Carla.Host.set_option(OPTION_PROCESS_HIGH_PRECISION, processHighPrecision, "") + + Carla.Host.set_option(OPTION_MAX_PARAMETERS, Carla.maxParameters, "") + Carla.Host.set_option(OPTION_PREFERRED_BUFFER_SIZE, preferredBufferSize, "") + Carla.Host.set_option(OPTION_PREFERRED_SAMPLE_RATE, preferredSampleRate, "") + + Carla.Host.set_option(OPTION_FORCE_STEREO, forceStereo, "") + Carla.Host.set_option(OPTION_USE_DSSI_VST_CHUNKS, useDssiVstChunks, "") + + Carla.Host.set_option(OPTION_PREFER_UI_BRIDGES, preferUiBridges, "") + Carla.Host.set_option(OPTION_OSC_UI_TIMEOUT, oscUiTimeout, "") + + # --------------------------------------------- + # plugin paths + + global LADSPA_PATH, DSSI_PATH, LV2_PATH, VST_PATH, GIG_PATH, SF2_PATH, SFZ_PATH + LADSPA_PATH = toList(self.settings.value("Paths/LADSPA", LADSPA_PATH)) + DSSI_PATH = toList(self.settings.value("Paths/DSSI", DSSI_PATH)) + LV2_PATH = toList(self.settings.value("Paths/LV2", LV2_PATH)) + VST_PATH = toList(self.settings.value("Paths/VST", VST_PATH)) + GIG_PATH = toList(self.settings.value("Paths/GIG", GIG_PATH)) + SF2_PATH = toList(self.settings.value("Paths/SF2", SF2_PATH)) + SFZ_PATH = toList(self.settings.value("Paths/SFZ", SFZ_PATH)) + + Carla.Host.set_option(OPTION_PATH_LADSPA, 0, splitter.join(LADSPA_PATH)) + Carla.Host.set_option(OPTION_PATH_DSSI, 0, splitter.join(DSSI_PATH)) + Carla.Host.set_option(OPTION_PATH_LV2, 0, splitter.join(LV2_PATH)) + Carla.Host.set_option(OPTION_PATH_VST, 0, splitter.join(VST_PATH)) + Carla.Host.set_option(OPTION_PATH_GIG, 0, splitter.join(GIG_PATH)) + Carla.Host.set_option(OPTION_PATH_SF2, 0, splitter.join(SF2_PATH)) + Carla.Host.set_option(OPTION_PATH_SFZ, 0, splitter.join(SFZ_PATH)) + + # --------------------------------------------- + # bridge paths + + if carla_bridge_unix32: + Carla.Host.set_option(OPTION_PATH_BRIDGE_UNIX32, 0, carla_bridge_unix32) + + if carla_bridge_unix64: + Carla.Host.set_option(OPTION_PATH_BRIDGE_UNIX64, 0, carla_bridge_unix64) + + if carla_bridge_win32: + Carla.Host.set_option(OPTION_PATH_BRIDGE_WIN32, 0, carla_bridge_win32) + + if carla_bridge_win64: + Carla.Host.set_option(OPTION_PATH_BRIDGE_WIN64, 0, carla_bridge_win64) + + if carla_bridge_lv2_gtk2: + Carla.Host.set_option(OPTION_PATH_BRIDGE_LV2_GTK2, 0, carla_bridge_lv2_gtk2) + + if carla_bridge_lv2_qt4: + Carla.Host.set_option(OPTION_PATH_BRIDGE_LV2_QT4, 0, carla_bridge_lv2_qt4) + + if carla_bridge_lv2_x11: + Carla.Host.set_option(OPTION_PATH_BRIDGE_LV2_X11, 0, carla_bridge_lv2_x11) + + if carla_bridge_vst_x11: + Carla.Host.set_option(OPTION_PATH_BRIDGE_VST_X11, 0, carla_bridge_vst_x11) + + # --------------------------------------------- + # start + + audioDriver = self.settings.value("Engine/AudioDriver", "JACK", type=str) + + if not Carla.Host.engine_init(audioDriver, "Carla"): + self.act_engine_start.setEnabled(True) + self.act_engine_stop.setEnabled(False) + QMessageBox.critical(self, self.tr("Error"), self.tr("Could not connect to Audio backend '%s', possible reasons: %s" % (audioDriver, cString(Carla.Host.get_last_error())))) + return + + + self.m_engine_started = True + + def stopEngine(self): + if Carla.Host.is_engine_running() and not Carla.Host.engine_close(): + print(cString(Carla.Host.get_last_error())) + + self.m_engine_started = False + + @pyqtSlot() + def slot_engine_start(self): + self.startEngine() + check = Carla.Host.is_engine_running() + self.act_engine_start.setEnabled(not check) + self.act_engine_stop.setEnabled(check) + + @pyqtSlot() + def slot_engine_stop(self): + self.stopEngine() + check = Carla.Host.is_engine_running() + self.act_engine_start.setEnabled(not check) + self.act_engine_stop.setEnabled(check) + @pyqtSlot() def slot_handleSIGUSR1(self): print("Got SIGUSR1 -> Saving project now") @@ -1216,11 +1348,16 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): self.tr("You may want to save your session now..."), QMessageBox.Ok, QMessageBox.Ok) def add_plugin(self, btype, ptype, filename, name, label, extra_stuff, activate): + if not self.m_engine_started: + if activate: + QMessageBox.warning(self, self.tr("Warning"), self.tr("Cannot add new plugins while engine is stopped")) + return -1 + new_plugin_id = Carla.Host.add_plugin(btype, ptype, filename, name, label, extra_stuff) - if (new_plugin_id < 0): - CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"), self.tr("Failed to load plugin"), - cString(Carla.Host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok) + if new_plugin_id < 0: + CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"), self.tr("Failed to load plugin"), cString(Carla.Host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok) + return -1 else: pwidget = PluginWidget(self, new_plugin_id) self.w_plugins.layout().addWidget(pwidget) @@ -1233,6 +1370,7 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): if activate: pwidget.set_active(True, True, True) + self.m_pluginCount += 1 return new_plugin_id def remove_plugin(self, plugin_id, showError): @@ -1247,6 +1385,7 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): pwidget.deleteLater() self.w_plugins.layout().removeWidget(pwidget) self.m_plugin_list[plugin_id] = None + self.m_pluginCount -= 1 elif showError: CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"), self.tr("Failed to remove plugin"), cString(Carla.Host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok) @@ -1664,28 +1803,11 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): "Main/RefreshInterval": self.settings.value("Main/RefreshInterval", 120, type=int) } - global LADSPA_PATH, DSSI_PATH, LV2_PATH, VST_PATH, GIG_PATH, SF2_PATH, SFZ_PATH - LADSPA_PATH = toList(self.settings.value("Paths/LADSPA", LADSPA_PATH)) - DSSI_PATH = toList(self.settings.value("Paths/DSSI", DSSI_PATH)) - LV2_PATH = toList(self.settings.value("Paths/LV2", LV2_PATH)) - VST_PATH = toList(self.settings.value("Paths/VST", VST_PATH)) - GIG_PATH = toList(self.settings.value("Paths/GIG", GIG_PATH)) - SF2_PATH = toList(self.settings.value("Paths/SF2", SF2_PATH)) - SFZ_PATH = toList(self.settings.value("Paths/SFZ", SFZ_PATH)) - - Carla.Host.set_option(OPTION_PATH_LADSPA, 0, splitter.join(LADSPA_PATH)) - Carla.Host.set_option(OPTION_PATH_DSSI, 0, splitter.join(DSSI_PATH)) - Carla.Host.set_option(OPTION_PATH_LV2, 0, splitter.join(LV2_PATH)) - Carla.Host.set_option(OPTION_PATH_VST, 0, splitter.join(VST_PATH)) - Carla.Host.set_option(OPTION_PATH_GIG, 0, splitter.join(GIG_PATH)) - Carla.Host.set_option(OPTION_PATH_SF2, 0, splitter.join(SF2_PATH)) - Carla.Host.set_option(OPTION_PATH_SFZ, 0, splitter.join(SFZ_PATH)) - def timerEvent(self, event): if event.timerId() == self.TIMER_GUI_STUFF: for pwidget in self.m_plugin_list: if pwidget: pwidget.check_gui_stuff() - if self.m_engine_started: + if self.m_engine_started and self.m_pluginCount > 0: Carla.Host.idle_guis() elif event.timerId() == self.TIMER_GUI_STUFF2: for pwidget in self.m_plugin_list: @@ -1699,37 +1821,37 @@ class CarlaMainW(QMainWindow, ui_carla.Ui_CarlaMainW): # ------------------------------------------------------------------------------------------------ -def callback_function(ptr, action, plugin_id, value1, value2, value3): - if plugin_id < 0 or plugin_id >= MAX_PLUGINS: +def callback_function(ptr, action, pluginId, value1, value2, value3): + if pluginId< 0 or pluginId >= MAX_PLUGINS or not Carla.gui: return if action == CALLBACK_DEBUG: - Carla.gui.emit(SIGNAL("DebugCallback(int, int, int, double)"), plugin_id, value1, value2, value3) + Carla.gui.emit(SIGNAL("DebugCallback(int, int, int, double)"), pluginId, value1, value2, value3) elif action == CALLBACK_PARAMETER_VALUE_CHANGED: - Carla.gui.emit(SIGNAL("ParameterCallback(int, int, double)"), plugin_id, value1, value3) + Carla.gui.emit(SIGNAL("ParameterCallback(int, int, double)"), pluginId, value1, value3) # TODO param midi callbacks elif action == CALLBACK_PROGRAM_CHANGED: - Carla.gui.emit(SIGNAL("ProgramCallback(int, int)"), plugin_id, value1) + Carla.gui.emit(SIGNAL("ProgramCallback(int, int)"), pluginId, value1) elif action == CALLBACK_MIDI_PROGRAM_CHANGED: - Carla.gui.emit(SIGNAL("MidiProgramCallback(int, int)"), plugin_id, value1) + Carla.gui.emit(SIGNAL("MidiProgramCallback(int, int)"), pluginId, value1) elif action == CALLBACK_NOTE_ON: - Carla.gui.emit(SIGNAL("NoteOnCallback(int, int, int, int)"), plugin_id, value1, value2, value3) + Carla.gui.emit(SIGNAL("NoteOnCallback(int, int, int, int)"), pluginId, value1, value2, value3) elif action == CALLBACK_NOTE_OFF: - Carla.gui.emit(SIGNAL("NoteOffCallback(int, int, int)"), plugin_id, value1, value2) + Carla.gui.emit(SIGNAL("NoteOffCallback(int, int, int)"), pluginId, value1, value2) elif action == CALLBACK_SHOW_GUI: - Carla.gui.emit(SIGNAL("ShowGuiCallback(int, int)"), plugin_id, value1) + Carla.gui.emit(SIGNAL("ShowGuiCallback(int, int)"), pluginId, value1) elif action == CALLBACK_RESIZE_GUI: - Carla.gui.emit(SIGNAL("ResizeGuiCallback(int, int, int)"), plugin_id, value1, value2) + Carla.gui.emit(SIGNAL("ResizeGuiCallback(int, int, int)"), pluginId, value1, value2) elif action == CALLBACK_UPDATE: - Carla.gui.emit(SIGNAL("UpdateCallback(int)"), plugin_id) + Carla.gui.emit(SIGNAL("UpdateCallback(int)"), pluginId) elif action == CALLBACK_RELOAD_INFO: - Carla.gui.emit(SIGNAL("ReloadInfoCallback(int)"), plugin_id) + Carla.gui.emit(SIGNAL("ReloadInfoCallback(int)"), pluginId) elif action == CALLBACK_RELOAD_PARAMETERS: - Carla.gui.emit(SIGNAL("ReloadParametersCallback(int)"), plugin_id) + Carla.gui.emit(SIGNAL("ReloadParametersCallback(int)"), pluginId) elif action == CALLBACK_RELOAD_PROGRAMS: - Carla.gui.emit(SIGNAL("ReloadProgramsCallback(int)"), plugin_id) + Carla.gui.emit(SIGNAL("ReloadProgramsCallback(int)"), pluginId) elif action == CALLBACK_RELOAD_ALL: - Carla.gui.emit(SIGNAL("ReloadAllCallback(int)"), plugin_id) + Carla.gui.emit(SIGNAL("ReloadAllCallback(int)"), pluginId) elif action == CALLBACK_QUIT: Carla.gui.emit(SIGNAL("QuitCallback()")) @@ -1742,114 +1864,50 @@ if __name__ == '__main__': app.setOrganizationName("Cadence") app.setWindowIcon(QIcon(":/scalable/carla.svg")) - lib_prefix = None - project_filename = None + libPrefix = None + projectFilename = None for i in range(len(app.arguments())): if i == 0: continue argument = app.arguments()[i] if argument.startswith("--with-libprefix="): - lib_prefix = argument.replace("--with-libprefix=", "") + libPrefix = argument.replace("--with-libprefix=", "") elif os.path.exists(argument): - project_filename = argument - - #style = app.style().metaObject().className() - #force_parameters_style = (style in ("Bespin::Style",)) - - Carla.Host = Host(lib_prefix) - - # Create GUI and read settings - Carla.gui = CarlaMainW() - - # Init backend - Carla.processMode = Carla.gui.settings.value("Engine/ProcessMode", PROCESS_MODE_MULTIPLE_CLIENTS, type=int) - Carla.maxParameters = Carla.gui.settings.value("Engine/MaxParameters", MAX_PARAMETERS, type=int) - - prefer_ui_bridges = Carla.gui.settings.value("Engine/PreferUIBridges", True, type=bool) - osc_gui_timeout = Carla.gui.settings.value("Engine/OscGuiTimeout", 40, type=int) - disable_checks = Carla.gui.settings.value("Engine/DisableChecks", bool(not WINDOWS), type=bool) - use_dssi_chunks = Carla.gui.settings.value("Engine/UseDSSIChunks", False, type=bool) - force_stereo = Carla.gui.settings.value("Engine/ForceStereo", False, type=bool) - proccess_hp = Carla.gui.settings.value("Engine/ProcessHP", False, type=bool) - - if Carla.processMode == PROCESS_MODE_CONTINUOUS_RACK: - force_stereo = True - elif Carla.processMode == PROCESS_MODE_MULTIPLE_CLIENTS and os.getenv("LADISH_APP_NAME"): - print("LADISH detected but using multiple clients (not allowed), forcing single client now") - Carla.processMode = PROCESS_MODE_SINGLE_CLIENT - - if disable_checks: - os.environ["CARLA_DISCOVERY_NO_PROCESSING_CHECKS"] = "true" + projectFilename = argument + Carla.Host = Host(libPrefix) Carla.Host.set_callback_function(callback_function) - Carla.Host.set_option(OPTION_PROCESS_MODE, Carla.processMode, "") - Carla.Host.set_option(OPTION_MAX_PARAMETERS, Carla.maxParameters, "") - - Carla.Host.set_option(OPTION_OSC_GUI_TIMEOUT, osc_gui_timeout, "") - Carla.Host.set_option(OPTION_PREFER_UI_BRIDGES, prefer_ui_bridges, "") + # Set available drivers + driverCount = Carla.Host.get_engine_driver_count() + driverList = [] + for i in range(driverCount): + driver = cString(Carla.Host.get_engine_driver_name(i)) + if driver: + driverList.append(driver) + setAvailableEngineDrivers(driverList) - Carla.Host.set_option(OPTION_USE_DSSI_CHUNKS, use_dssi_chunks, "") - Carla.Host.set_option(OPTION_FORCE_STEREO, force_stereo, "") - Carla.Host.set_option(OPTION_PROCESS_HIGH_PRECISION, proccess_hp, "") - - if carla_bridge_unix32: - Carla.Host.set_option(OPTION_PATH_BRIDGE_UNIX32, 0, carla_bridge_unix32) - - if carla_bridge_unix64: - Carla.Host.set_option(OPTION_PATH_BRIDGE_UNIX64, 0, carla_bridge_unix64) - - if carla_bridge_win32: - Carla.Host.set_option(OPTION_PATH_BRIDGE_WIN32, 0, carla_bridge_win32) - - if carla_bridge_win64: - Carla.Host.set_option(OPTION_PATH_BRIDGE_WIN64, 0, carla_bridge_win64) - - if carla_bridge_lv2_gtk2: - Carla.Host.set_option(OPTION_PATH_BRIDGE_LV2_GTK2, 0, carla_bridge_lv2_gtk2) - - if carla_bridge_lv2_qt4: - Carla.Host.set_option(OPTION_PATH_BRIDGE_LV2_QT4, 0, carla_bridge_lv2_qt4) - - if carla_bridge_lv2_x11: - Carla.Host.set_option(OPTION_PATH_BRIDGE_LV2_X11, 0, carla_bridge_lv2_x11) - - if carla_bridge_vst_x11: - Carla.Host.set_option(OPTION_PATH_BRIDGE_VST_X11, 0, carla_bridge_vst_x11) - - # TEST - count = Carla.Host.get_engine_driver_count() - print(count) - for i in range(0, count): - dname = cString(Carla.Host.get_engine_driver_name(i)) - print("%i - %s" % (i, dname)) - - if not Carla.Host.engine_init("JACK", "Carla"): - #if not Carla.Host.engine_init("PulseAudio", "Carla"): - CustomMessageBox(None, QMessageBox.Critical, "Error", "Could not connect to Audio backend, possible reasons:", - cString(Carla.Host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok) - sys.exit(1) + # Create GUI and start engine + Carla.gui = CarlaMainW() # Set-up custom signal handling setUpSignals(Carla.gui) # Show GUI - Carla.gui.m_engine_started = True Carla.gui.show() - if project_filename: - Carla.gui.m_project_filename = project_filename - Carla.gui.load_project() - Carla.gui.setWindowTitle("Carla - %s" % os.path.basename(project_filename)) + if projectFilename: + Carla.gui.m_project_filename = projectFilename + Carla.gui.loadProjectLater() + Carla.gui.setWindowTitle("Carla - %s" % os.path.basename(projectFilename)) # FIXME - put in loadProject # App-Loop ret = app.exec_() # Close Host - if Carla.Host.is_engine_running() and not Carla.Host.engine_close(): - print(cString(Carla.Host.get_last_error())) + Carla.gui.stopEngine() # Exit properly sys.exit(ret) diff --git a/src/shared_carla.py b/src/shared_carla.py index 64b12f2..b60b08e 100644 --- a/src/shared_carla.py +++ b/src/shared_carla.py @@ -135,27 +135,29 @@ GUI_EXTERNAL_OSC = 7 # enum OptionsType OPTION_PROCESS_MODE = 1 -OPTION_MAX_PARAMETERS = 2 -OPTION_PREFER_UI_BRIDGES = 3 -OPTION_FORCE_STEREO = 4 -OPTION_PROCESS_HIGH_PRECISION = 5 -OPTION_OSC_GUI_TIMEOUT = 6 -OPTION_USE_DSSI_CHUNKS = 7 -OPTION_PATH_LADSPA = 8 -OPTION_PATH_DSSI = 9 -OPTION_PATH_LV2 = 10 -OPTION_PATH_VST = 11 -OPTION_PATH_GIG = 12 -OPTION_PATH_SF2 = 13 -OPTION_PATH_SFZ = 14 -OPTION_PATH_BRIDGE_UNIX32 = 15 -OPTION_PATH_BRIDGE_UNIX64 = 16 -OPTION_PATH_BRIDGE_WIN32 = 17 -OPTION_PATH_BRIDGE_WIN64 = 18 -OPTION_PATH_BRIDGE_LV2_GTK2 = 19 -OPTION_PATH_BRIDGE_LV2_QT4 = 20 -OPTION_PATH_BRIDGE_LV2_X11 = 21 -OPTION_PATH_BRIDGE_VST_X11 = 22 +OPTION_PROCESS_HIGH_PRECISION = 2 +OPTION_MAX_PARAMETERS = 3 +OPTION_PREFERRED_BUFFER_SIZE = 4 +OPTION_PREFERRED_SAMPLE_RATE = 5 +OPTION_FORCE_STEREO = 6 +OPTION_USE_DSSI_VST_CHUNKS = 7 +OPTION_PREFER_UI_BRIDGES = 8 +OPTION_OSC_UI_TIMEOUT = 9 +OPTION_PATH_LADSPA = 10 +OPTION_PATH_DSSI = 11 +OPTION_PATH_LV2 = 12 +OPTION_PATH_VST = 13 +OPTION_PATH_GIG = 14 +OPTION_PATH_SF2 = 15 +OPTION_PATH_SFZ = 16 +OPTION_PATH_BRIDGE_UNIX32 = 17 +OPTION_PATH_BRIDGE_UNIX64 = 18 +OPTION_PATH_BRIDGE_WIN32 = 19 +OPTION_PATH_BRIDGE_WIN64 = 20 +OPTION_PATH_BRIDGE_LV2_GTK2 = 21 +OPTION_PATH_BRIDGE_LV2_QT4 = 22 +OPTION_PATH_BRIDGE_LV2_X11 = 23 +OPTION_PATH_BRIDGE_VST_X11 = 24 # enum CallbackType CALLBACK_DEBUG = 0 diff --git a/src/shared_settings.py b/src/shared_settings.py index 7a9f01d..42a5ad3 100644 --- a/src/shared_settings.py +++ b/src/shared_settings.py @@ -56,8 +56,10 @@ LADISH_CONF_KEY_DAEMON_JS_SAVE_DELAY_DEFAULT = 0 # Internal defines global SETTINGS_DEFAULT_PROJECT_FOLDER global SETTINGS_DEFAULT_PLUGINS_PATHS -SETTINGS_DEFAULT_PROJECT_FOLDER = HOME -SETTINGS_DEFAULT_PLUGINS_PATHS = [[], [], [], [], [], [], []] +global SETTINGS_AVAILABLE_ENGINE_DRIVERS +SETTINGS_DEFAULT_PROJECT_FOLDER = HOME +SETTINGS_DEFAULT_PLUGINS_PATHS = [[], [], [], [], [], [], []] +SETTINGS_AVAILABLE_ENGINE_DRIVERS = ["JACK"] def setDefaultProjectFolder(folder): global SETTINGS_DEFAULT_PROJECT_FOLDER @@ -65,7 +67,11 @@ def setDefaultProjectFolder(folder): def setDefaultPluginsPaths(ladspas, dssis, lv2s, vsts, gigs, sf2s, sfzs): global SETTINGS_DEFAULT_PLUGINS_PATHS - SETTINGS_DEFAULT_PLUGINS_PATHS = [ladspas, dssis, lv2s, vsts, gigs, sf2s, sfzs] + SETTINGS_DEFAULT_PLUGINS_PATHS = [ladspas, dssis, lv2s, vsts, gigs, sf2s, sfzs] + +def setAvailableEngineDrivers(drivers): + global SETTINGS_AVAILABLE_ENGINE_DRIVERS + SETTINGS_AVAILABLE_ENGINE_DRIVERS = drivers # Settings Dialog class SettingsW(QDialog, ui_settings_app.Ui_SettingsW): @@ -119,6 +125,10 @@ class SettingsW(QDialog, ui_settings_app.Ui_SettingsW): self.lw_page.hideRow(2) self.lw_page.setCurrentCell(0, 0) + global SETTINGS_AVAILABLE_ENGINE_DRIVERS + for driver in SETTINGS_AVAILABLE_ENGINE_DRIVERS: + self.cb_engine_audio_driver.addItem(driver) + else: self.lw_page.hideRow(0) self.lw_page.hideRow(1) @@ -200,7 +210,13 @@ class SettingsW(QDialog, ui_settings_app.Ui_SettingsW): # -------------------------------------------- if not self.lw_page.isRowHidden(TAB_INDEX_CARLA_ENGINE): - #self.cb_engine_audio_driver.setCurrentIndex(self.settings.value("Engine/AudioDriver", "JACK", type=str)) + audioDriver = self.settings.value("Engine/AudioDriver", "JACK", type=str) + for i in range(self.cb_engine_audio_driver.count()): + if self.cb_engine_audio_driver.itemText(i) == audioDriver: + self.cb_engine_audio_driver.setCurrentIndex(i) + break + else: + self.cb_engine_audio_driver.setCurrentIndex(-1) self.cb_engine_process_mode.setCurrentIndex(self.settings.value("Engine/ProcessMode", PROCESS_MODE_MULTIPLE_CLIENTS, type=int)) self.sb_engine_max_params.setValue(self.settings.value("Engine/MaxParameters", 200, type=int)) self.ch_engine_prefer_bridges.setChecked(self.settings.value("Engine/PreferUIBridges", True, type=bool)) @@ -398,12 +414,12 @@ class SettingsW(QDialog, ui_settings_app.Ui_SettingsW): self.settings.setValue("Engine/AudioDriver", self.cb_engine_audio_driver.currentText()) self.settings.setValue("Engine/ProcessMode", self.cb_engine_process_mode.currentIndex()) self.settings.setValue("Engine/MaxParameters", self.sb_engine_max_params.value()) - self.settings.setValue("Engine/PreferUIBridges", self.ch_engine_prefer_bridges.isChecked()) - self.settings.setValue("Engine/OscGuiTimeout", self.sb_engine_oscgui_timeout.value()) + self.settings.setValue("Engine/PreferUiBridges", self.ch_engine_prefer_bridges.isChecked()) + self.settings.setValue("Engine/OscUiTimeout", self.sb_engine_oscgui_timeout.value()) self.settings.setValue("Engine/DisableChecks", self.ch_engine_disable_checks.isChecked()) - self.settings.setValue("Engine/UseDSSIChunks", self.ch_engine_dssi_chunks.isChecked()) + self.settings.setValue("Engine/UseDssiVstChunks", self.ch_engine_dssi_chunks.isChecked()) self.settings.setValue("Engine/ForceStereo", self.ch_engine_force_stereo.isChecked()) - self.settings.setValue("Engine/ProcessHP", self.ch_engine_process_hp.isChecked()) + self.settings.setValue("Engine/ProcessHighPrecision", self.ch_engine_process_hp.isChecked()) # -------------------------------------------- @@ -470,6 +486,7 @@ class SettingsW(QDialog, ui_settings_app.Ui_SettingsW): self.le_ladish_terminal.setText(LADISH_CONF_KEY_DAEMON_TERMINAL_DEFAULT) elif self.lw_page.currentRow() == TAB_INDEX_CARLA_ENGINE: + self.cb_engine_audio_driver.setCurrentIndex(0) self.cb_engine_process_mode.setCurrentIndex(PROCESS_MODE_MULTIPLE_CLIENTS) self.sb_engine_max_params.setValue(200) self.ch_engine_prefer_bridges.setChecked(True) diff --git a/src/ui/carla.ui b/src/ui/carla.ui index c0183e1..a7dcf46 100644 --- a/src/ui/carla.ui +++ b/src/ui/carla.ui @@ -51,7 +51,7 @@ 0 0 710 - 19 + 22 @@ -88,7 +88,17 @@ + + + &Engine + + + + + + + @@ -118,6 +128,10 @@ + + + + @@ -211,6 +225,36 @@ Configure Carla + + + + :/16x16/media-playback-start.png:/16x16/media-playback-start.png + + + &Start + + + + + + :/16x16/media-playback-stop.png:/16x16/media-playback-stop.png + + + St&op + + + + + false + + + + :/16x16/configure.png:/16x16/configure.png + + + Configure Driver + + diff --git a/src/ui/settings_app.ui b/src/ui/settings_app.ui index a21f33f..a6e65d1 100644 --- a/src/ui/settings_app.ui +++ b/src/ui/settings_app.ui @@ -7,7 +7,7 @@ 0 0 600 - 449 + 465 @@ -203,7 +203,7 @@ 0 - 0 + 3 @@ -309,7 +309,7 @@ - Use System Tray (App-Indicator and KDE support) + Use System Tray (App-Indicator support) @@ -799,13 +799,7 @@ - - - - JACK - - - + @@ -900,7 +894,7 @@ How much time to wait for OSC GUIs to ping back the host - OSC GUI Timeout: + OSC UI Timeout: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter