diff --git a/resources/ui/carla_host.ui b/resources/ui/carla_host.ui
index 8b960a5f6..ab3af9265 100644
--- a/resources/ui/carla_host.ui
+++ b/resources/ui/carla_host.ui
@@ -6,20 +6,174 @@
0
0
- 679
- 191
+ 688
+ 355
MainWindow
-
+
+
+
+ 0
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+
+ 0
+ 0
+
+
+
+
+
+
+ 1
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 210
+ 0
+
+
+
+ false
+
+
+ QTabWidget::East
+
+
+ 0
+
+
+
+ false
+
+
+ Disk
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 1
+
+
-
+
+
-
+
+
-
+
+ Home
+
+
+
+
+ -
+
+
+
+
+
+
+ :/16x16/list-add.png:/16x16/list-add.png
+
+
+
+ -
+
+
+ false
+
+
+
+
+
+
+ :/16x16/list-remove.png:/16x16/list-remove.png
+
+
+
+
+
+ -
+
+
+ QAbstractItemView::NoEditTriggers
+
+
+ true
+
+
+ QAbstractItemView::DragDrop
+
+
+
+
+
+
+
+ -
+
+
+
+ 210
+ 162
+
+
+
+
+ 210
+ 162
+
+
+
+ false
+
+
+ QFrame::StyledPanel
+
+
+ QFrame::Sunken
+
+
+
+
+
+
+
+
+
+
+
+ CanvasPreviewFrame
+ QFrame
+
+ 1
+
+
diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp
index bd6a74887..ec90f92f4 100644
--- a/source/backend/engine/CarlaEngine.cpp
+++ b/source/backend/engine/CarlaEngine.cpp
@@ -1059,7 +1059,7 @@ const char* CarlaEngine::getUniquePluginName(const char* const name)
bool CarlaEngine::loadFilename(const char* const filename)
{
- CARLA_ASSERT(filename != nullptr);
+ CARLA_ASSERT(filename != nullptr && filename[0] != '\0');
carla_debug("CarlaEngine::loadFilename(\"%s\")", filename);
using namespace juce;
@@ -1073,7 +1073,10 @@ bool CarlaEngine::loadFilename(const char* const filename)
}
CarlaString baseName(file.getFileNameWithoutExtension().toRawUTF8());
- CarlaString extension(file.getFileExtension().toRawUTF8());
+ CarlaString extension(file.getFileExtension().toRawUTF8()+1);
+ extension.toLower();
+
+ carla_stdout("loadFilename with extension %s", (const char*)extension);
// -------------------------------------------------------------------
@@ -1190,7 +1193,7 @@ bool charEndsWith(const char* const str, const char* const suffix)
bool CarlaEngine::loadProject(const char* const filename)
{
- CARLA_ASSERT(filename != nullptr);
+ CARLA_ASSERT(filename != nullptr && filename[0] != '\0');
carla_debug("CarlaEngine::loadProject(\"%s\")", filename);
using namespace juce;
@@ -1260,7 +1263,7 @@ bool CarlaEngine::loadProject(const char* const filename)
bool CarlaEngine::saveProject(const char* const filename)
{
- CARLA_ASSERT(filename != nullptr);
+ CARLA_ASSERT(filename != nullptr && filename[0] != '\0');
carla_debug("CarlaEngine::saveProject(\"%s\")", filename);
using namespace juce;
@@ -1694,11 +1697,20 @@ void setValueIfHigher(float& value, const float& compare)
value = compare;
}
-void CarlaEngine::processRack(float* inBuf[2], float* outBuf[2], const uint32_t frames)
+void CarlaEngine::processRack(float* inBufReal[2], float* outBuf[2], const uint32_t frames)
{
CARLA_ASSERT(pData->bufEvents.in != nullptr);
CARLA_ASSERT(pData->bufEvents.out != nullptr);
+ // safe copy
+ float inBuf0[frames];
+ float inBuf1[frames];
+ float* inBuf[2] = { inBuf0, inBuf1 };
+
+ // initialize inputs
+ carla_copyFloat(inBuf0, inBufReal[0], frames);
+ carla_copyFloat(inBuf1, inBufReal[1], frames);
+
// initialize outputs (zero)
carla_zeroFloat(outBuf[0], frames);
carla_zeroFloat(outBuf[1], frames);
@@ -1706,6 +1718,9 @@ void CarlaEngine::processRack(float* inBuf[2], float* outBuf[2], const uint32_t
bool processed = false;
+ uint32_t oldAudioInCount = 0;
+ uint32_t oldMidiOutCount = 0;
+
// process plugins
for (unsigned int i=0; i < pData->curPluginCount; ++i)
{
@@ -1716,9 +1731,10 @@ void CarlaEngine::processRack(float* inBuf[2], float* outBuf[2], const uint32_t
if (processed)
{
+
// initialize inputs (from previous outputs)
- carla_copyFloat(inBuf[0], outBuf[0], frames);
- carla_copyFloat(inBuf[1], outBuf[1], frames);
+ carla_copyFloat(inBuf0, outBuf[0], frames);
+ carla_copyFloat(inBuf1, outBuf[1], frames);
std::memcpy(pData->bufEvents.in, pData->bufEvents.out, sizeof(EngineEvent)*kEngineMaxInternalEventCount);
// initialize outputs (zero)
@@ -1727,26 +1743,35 @@ void CarlaEngine::processRack(float* inBuf[2], float* outBuf[2], const uint32_t
carla_zeroMem(pData->bufEvents.out, sizeof(EngineEvent)*kEngineMaxInternalEventCount);
}
+ oldAudioInCount = plugin->getAudioInCount();
+ oldMidiOutCount = plugin->getMidiOutCount();
+
+ // if plugin has no audio inputs, add input buffer
+ //if (oldAudioInCount == 0)
+ {
+ carla_addFloat(outBuf[0], inBuf0, frames);
+ carla_addFloat(outBuf[1], inBuf1, frames);
+ }
+
+ // if plugin has no midi out, add previous events
+ if (oldMidiOutCount == 0 && pData->bufEvents.in[0].type != CarlaBackend::kEngineEventTypeNull)
+ {
+ if (pData->bufEvents.out[0].type != CarlaBackend::kEngineEventTypeNull)
+ {
+ // TODO: carefully add to output, sorted events
+ }
+ else
+ {
+ // nothing in output, can be replaced directly
+ std::memcpy(pData->bufEvents.out, pData->bufEvents.in, sizeof(EngineEvent)*kEngineMaxInternalEventCount);
+ }
+ }
+
// process
plugin->initBuffers();
plugin->process(inBuf, outBuf, frames);
plugin->unlock();
- // if plugin has no audio inputs, add previous buffers
- if (plugin->getAudioInCount() == 0)
- {
- carla_addFloat(outBuf[0], inBuf[0], frames);
- carla_addFloat(outBuf[1], inBuf[1], frames);
- }
- // if plugin has no midi output, add previous events
- if (plugin->getMidiOutCount() == 0)
- {
- //for (uint32_t j=0, k=0; j < frames; ++j)
- //{
- //}
- std::memcpy(pData->bufEvents.out, pData->bufEvents.in, sizeof(EngineEvent)*kEngineMaxInternalEventCount);
- }
-
// set peaks
{
float inPeak1 = 0.0f;
@@ -1756,8 +1781,8 @@ void CarlaEngine::processRack(float* inBuf[2], float* outBuf[2], const uint32_t
for (uint32_t k=0; k < frames; ++k)
{
- setValueIfHigher(inPeak1, std::fabs(inBuf[0][k]));
- setValueIfHigher(inPeak2, std::fabs(inBuf[1][k]));
+ setValueIfHigher(inPeak1, std::fabs(inBuf0[k]));
+ setValueIfHigher(inPeak2, std::fabs(inBuf1[k]));
setValueIfHigher(outPeak1, std::fabs(outBuf[0][k]));
setValueIfHigher(outPeak2, std::fabs(outBuf[1][k]));
}
diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp
index 741792cd5..7717b1eee 100644
--- a/source/backend/plugin/CarlaPlugin.cpp
+++ b/source/backend/plugin/CarlaPlugin.cpp
@@ -816,7 +816,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState)
bool CarlaPlugin::saveStateToFile(const char* const filename)
{
- CARLA_SAFE_ASSERT_RETURN(filename != nullptr, false);
+ CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false);
carla_debug("CarlaPlugin::saveStateToFile(\"%s\")", filename);
File file(filename);
@@ -836,7 +836,7 @@ bool CarlaPlugin::saveStateToFile(const char* const filename)
bool CarlaPlugin::loadStateFromFile(const char* const filename)
{
- CARLA_SAFE_ASSERT_RETURN(filename != nullptr, false);
+ CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false);
carla_debug("CarlaPlugin::loadStateFromFile(\"%s\")", filename);
File file(filename);
diff --git a/source/backend/plugin/CarlaPluginInternal.hpp b/source/backend/plugin/CarlaPluginInternal.hpp
index 46ff5584a..7271e8c31 100644
--- a/source/backend/plugin/CarlaPluginInternal.hpp
+++ b/source/backend/plugin/CarlaPluginInternal.hpp
@@ -659,9 +659,11 @@ struct CarlaPluginProtectedData {
if (client != nullptr)
{
if (client->isActive())
- client->deactivate();
- else
+ {
+ // must not happen
carla_assert("client->isActive()", __FILE__, __LINE__);
+ client->deactivate();
+ }
clearBuffers();
diff --git a/source/backend/plugin/NativePlugin.cpp b/source/backend/plugin/NativePlugin.cpp
index 04a25e219..e2b2648dd 100644
--- a/source/backend/plugin/NativePlugin.cpp
+++ b/source/backend/plugin/NativePlugin.cpp
@@ -313,7 +313,7 @@ public:
PluginCategory getCategory() const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, PLUGIN_CATEGORY_NONE);
return static_cast(fDescriptor->category);
}
@@ -333,16 +333,15 @@ public:
uint32_t getParameterScalePointCount(const uint32_t parameterId) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
- CARLA_ASSERT(parameterId < pData->param.count);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, 0);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr, 0);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, 0);
+ CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, 0);
- if (fDescriptor->get_parameter_info != nullptr && parameterId < pData->param.count)
- {
- if (const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId))
- return param->scalePointCount;
- }
+ if (const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId))
+ return param->scalePointCount;
+ carla_assert("const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)", __FILE__, __LINE__);
return 0;
}
@@ -356,10 +355,7 @@ public:
unsigned int getAvailableOptions() const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
-
- if (fDescriptor == nullptr)
- return 0x0;
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, 0x0);
const bool hasMidiProgs(fDescriptor->get_midi_program_count != nullptr && fDescriptor->get_midi_program_count(fHandle) > 0);
@@ -395,38 +391,35 @@ public:
float getParameterValue(const uint32_t parameterId) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
- CARLA_ASSERT(parameterId < pData->param.count);
-
- if (fDescriptor->get_parameter_value != nullptr && parameterId < pData->param.count)
- return fDescriptor->get_parameter_value(fHandle, parameterId);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, 0.0f);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_value != nullptr, 0.0f);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, 0.0f);
+ CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, 0.0f);
- return 0.0f;
+ return fDescriptor->get_parameter_value(fHandle, parameterId);
}
float getParameterScalePointValue(const uint32_t parameterId, const uint32_t scalePointId) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
- CARLA_ASSERT(parameterId < pData->param.count);
- CARLA_ASSERT(scalePointId < getParameterScalePointCount(parameterId));
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr, 0.0f);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr, 0.0f);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, 0.0f);
+ CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, 0.0f);
+ CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId), 0.0f);
- if (fDescriptor->get_parameter_info != nullptr && parameterId < pData->param.count)
+ if (const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId))
{
- if (const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId))
- {
- const ParameterScalePoint& scalePoint(param->scalePoints[scalePointId]);
- return scalePoint.value;
- }
+ const ParameterScalePoint& scalePoint(param->scalePoints[scalePointId]);
+ return scalePoint.value;
}
+ carla_assert("const Parameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)", __FILE__, __LINE__);
return 0.0f;
}
void getLabel(char* const strBuf) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
if (fDescriptor->label != nullptr)
std::strncpy(strBuf, fDescriptor->label, STR_MAX);
@@ -436,7 +429,7 @@ public:
void getMaker(char* const strBuf) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
if (fDescriptor->maker != nullptr)
std::strncpy(strBuf, fDescriptor->maker, STR_MAX);
@@ -446,7 +439,7 @@ public:
void getCopyright(char* const strBuf) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
if (fDescriptor->copyright != nullptr)
std::strncpy(strBuf, fDescriptor->copyright, STR_MAX);
@@ -456,7 +449,7 @@ public:
void getRealName(char* const strBuf) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
if (fDescriptor->name != nullptr)
std::strncpy(strBuf, fDescriptor->name, STR_MAX);
@@ -466,7 +459,7 @@ public:
void getParameterName(const uint32_t parameterId, char* const strBuf) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
CARLA_ASSERT(fHandle != nullptr);
CARLA_ASSERT(parameterId < pData->param.count);
@@ -486,7 +479,7 @@ public:
void getParameterText(const uint32_t parameterId, char* const strBuf) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
CARLA_ASSERT(fHandle != nullptr);
CARLA_ASSERT(parameterId < pData->param.count);
@@ -506,7 +499,7 @@ public:
void getParameterUnit(const uint32_t parameterId, char* const strBuf) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
CARLA_ASSERT(fHandle != nullptr);
CARLA_ASSERT(parameterId < pData->param.count);
@@ -526,7 +519,7 @@ public:
void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const override
{
- CARLA_ASSERT(fDescriptor != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
CARLA_ASSERT(fHandle != nullptr);
CARLA_ASSERT(parameterId < pData->param.count);
CARLA_ASSERT(scalePointId < getParameterScalePointCount(parameterId));
@@ -553,10 +546,10 @@ public:
void prepareForSave() override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
- if (pData->midiprog.count > 0 /*&& (fHints & PLUGIN_IS_SYNTH) != 0*/) // TODO
+ if (pData->midiprog.count > 0 && fDescriptor->category == ::PLUGIN_CATEGORY_SYNTH)
{
char strBuf[STR_MAX+1];
std::snprintf(strBuf, STR_MAX, "%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i:%i",
@@ -584,8 +577,9 @@ public:
void setName(const char* const newName) override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(newName != nullptr && newName[0] != '\0',);
char uiName[std::strlen(newName)+6+1];
std::strcpy(uiName, newName);
@@ -595,7 +589,7 @@ public:
delete[] fHost.uiName;
fHost.uiName = carla_strdup(uiName);
- if (fDescriptor != nullptr && fDescriptor->dispatcher != nullptr)
+ if (fDescriptor->dispatcher != nullptr)
fDescriptor->dispatcher(fHandle, PLUGIN_OPCODE_UI_NAME_CHANGED, 0, 0, uiName, 0.0f);
CarlaPlugin::setName(newName);
@@ -614,8 +608,8 @@ public:
void setParameterValue(const uint32_t parameterId, const float value, const bool sendGui, const bool sendOsc, const bool sendCallback) override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
CARLA_ASSERT(parameterId < pData->param.count);
const float fixedValue(pData->param.getFixedValue(parameterId, value));
@@ -633,8 +627,8 @@ public:
void setCustomData(const char* const type, const char* const key, const char* const value, const bool sendGui) override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
CARLA_ASSERT(type != nullptr);
CARLA_ASSERT(key != nullptr);
CARLA_ASSERT(value != nullptr);
@@ -720,8 +714,8 @@ public:
void setMidiProgram(int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback) override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
CARLA_ASSERT(index >= -1 && index < static_cast(pData->midiprog.count));
if (index < -1)
@@ -757,8 +751,8 @@ public:
void showGui(const bool yesNo) override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
if (fDescriptor->ui_show == nullptr)
return;
@@ -799,8 +793,8 @@ public:
void idleGui() override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
if (fIsUiVisible && fDescriptor->ui_idle != nullptr)
fDescriptor->ui_idle(fHandle);
@@ -812,16 +806,9 @@ public:
void reload() override
{
carla_debug("NativePlugin::reload() - start");
- CARLA_ASSERT(pData->engine != nullptr);
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
-
- if (pData->engine == nullptr)
- return;
- if (fDescriptor == nullptr)
- return;
- if (fHandle == nullptr)
- return;
+ CARLA_SAFE_ASSERT_RETURN(pData->engine != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
const ProcessMode processMode(pData->engine->getProccessMode());
@@ -1294,8 +1281,8 @@ public:
void activate() override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
if (fDescriptor->activate != nullptr)
{
@@ -1308,8 +1295,8 @@ public:
void deactivate() override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
if (fDescriptor->deactivate != nullptr)
{
@@ -2034,8 +2021,8 @@ public:
void uiParameterChange(const uint32_t index, const float value) override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
CARLA_ASSERT(index < pData->param.count);
if (! fIsUiVisible)
@@ -2051,8 +2038,8 @@ public:
void uiMidiProgramChange(const uint32_t index) override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
CARLA_ASSERT(index < pData->midiprog.count);
if (! fIsUiVisible)
@@ -2068,8 +2055,8 @@ public:
void uiNoteOn(const uint8_t channel, const uint8_t note, const uint8_t velo) override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
CARLA_ASSERT(note < MAX_MIDI_NOTE);
CARLA_ASSERT(velo > 0 && velo < MAX_MIDI_VALUE);
@@ -2090,8 +2077,8 @@ public:
void uiNoteOff(const uint8_t channel, const uint8_t note) override
{
- CARLA_ASSERT(fDescriptor != nullptr);
- CARLA_ASSERT(fHandle != nullptr);
+ CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,);
+ CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,);
CARLA_ASSERT(channel < MAX_MIDI_CHANNELS);
CARLA_ASSERT(note < MAX_MIDI_NOTE);
@@ -2110,24 +2097,24 @@ public:
// -------------------------------------------------------------------
protected:
- uint32_t handleGetBufferSize()
+ uint32_t handleGetBufferSize() const
{
return pData->engine->getBufferSize();
}
- double handleGetSampleRate()
+ double handleGetSampleRate() const
{
return pData->engine->getSampleRate();
}
- bool handleIsOffline()
+ bool handleIsOffline() const
{
return pData->engine->isOffline();
}
- const ::TimeInfo* handleGetTimeInfo()
+ const ::TimeInfo* handleGetTimeInfo() const
{
- CARLA_ASSERT(fIsProcessing);
+ CARLA_SAFE_ASSERT_RETURN(fIsProcessing, nullptr);
return &fTimeInfo;
}
@@ -2296,10 +2283,6 @@ public:
bool init(const char* const name, const char* const label)
{
- CARLA_ASSERT(pData->engine != nullptr);
- CARLA_ASSERT(pData->client == nullptr);
- CARLA_ASSERT(label != nullptr);
-
// ---------------------------------------------------------------
// first checks
@@ -2314,7 +2297,7 @@ public:
return false;
}
- if (label == nullptr)
+ if (label == nullptr && label[0] != '\0')
{
pData->engine->setLastError("null label");
return false;
@@ -2327,10 +2310,8 @@ public:
{
fDescriptor = *it;
- CARLA_ASSERT(fDescriptor != nullptr);
+ CARLA_SAFE_ASSERT_BREAK(fDescriptor != nullptr);
- if (fDescriptor == nullptr)
- break;
if (fDescriptor->label != nullptr && std::strcmp(fDescriptor->label, label) == 0)
break;
diff --git a/source/carla-patchbay b/source/carla-patchbay
index 2c3d7a5b8..8a9776956 100755
--- a/source/carla-patchbay
+++ b/source/carla-patchbay
@@ -30,7 +30,7 @@ class CarlaHostW(HostWindow):
HostWindow.__init__(self, parent)
self.fContainer = CarlaPatchbayW(self)
- self.setCentralWidget(self.fContainer)
+ self.setupContainer(True)
# ------------------------------------------------------------------------------------------------------------
# Main
diff --git a/source/carla-rack b/source/carla-rack
index 9e1b2cc86..d9ac629c3 100755
--- a/source/carla-rack
+++ b/source/carla-rack
@@ -30,7 +30,7 @@ class CarlaHostW(HostWindow):
HostWindow.__init__(self, parent)
self.fContainer = CarlaRackW(self)
- self.setCentralWidget(self.fContainer)
+ self.setupContainer(False)
# ------------------------------------------------------------------------------------------------------------
# Main
diff --git a/source/carla.py b/source/carla.py
index 9f82bf1f6..4fa357cac 100755
--- a/source/carla.py
+++ b/source/carla.py
@@ -79,10 +79,6 @@ class CarlaMainW(QMainWindow):
self.fInfoLabel.setText("")
self.fInfoText = ""
- self.fDirModel = QFileSystemModel(self)
- self.fDirModel.setNameFilters(cString(Carla.host.get_supported_file_types()).split(";"))
- self.fDirModel.setRootPath(HOME)
-
if not WINDOWS:
self.fSyntaxLog = LogSyntaxHighlighter(self.ui.pte_log)
self.fSyntaxLog.setDocument(self.ui.pte_log.document())
@@ -93,13 +89,6 @@ class CarlaMainW(QMainWindow):
else:
self.ui.tabMain.removeTab(2)
- self.ui.fileTreeView.setModel(self.fDirModel)
- self.ui.fileTreeView.setRootIndex(self.fDirModel.index(HOME))
- self.ui.fileTreeView.setColumnHidden(1, True)
- self.ui.fileTreeView.setColumnHidden(2, True)
- self.ui.fileTreeView.setColumnHidden(3, True)
- self.ui.fileTreeView.setHeaderHidden(True)
-
self.ui.act_engine_start.setEnabled(False)
self.ui.act_engine_stop.setEnabled(False)
self.ui.act_plugin_remove_all.setEnabled(False)
@@ -189,52 +178,6 @@ class CarlaMainW(QMainWindow):
def slot_splitterMoved(self):
self.updateInfoLabelSize()
- @pyqtSlot(int)
- def slot_diskFolderChanged(self, index):
- if index < 0:
- return
- elif index == 0:
- filename = HOME
- self.ui.b_disk_remove.setEnabled(False)
- else:
- filename = self.ui.cb_disk.itemData(index)
- self.ui.b_disk_remove.setEnabled(True)
-
- self.fDirModel.setRootPath(filename)
- self.ui.fileTreeView.setRootIndex(self.fDirModel.index(filename))
-
- @pyqtSlot()
- def slot_diskFolderAdd(self):
- newPath = QFileDialog.getExistingDirectory(self, self.tr("New Folder"), "", QFileDialog.ShowDirsOnly)
-
- if newPath:
- if newPath[-1] == os.sep:
- newPath = newPath[:-1]
- self.ui.cb_disk.addItem(os.path.basename(newPath), newPath)
- self.ui.cb_disk.setCurrentIndex(self.ui.cb_disk.count()-1)
- self.ui.b_disk_remove.setEnabled(True)
-
- @pyqtSlot()
- def slot_diskFolderRemove(self):
- index = self.ui.cb_disk.currentIndex()
-
- if index <= 0:
- return
-
- self.ui.cb_disk.removeItem(index)
-
- if self.ui.cb_disk.currentIndex() == 0:
- self.ui.b_disk_remove.setEnabled(False)
-
- @pyqtSlot(QModelIndex)
- def slot_fileTreeDoubleClicked(self, modelIndex):
- filename = self.fDirModel.filePath(modelIndex)
-
- if not Carla.host.load_filename(filename):
- CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"),
- self.tr("Failed to load file"),
- cString(Carla.host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok)
-
@pyqtSlot(float, float)
def slot_miniCanvasMoved(self, xp, yp):
self.ui.graphicsView.horizontalScrollBar().setValue(xp * DEFAULT_CANVAS_WIDTH)
diff --git a/source/carla_host.py b/source/carla_host.py
index 501846f34..bc5af7365 100644
--- a/source/carla_host.py
+++ b/source/carla_host.py
@@ -20,12 +20,12 @@
# Imports (Global)
try:
- from PyQt5.QtCore import QTimer
+ from PyQt5.QtCore import QModelIndex, QTimer
from PyQt5.QtGui import QPalette
- from PyQt5.QtWidgets import QApplication, QMainWindow
+ from PyQt5.QtWidgets import QApplication, QFileSystemModel, QMainWindow
except:
- from PyQt4.QtCore import QTimer
- from PyQt4.QtGui import QApplication, QMainWindow, QPalette
+ from PyQt4.QtCore import QModelIndex, QTimer
+ from PyQt4.QtGui import QApplication, QFileSystemModel, QMainWindow, QPalette
# ------------------------------------------------------------------------------------------------------------
# Imports (Custom)
@@ -213,6 +213,20 @@ class HostWindow(QMainWindow):
self.setTransportMenuEnabled(False)
+ # -------------------------------------------------------------
+ # Set up GUI (right panel)
+
+ self.fDirModel = QFileSystemModel(self)
+ self.fDirModel.setNameFilters(cString(Carla.host.get_supported_file_types()).split(";"))
+ self.fDirModel.setRootPath(HOME)
+
+ self.ui.fileTreeView.setModel(self.fDirModel)
+ self.ui.fileTreeView.setRootIndex(self.fDirModel.index(HOME))
+ self.ui.fileTreeView.setColumnHidden(1, True)
+ self.ui.fileTreeView.setColumnHidden(2, True)
+ self.ui.fileTreeView.setColumnHidden(3, True)
+ self.ui.fileTreeView.setHeaderHidden(True)
+
self.setProperWindowTitle()
# -------------------------------------------------------------
@@ -240,10 +254,10 @@ class HostWindow(QMainWindow):
#self.ui.splitter.splitterMoved.connect(self.slot_splitterMoved)
- #self.ui.cb_disk.currentIndexChanged.connect(self.slot_diskFolderChanged)
- #self.ui.b_disk_add.clicked.connect(self.slot_diskFolderAdd)
- #self.ui.b_disk_remove.clicked.connect(self.slot_diskFolderRemove)
- #self.ui.fileTreeView.doubleClicked.connect(self.slot_fileTreeDoubleClicked)
+ self.ui.cb_disk.currentIndexChanged.connect(self.slot_diskFolderChanged)
+ self.ui.b_disk_add.clicked.connect(self.slot_diskFolderAdd)
+ self.ui.b_disk_remove.clicked.connect(self.slot_diskFolderRemove)
+ self.ui.fileTreeView.doubleClicked.connect(self.slot_fileTreeDoubleClicked)
self.DebugCallback.connect(self.slot_handleDebugCallback)
self.PluginAddedCallback.connect(self.slot_handlePluginAddedCallback)
@@ -277,6 +291,20 @@ class HostWindow(QMainWindow):
dialog = CarlaSettingsW(self, hasCanvas, hasCanvasGL)
return dialog.exec_()
+ def setupContainer(self, showMiniCanvas):
+ if showMiniCanvas:
+ CARLA_DEFAULT_CANVAS_WIDTH = 3100
+ CARLA_DEFAULT_CANVAS_HEIGHT = 2400
+ self.ui.miniCanvasPreview.setRealParent(self)
+ #self.ui.miniCanvasPreview.setViewTheme(patchcanvas.canvas.theme.canvas_bg, patchcanvas.canvas.theme.rubberband_brush, patchcanvas.canvas.theme.rubberband_pen.color())
+ self.ui.miniCanvasPreview.init(self.fContainer.scene, CARLA_DEFAULT_CANVAS_WIDTH, CARLA_DEFAULT_CANVAS_HEIGHT, self.fSavedSettings["UseCustomMiniCanvasPaint"])
+ else:
+ self.ui.miniCanvasPreview.hide()
+
+ self.ui.mainwidget.hide()
+ self.ui.splitter.insertWidget(0, self.fContainer)
+ del self.ui.mainwidget
+
# -----------------------------------------------------------------
# Internal stuff (files)
@@ -521,16 +549,16 @@ class HostWindow(QMainWindow):
#if settings.contains("SplitterState"):
#self.ui.splitter.restoreState(settings.value("SplitterState", ""))
#else:
- #self.ui.splitter.setSizes([99999, 210])
+ self.ui.splitter.setSizes([99999, 210])
- #diskFolders = toList(settings.value("DiskFolders", [HOME]))
+ diskFolders = toList(settings.value("DiskFolders", [HOME]))
- #self.ui.cb_disk.setItemData(0, HOME)
+ self.ui.cb_disk.setItemData(0, HOME)
- #for i in range(len(diskFolders)):
- #if i == 0: continue
- #folder = diskFolders[i]
- #self.ui.cb_disk.addItem(os.path.basename(folder), folder)
+ for i in range(len(diskFolders)):
+ if i == 0: continue
+ folder = diskFolders[i]
+ self.ui.cb_disk.addItem(os.path.basename(folder), folder)
if MACOS and not settings.value("Main/UseProTheme", True, type=bool):
self.setUnifiedTitleAndToolBarOnMac(True)
@@ -601,17 +629,17 @@ class HostWindow(QMainWindow):
settings = QSettings()
settings.setValue("Geometry", self.saveGeometry())
- #settings.setValue("SplitterState", self.ui.splitter.saveState())
+ settings.setValue("SplitterState", self.ui.splitter.saveState())
settings.setValue("ShowToolbar", self.ui.toolBar.isVisible())
#settings.setValue("HorizontalScrollBarValue", self.ui.graphicsView.horizontalScrollBar().value())
#settings.setValue("VerticalScrollBarValue", self.ui.graphicsView.verticalScrollBar().value())
- #diskFolders = []
+ diskFolders = []
- #for i in range(self.ui.cb_disk.count()):
- #diskFolders.append(self.ui.cb_disk.itemData(i))
+ for i in range(self.ui.cb_disk.count()):
+ diskFolders.append(self.ui.cb_disk.itemData(i))
- #settings.setValue("DiskFolders", diskFolders)
+ settings.setValue("DiskFolders", diskFolders)
self.fContainer.saveSettings(settings)
@@ -823,6 +851,54 @@ class HostWindow(QMainWindow):
# -----------------------------------------------------------------
+ @pyqtSlot(int)
+ def slot_diskFolderChanged(self, index):
+ if index < 0:
+ return
+ elif index == 0:
+ filename = HOME
+ self.ui.b_disk_remove.setEnabled(False)
+ else:
+ filename = self.ui.cb_disk.itemData(index)
+ self.ui.b_disk_remove.setEnabled(True)
+
+ self.fDirModel.setRootPath(filename)
+ self.ui.fileTreeView.setRootIndex(self.fDirModel.index(filename))
+
+ @pyqtSlot()
+ def slot_diskFolderAdd(self):
+ newPath = QFileDialog.getExistingDirectory(self, self.tr("New Folder"), "", QFileDialog.ShowDirsOnly)
+
+ if newPath:
+ if newPath[-1] == os.sep:
+ newPath = newPath[:-1]
+ self.ui.cb_disk.addItem(os.path.basename(newPath), newPath)
+ self.ui.cb_disk.setCurrentIndex(self.ui.cb_disk.count()-1)
+ self.ui.b_disk_remove.setEnabled(True)
+
+ @pyqtSlot()
+ def slot_diskFolderRemove(self):
+ index = self.ui.cb_disk.currentIndex()
+
+ if index <= 0:
+ return
+
+ self.ui.cb_disk.removeItem(index)
+
+ if self.ui.cb_disk.currentIndex() == 0:
+ self.ui.b_disk_remove.setEnabled(False)
+
+ @pyqtSlot(QModelIndex)
+ def slot_fileTreeDoubleClicked(self, modelIndex):
+ filename = self.fDirModel.filePath(modelIndex)
+
+ if not Carla.host.load_filename(filename):
+ CustomMessageBox(self, QMessageBox.Critical, self.tr("Error"),
+ self.tr("Failed to load file"),
+ cString(Carla.host.get_last_error()), QMessageBox.Ok, QMessageBox.Ok)
+
+ # -----------------------------------------------------------------
+
@pyqtSlot(int, int, int, float, str)
def slot_handleDebugCallback(self, pluginId, value1, value2, value3, valueStr):
print("DEBUG:", pluginId, value1, value2, value3, valueStr)
diff --git a/source/carla_rack.py b/source/carla_rack.py
index 2bc8de967..d278c662a 100644
--- a/source/carla_rack.py
+++ b/source/carla_rack.py
@@ -76,22 +76,22 @@ class CarlaRackW(QListWidget):
#self.setMnimumWidth(800)
self.setSortingEnabled(False)
- app = QApplication.instance()
- pal1 = app.palette().base().color()
- pal2 = app.palette().button().color()
- col1 = "stop:0 rgb(%i, %i, %i)" % (pal1.red(), pal1.green(), pal1.blue())
- col2 = "stop:1 rgb(%i, %i, %i)" % (pal2.red(), pal2.green(), pal2.blue())
-
- self.setStyleSheet("""
- QListWidget {
- background-color: qlineargradient(spread:pad,
- x1:0.0, y1:0.0,
- x2:0.2, y2:1.0,
- %s,
- %s
- );
- }
- """ % (col1, col2))
+ #app = QApplication.instance()
+ #pal1 = app.palette().base().color()
+ #pal2 = app.palette().button().color()
+ #col1 = "stop:0 rgb(%i, %i, %i)" % (pal1.red(), pal1.green(), pal1.blue())
+ #col2 = "stop:1 rgb(%i, %i, %i)" % (pal2.red(), pal2.green(), pal2.blue())
+
+ #self.setStyleSheet("""
+ #QListWidget {
+ #background-color: qlineargradient(spread:pad,
+ #x1:0.0, y1:0.0,
+ #x2:0.2, y2:1.0,
+ #%s,
+ #%s
+ #);
+ #}
+ #""" % (col1, col2))
# -------------------------------------------------------------
# Connect actions to functions
diff --git a/source/includes/CarlaDefines.hpp b/source/includes/CarlaDefines.hpp
index 3edfe2e29..a1f5cf71d 100644
--- a/source/includes/CarlaDefines.hpp
+++ b/source/includes/CarlaDefines.hpp
@@ -136,6 +136,7 @@
#define CARLA_SAFE_ASSERT_INT(cond, value) if (cond) pass(); else carla_assert_int (#cond, __FILE__, __LINE__, value);
#define CARLA_SAFE_ASSERT_INT2(cond, v1, v2) if (cond) pass(); else carla_assert_int2(#cond, __FILE__, __LINE__, v1, v2);
+#define CARLA_SAFE_ASSERT_BREAK(cond) if (cond) pass(); else { carla_assert(#cond, __FILE__, __LINE__); break; }
#define CARLA_SAFE_ASSERT_CONTINUE(cond) if (cond) pass(); else { carla_assert(#cond, __FILE__, __LINE__); continue; }
#define CARLA_SAFE_ASSERT_RETURN(cond, ret) if (cond) pass(); else { carla_assert(#cond, __FILE__, __LINE__); return ret; }
diff --git a/source/modules/distrho/dgl/src/Window.cpp b/source/modules/distrho/dgl/src/Window.cpp
index f6d95b0f5..17bd0ae6f 100644
--- a/source/modules/distrho/dgl/src/Window.cpp
+++ b/source/modules/distrho/dgl/src/Window.cpp
@@ -333,11 +333,11 @@ public:
height = 1;
#ifndef DGL_OS_MAC
- fView->width = width;
- fView->height = height;
-
if (fView->width == (int)width && fView->height == (int)height && ! forced)
return;
+
+ fView->width = width;
+ fView->height = height;
#endif
#if DGL_OS_WINDOWS
diff --git a/source/widgets/canvaspreviewframe.py b/source/widgets/canvaspreviewframe.py
index d8602824b..3d868da44 100644
--- a/source/widgets/canvaspreviewframe.py
+++ b/source/widgets/canvaspreviewframe.py
@@ -99,7 +99,7 @@ class CanvasPreviewFrame(QFrame):
def setViewScale(self, scale):
self.fScale = scale
- QTimer.singleShot(0, self.fRealParent, SLOT("slot_miniCanvasCheckAll()"))
+ #QTimer.singleShot(0, self.fRealParent, SLOT("slot_miniCanvasCheckAll()"))
def setViewSize(self, width, height):
self.fViewRect[iWidth] = width * self.fFakeWidth
@@ -139,7 +139,7 @@ class CanvasPreviewFrame(QFrame):
self.fViewRect[iY] = y + self.fRenderSource.y()
self.update()
- self.emit(SIGNAL("miniCanvasMoved(double, double)"), x * self.fScale / self.fFakeWidth, y * self.fScale / self.fFakeHeight)
+ #self.emit(SIGNAL("miniCanvasMoved(double, double)"), x * self.fScale / self.fFakeWidth, y * self.fScale / self.fFakeHeight)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
@@ -178,7 +178,7 @@ class CanvasPreviewFrame(QFrame):
else:
painter.setBrush(self.fViewBg)
painter.setPen(self.fViewBg)
- painter.drawRoundRect(2, 2, self.width()-6, self.height()-6, 3, 3)
+ painter.drawRoundedRect(2, 2, self.width()-6, self.height()-6, 3, 3)
self.fScene.render(painter, self.fRenderSource, self.fRenderTarget, Qt.KeepAspectRatio)
@@ -201,6 +201,6 @@ class CanvasPreviewFrame(QFrame):
def resizeEvent(self, event):
self.fRenderSource = self.getRenderSource()
- if self.fRealParent:
- QTimer.singleShot(0, self.fRealParent, SLOT("slot_miniCanvasCheckAll()"))
- QFrame.resizeEvent(self, event)
+ #if self.fRealParent:
+ #QTimer.singleShot(0, self.fRealParent, SLOT("slot_miniCanvasCheckAll()"))
+ #QFrame.resizeEvent(self, event)