Browse Source

Carla: Support drivers other than JACK, misc fixing

tags/v0.9.0
falkTX 13 years ago
parent
commit
0aa6d6e292
21 changed files with 487 additions and 334 deletions
  1. +41
    -31
      c++/carla-backend/carla_backend.h
  2. +4
    -3
      c++/carla-backend/carla_backend_standalone.cpp
  3. +2
    -2
      c++/carla-backend/carla_bridge.cpp
  4. +35
    -32
      c++/carla-backend/carla_engine.cpp
  5. +8
    -8
      c++/carla-backend/carla_engine_jack.cpp
  6. +1
    -1
      c++/carla-backend/carla_engine_rtaudio.cpp
  7. +5
    -5
      c++/carla-backend/carla_plugin.h
  8. +47
    -33
      c++/carla-backend/carla_shared.cpp
  9. +22
    -14
      c++/carla-backend/carla_shared.h
  10. +10
    -8
      c++/carla-backend/carla_threads.h
  11. +7
    -7
      c++/carla-backend/dssi.cpp
  12. +5
    -5
      c++/carla-backend/fluidsynth.cpp
  13. +5
    -5
      c++/carla-backend/ladspa.cpp
  14. +3
    -3
      c++/carla-backend/linuxsampler.cpp
  15. +9
    -9
      c++/carla-backend/lv2.cpp
  16. +7
    -7
      c++/carla-backend/vst.cpp
  17. +178
    -120
      src/carla.py
  18. +23
    -21
      src/shared_carla.py
  19. +25
    -8
      src/shared_settings.py
  20. +45
    -1
      src/ui/carla.ui
  21. +5
    -11
      src/ui/settings_app.ui

+ 41
- 31
c++/carla-backend/carla_backend.h View File

@@ -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
};

