diff --git a/source/backend/plugin/Lv2Plugin.cpp b/source/backend/plugin/Lv2Plugin.cpp index 560c13e0f..debc8ba34 100644 --- a/source/backend/plugin/Lv2Plugin.cpp +++ b/source/backend/plugin/Lv2Plugin.cpp @@ -103,7 +103,7 @@ const uint32_t CARLA_URI_MAP_ID_TIME_FRAMES_PER_SECOND = 36; const uint32_t CARLA_URI_MAP_ID_TIME_SPEED = 37; const uint32_t CARLA_URI_MAP_ID_MIDI_EVENT = 38; const uint32_t CARLA_URI_MAP_ID_PARAM_SAMPLE_RATE = 39; -const uint32_t CARLA_URI_MAP_ID_COUNT = 40; +const uint32_t CARLA_URI_MAP_ID_COUNT = 39; // FIXME later // LV2 Feature Ids const uint32_t kFeatureIdBufSizeBounded = 0; @@ -1222,6 +1222,7 @@ public: Lv2AtomQueue tmpQueue; tmpQueue.copyAndDumpDataFromQueue(fAtomQueueOut, dumpBuf); + CARLA_SAFE_ASSERT(! tmpQueue.isEmpty()); uint32_t portIndex; const LV2_Atom* atom; @@ -1229,8 +1230,6 @@ public: for (; tmpQueue.get(&atom, &portIndex);) { - carla_stdout("OUTPUT message IN GUI REMOVED FROM BUFFER"); - if (atom->type == CARLA_URI_MAP_ID_ATOM_WORKER) { CARLA_SAFE_ASSERT_CONTINUE(fExt.worker != nullptr && fExt.worker->work != nullptr); @@ -1295,6 +1294,8 @@ public: aIns = aOuts = cvIns = cvOuts = params = 0; LinkedList evIns, evOuts; + const uint32_t eventBufferSize(static_cast(fLv2Options.sequenceSize)); + bool forcedStereoIn, forcedStereoOut; forcedStereoIn = forcedStereoOut = false; @@ -1393,9 +1394,6 @@ public: FLOAT_CLEAR(fParamBuffers, params); } - const uint32_t eventBufferSize(MAX_DEFAULT_BUFFER_SIZE); - fLv2Options.sequenceSize = static_cast(eventBufferSize); - if (const uint32_t count = static_cast(evIns.count())) { fEventsIn.createNew(count); @@ -4183,6 +4181,21 @@ public: fLv2Options.maxBufferSize = static_cast(pData->engine->getBufferSize()); fLv2Options.sampleRate = pData->engine->getSampleRate(); + uint32_t eventBufferSize = MAX_DEFAULT_BUFFER_SIZE; + + for (uint32_t j=0; j < fRdfDescriptor->PortCount; ++j) + { + const LV2_Property portTypes(fRdfDescriptor->Ports[j].Types); + + if (LV2_IS_PORT_ATOM_SEQUENCE(portTypes) || LV2_IS_PORT_EVENT(portTypes) || LV2_IS_PORT_MIDI_LL(portTypes)) + { + if (fRdfDescriptor->Ports[j].MinimumSize > eventBufferSize) + eventBufferSize = fRdfDescriptor->Ports[j].MinimumSize; + } + } + + fLv2Options.sequenceSize = static_cast(eventBufferSize); + // --------------------------------------------------------------- // initialize features (part 1) @@ -4271,7 +4284,8 @@ public: fFeatures[kFeatureIdPrograms]->URI = LV2_PROGRAMS__Host; fFeatures[kFeatureIdPrograms]->data = programsFt; - //kFeatureIdResizePort + fFeatures[kFeatureIdResizePort]->URI = LV2_RESIZE_PORT__resize; + fFeatures[kFeatureIdResizePort]->data = rsPortFt; fFeatures[kFeatureIdRtMemPool]->URI = LV2_RTSAFE_MEMORY_POOL__Pool; fFeatures[kFeatureIdRtMemPool]->data = rtMemPoolFt; diff --git a/source/modules/lv2_rdf.hpp b/source/modules/lv2_rdf.hpp index 5705e538d..9f95b971f 100644 --- a/source/modules/lv2_rdf.hpp +++ b/source/modules/lv2_rdf.hpp @@ -388,6 +388,8 @@ struct LV2_RDF_Port { LV2_RDF_PortPoints Points; LV2_RDF_PortUnit Unit; + uint32_t MinimumSize; + uint32_t ScalePointCount; LV2_RDF_PortScalePoint* ScalePoints; @@ -397,6 +399,7 @@ struct LV2_RDF_Port { Designation(0), Name(nullptr), Symbol(nullptr), + MinimumSize(0), ScalePointCount(0), ScalePoints(nullptr) {} diff --git a/source/utils/CarlaLv2Utils.hpp b/source/utils/CarlaLv2Utils.hpp index cc317699b..547069539 100644 --- a/source/utils/CarlaLv2Utils.hpp +++ b/source/utils/CarlaLv2Utils.hpp @@ -61,7 +61,7 @@ #include "lilv/lilvmm.hpp" #include "sratom/sratom.h" -//#include +#include // ----------------------------------------------------------------------- // Define namespaces and missing prefixes @@ -197,6 +197,9 @@ public: Lilv::Node value_minimum; Lilv::Node value_maximum; + Lilv::Node rz_asLargeAs; + Lilv::Node rz_minSize; + // Port Data Types Lilv::Node midi_event; Lilv::Node patch_message; @@ -312,6 +315,9 @@ public: value_minimum (new_uri(LV2_CORE__minimum)), value_maximum (new_uri(LV2_CORE__maximum)), + rz_asLargeAs (new_uri(LV2_RESIZE_PORT__asLargeAs)), + rz_minSize (new_uri(LV2_RESIZE_PORT__minimumSize)), + midi_event (new_uri(LV2_MIDI__MidiEvent)), patch_message (new_uri(LV2_PATCH__Message)), time_position (new_uri(LV2_TIME__Position)), @@ -522,7 +528,6 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool /*fillPreset } } -#if 0 // ------------------------------------------------------------------- // Set Plugin UniqueID { @@ -549,7 +554,6 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool /*fillPreset } } } -#endif // ------------------------------------------------------------------- // Set Plugin Ports @@ -966,6 +970,22 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool /*fillPreset } } + // ----------------------------------------------------------- + // Set Port Minimum Size + { + Lilv::Nodes minimumSizeNodes(lilvPort.get_value(lv2World.rz_minSize)); + + if (minimumSizeNodes.size() > 0) + { + const int minimumSize(minimumSizeNodes.get_first().as_int()); + + if (minimumSize > 0) + rdfPort->MinimumSize = static_cast(minimumSize); + else + carla_safe_assert_int("minimumSize > 0", __FILE__, __LINE__, minimumSize); + } + } + // ----------------------------------------------------------- // Set Port Scale Points diff --git a/source/utils/Lv2AtomQueue.hpp b/source/utils/Lv2AtomQueue.hpp index 610a7f577..c022b46ad 100644 --- a/source/utils/Lv2AtomQueue.hpp +++ b/source/utils/Lv2AtomQueue.hpp @@ -29,7 +29,8 @@ class Lv2AtomRingBufferControl : public RingBufferControlTemplate