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 + + + + + + + + + 0 0 - 679 + 688 19 @@ -474,6 +628,14 @@ + + + CanvasPreviewFrame + QFrame +
canvaspreviewframe.h
+ 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)