/*!


+ 4
- 3
c++/carla-backend/carla_backend_standalone.cpp View File

@@ -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;
}



+ 2
- 2
c++/carla-backend/carla_bridge.cpp View File

@@ -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)))
{


+ 35
- 32
c++/carla-backend/carla_engine.cpp View File

@@ -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;


+ 8
- 8
c++/carla-backend/carla_engine_jack.cpp View File

@@ -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];


+ 1
- 1
c++/carla-backend/carla_engine_rtaudio.cpp View File

@@ -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];


+ 5
- 5
c++/carla-backend/carla_plugin.h View File

@@ -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)
{


+ 47
- 33
c++/carla-backend/carla_shared.cpp View File

@@ -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



+ 22
- 14
c++/carla-backend/carla_shared.h View File

@@ -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),


+ 10
- 8
c++/carla-backend/carla_threads.h View File

@@ -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;
};

// --------------------------------------------------------------------------------------------------------


+ 7
- 7
c++/carla-backend/dssi.cpp View File

@@ -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();


+ 5
- 5
c++/carla-backend/fluidsynth.cpp View File

@@ -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");


+ 5
- 5
c++/carla-backend/ladspa.cpp View File

@@ -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();


+ 3
- 3
c++/carla-backend/linuxsampler.cpp View File

@@ -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");


+ 9
- 9
c++/carla-backend/lv2.cpp View File

@@ -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();


+ 7
- 7
c++/carla-backend/vst.cpp View File

@@ -371,7 +371,7 @@ public:
for (j=0; j<ains; j++)
{
#ifndef BUILD_BRIDGE
if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS)
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
sprintf(portName, "%s:input_%02i", m_name, j+1);
else
#endif
@@ -384,7 +384,7 @@ public:
for (j=0; j<aouts; j++)
{
#ifndef BUILD_BRIDGE
if (carlaOptions.process_mode != PROCESS_MODE_MULTIPLE_CLIENTS)
if (carlaOptions.processMode != PROCESS_MODE_MULTIPLE_CLIENTS)
sprintf(portName, "%s:output_%02i", m_name, j+1);
else
#endif
@@ -512,7 +512,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");
@@ -527,7 +527,7 @@ public:
if (mins == 1)
{
#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");
@@ -542,7 +542,7 @@ public:
if (mouts == 1)
{
#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-out");
@@ -1391,7 +1391,7 @@ public:
#ifdef BUILD_BRIDGE
return MAX_PARAMETERS;
#else
return carlaOptions.max_parameters;
return carlaOptions.maxParameters;
#endif

case audioMasterGetParameterQuantization:
@@ -1807,7 +1807,7 @@ CarlaPlugin* CarlaPlugin::newVST(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();


+ 178
- 120
src/carla.py View File

@@ -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)

+ 23
- 21
src/shared_carla.py View File

@@ -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


+ 25
- 8
src/shared_settings.py View File

@@ -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)


+ 45
- 1
src/ui/carla.ui View File

@@ -51,7 +51,7 @@
<x>0</x>
<y>0</y>
<width>710</width>
<height>19</height>
<height>22</height>
</rect>
</property>
<widget class="QMenu" name="menu_File">
@@ -88,7 +88,17 @@
<addaction name="separator"/>
<addaction name="act_settings_configure"/>
</widget>
<widget class="QMenu" name="menu_Engine">
<property name="title">
<string>&amp;Engine</string>
</property>
<addaction name="act_engine_start"/>
<addaction name="act_engine_stop"/>
<addaction name="separator"/>
<addaction name="act_engine_configure"/>
</widget>
<addaction name="menu_File"/>
<addaction name="menu_Engine"/>
<addaction name="menu_Plugin"/>
<addaction name="menu_Settings"/>
<addaction name="menu_Help"/>
@@ -118,6 +128,10 @@
<addaction name="act_file_save"/>
<addaction name="act_file_save_as"/>
<addaction name="separator"/>
<addaction name="act_engine_start"/>
<addaction name="act_engine_stop"/>
<addaction name="act_engine_configure"/>
<addaction name="separator"/>
<addaction name="act_plugin_add"/>
<addaction name="act_plugin_remove_all"/>
</widget>
@@ -211,6 +225,36 @@
<string>Configure Carla</string>
</property>
</action>
<action name="act_engine_start">
<property name="icon">
<iconset resource="../../resources/resources.qrc">
<normaloff>:/16x16/media-playback-start.png</normaloff>:/16x16/media-playback-start.png</iconset>
</property>
<property name="text">
<string>&amp;Start</string>
</property>
</action>
<action name="act_engine_stop">
<property name="icon">
<iconset resource="../../resources/resources.qrc">
<normaloff>:/16x16/media-playback-stop.png</normaloff>:/16x16/media-playback-stop.png</iconset>
</property>
<property name="text">
<string>St&amp;op</string>
</property>
</action>
<action name="act_engine_configure">
<property name="enabled">
<bool>false</bool>
</property>
<property name="icon">
<iconset resource="../../resources/resources.qrc">
<normaloff>:/16x16/configure.png</normaloff>:/16x16/configure.png</iconset>
</property>
<property name="text">
<string>Configure Driver</string>
</property>
</action>
</widget>
<resources>
<include location="../../resources/resources.qrc"/>


+ 5
- 11
src/ui/settings_app.ui View File

@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>600</width>
<height>449</height>
<height>465</height>
</rect>
</property>
<property name="minimumSize">
@@ -203,7 +203,7 @@
<number>0</number>
</property>
<property name="currentIndex">
<number>0</number>
<number>3</number>
</property>
<widget class="QWidget" name="page_main">
<layout class="QVBoxLayout" name="verticalLayout_5">
@@ -309,7 +309,7 @@
<item row="0" column="0">
<widget class="QCheckBox" name="cb_tray_enable">
<property name="text">
<string>Use System Tray (App-Indicator and KDE support)</string>
<string>Use System Tray (App-Indicator support)</string>
</property>
</widget>
</item>
@@ -799,13 +799,7 @@
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="cb_engine_audio_driver">
<item>
<property name="text">
<string>JACK</string>
</property>
</item>
</widget>
<widget class="QComboBox" name="cb_engine_audio_driver"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_20">
@@ -900,7 +894,7 @@
<string>How much time to wait for OSC GUIs to ping back the host</string>
</property>
<property name="text">
<string>OSC GUI Timeout:</string>
<string>OSC UI Timeout:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>


Loading…
Cancel
Save