diff --git a/source/backend/engine/CarlaEngineJack.cpp b/source/backend/engine/CarlaEngineJack.cpp index 00efc6324..6d6f1e9be 100644 --- a/source/backend/engine/CarlaEngineJack.cpp +++ b/source/backend/engine/CarlaEngineJack.cpp @@ -711,11 +711,13 @@ public: uint getMaxClientNameSize() const noexcept override { +#ifndef BUILD_BRIDGE if (pData->options.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT || pData->options.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) +#endif { try { - return static_cast(jackbridge_client_name_size()); - } CARLA_SAFE_EXCEPTION_RETURN("jack_client_name_size", 0); + return static_cast(jackbridge_client_name_size()-1); + } CARLA_SAFE_EXCEPTION_RETURN("jack_client_name_size", 32); } return CarlaEngine::getMaxClientNameSize(); @@ -726,8 +728,8 @@ public: if (pData->options.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT || pData->options.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) { try { - return static_cast(jackbridge_port_name_size()); - } CARLA_SAFE_EXCEPTION_RETURN("jack_port_name_size", 0); + return static_cast(jackbridge_port_name_size()-1); + } CARLA_SAFE_EXCEPTION_RETURN("jack_port_name_size", 255); } return CarlaEngine::getMaxPortNameSize(); @@ -749,10 +751,13 @@ public: carla_zeroStruct(fTransportPos); + CarlaString truncatedClientName(clientName); + truncatedClientName.truncate(getMaxClientNameSize()); + #ifdef BUILD_BRIDGE fIsRunning = true; - if (! pData->init(clientName)) + if (! pData->init(truncatedClientName)) { close(); setLastError("Failed to init internal data"); @@ -762,7 +767,7 @@ public: if (pData->bufferSize == 0 || carla_compareFloats(pData->sampleRate, 0.0)) { // open temp client to get initial buffer-size and sample-rate values - if (jack_client_t* const tmpClient = jackbridge_client_open(clientName, JackNoStartServer, nullptr)) + if (jack_client_t* const tmpClient = jackbridge_client_open(truncatedClientName, JackNoStartServer, nullptr)) { pData->bufferSize = jackbridge_get_buffer_size(tmpClient); pData->sampleRate = jackbridge_get_sample_rate(tmpClient); @@ -779,7 +784,7 @@ public: return true; #else - fClient = jackbridge_client_open(clientName, JackNullOption, nullptr); + fClient = jackbridge_client_open(truncatedClientName, JackNullOption, nullptr); if (fClient == nullptr) { diff --git a/source/backend/engine/CarlaEngineNative.cpp b/source/backend/engine/CarlaEngineNative.cpp index b92f3bf1e..c90373502 100644 --- a/source/backend/engine/CarlaEngineNative.cpp +++ b/source/backend/engine/CarlaEngineNative.cpp @@ -1167,8 +1167,6 @@ protected: hints |= NATIVE_PARAMETER_USES_SAMPLE_RATE; if (paramData.hints & PARAMETER_USES_SCALEPOINTS) hints |= NATIVE_PARAMETER_USES_SCALEPOINTS; - if (paramData.hints & PARAMETER_USES_CUSTOM_TEXT) - hints |= NATIVE_PARAMETER_USES_CUSTOM_TEXT; if (paramData.type == PARAMETER_INPUT || paramData.type == PARAMETER_OUTPUT) { @@ -1208,24 +1206,6 @@ protected: return 0.0f; } - const char* getParameterText(const uint32_t index /*, const float value*/) const - { - if (CarlaPlugin* const plugin = _getFirstPlugin()) - { - if (index < plugin->getParameterCount()) - { - static char strBuf[STR_MAX+1]; - carla_zeroChar(strBuf, STR_MAX+1); - - plugin->getParameterText(index, /*value,*/ strBuf); - - return strBuf; - } - } - - return nullptr; - } - // ------------------------------------------------------------------- // Plugin midi-program calls @@ -1691,11 +1671,6 @@ public: return handlePtr->getParameterValue(index); } - static const char* _get_parameter_text(NativePluginHandle handle, uint32_t index /*, float value*/) - { - return handlePtr->getParameterText(index /*, value*/); - } - static uint32_t _get_midi_program_count(NativePluginHandle handle) { return handlePtr->getMidiProgramCount(); @@ -1843,7 +1818,6 @@ static const NativePluginDescriptor carlaRackDesc = { CarlaEngineNative::_get_parameter_count, CarlaEngineNative::_get_parameter_info, CarlaEngineNative::_get_parameter_value, - CarlaEngineNative::_get_parameter_text, CarlaEngineNative::_get_midi_program_count, CarlaEngineNative::_get_midi_program_info, CarlaEngineNative::_set_parameter_value, @@ -1886,7 +1860,6 @@ static const NativePluginDescriptor carlaPatchbayDesc = { CarlaEngineNative::_get_parameter_count, CarlaEngineNative::_get_parameter_info, CarlaEngineNative::_get_parameter_value, - CarlaEngineNative::_get_parameter_text, CarlaEngineNative::_get_midi_program_count, CarlaEngineNative::_get_midi_program_info, CarlaEngineNative::_set_parameter_value, @@ -1929,7 +1902,6 @@ static const NativePluginDescriptor carlaPatchbay3sDesc = { CarlaEngineNative::_get_parameter_count, CarlaEngineNative::_get_parameter_info, CarlaEngineNative::_get_parameter_value, - CarlaEngineNative::_get_parameter_text, CarlaEngineNative::_get_midi_program_count, CarlaEngineNative::_get_midi_program_info, CarlaEngineNative::_set_parameter_value, @@ -1972,7 +1944,6 @@ static const NativePluginDescriptor carlaPatchbay16Desc = { CarlaEngineNative::_get_parameter_count, CarlaEngineNative::_get_parameter_info, CarlaEngineNative::_get_parameter_value, - CarlaEngineNative::_get_parameter_text, CarlaEngineNative::_get_midi_program_count, CarlaEngineNative::_get_midi_program_info, CarlaEngineNative::_set_parameter_value, @@ -2015,7 +1986,6 @@ static const NativePluginDescriptor carlaPatchbay32Desc = { CarlaEngineNative::_get_parameter_count, CarlaEngineNative::_get_parameter_info, CarlaEngineNative::_get_parameter_value, - CarlaEngineNative::_get_parameter_text, CarlaEngineNative::_get_midi_program_count, CarlaEngineNative::_get_midi_program_info, CarlaEngineNative::_set_parameter_value, diff --git a/source/backend/plugin/CarlaPluginNative.cpp b/source/backend/plugin/CarlaPluginNative.cpp index c6b99ce33..0aa677c8a 100644 --- a/source/backend/plugin/CarlaPluginNative.cpp +++ b/source/backend/plugin/CarlaPluginNative.cpp @@ -467,25 +467,6 @@ public: CarlaPlugin::getParameterName(parameterId, strBuf); } - void getParameterText(const uint32_t parameterId, char* const strBuf) const noexcept override - { - CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); - CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_text != nullptr,); - CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_value != nullptr,); - CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); - CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); - - // FIXME - try - if (const char* const text = fDescriptor->get_parameter_text(fHandle, parameterId /*, fDescriptor->get_parameter_value(fHandle, parameterId)*/)) - { - std::strncpy(strBuf, text, STR_MAX); - return; - } - - carla_safe_assert("const char* const text = fDescriptor->get_parameter_text(fHandle, parameterId, value)", __FILE__, __LINE__); - CarlaPlugin::getParameterText(parameterId, strBuf); - } - void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override { CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); @@ -1106,9 +1087,6 @@ public: if (paramInfo->hints & NATIVE_PARAMETER_USES_SCALEPOINTS) pData->param.data[j].hints |= PARAMETER_USES_SCALEPOINTS; - if (paramInfo->hints & NATIVE_PARAMETER_USES_CUSTOM_TEXT) - pData->param.data[j].hints |= PARAMETER_USES_CUSTOM_TEXT; - pData->param.ranges[j].min = min; pData->param.ranges[j].max = max; pData->param.ranges[j].def = def; diff --git a/source/bridges-plugin/CarlaBridgePlugin.cpp b/source/bridges-plugin/CarlaBridgePlugin.cpp index fb61bdb5e..b793687eb 100644 --- a/source/bridges-plugin/CarlaBridgePlugin.cpp +++ b/source/bridges-plugin/CarlaBridgePlugin.cpp @@ -398,6 +398,12 @@ int main(int argc, char* argv[]) CarlaString clientName(name != nullptr ? name : label); + // LV2 URI is not usable as client name + //if (itype == CarlaBackend::PLUGIN_LV2 && clientName == label) + { + + } + if (clientName.isEmpty()) { const String jfilename = String(CharPointer_UTF8(filename)); diff --git a/source/includes/CarlaNative.h b/source/includes/CarlaNative.h index 4b92d00d5..595fa180c 100644 --- a/source/includes/CarlaNative.h +++ b/source/includes/CarlaNative.h @@ -84,8 +84,7 @@ typedef enum { NATIVE_PARAMETER_IS_INTEGER = 1 << 4, NATIVE_PARAMETER_IS_LOGARITHMIC = 1 << 5, NATIVE_PARAMETER_USES_SAMPLE_RATE = 1 << 6, - NATIVE_PARAMETER_USES_SCALEPOINTS = 1 << 7, - NATIVE_PARAMETER_USES_CUSTOM_TEXT = 1 << 8 + NATIVE_PARAMETER_USES_SCALEPOINTS = 1 << 7 } NativeParameterHints; typedef enum { @@ -225,7 +224,6 @@ typedef struct _NativePluginDescriptor { uint32_t (*get_parameter_count)(NativePluginHandle handle); const NativeParameter* (*get_parameter_info)(NativePluginHandle handle, uint32_t index); float (*get_parameter_value)(NativePluginHandle handle, uint32_t index); - const char* (*get_parameter_text)(NativePluginHandle handle, uint32_t index /*, float value*/); uint32_t (*get_midi_program_count)(NativePluginHandle handle); const NativeMidiProgram* (*get_midi_program_info)(NativePluginHandle handle, uint32_t index); diff --git a/source/includes/CarlaNative.hpp b/source/includes/CarlaNative.hpp index 439769773..306e7cfd7 100644 --- a/source/includes/CarlaNative.hpp +++ b/source/includes/CarlaNative.hpp @@ -235,12 +235,6 @@ protected: return 0.0f; } - virtual const char* getParameterText(const uint32_t index /*, const float value*/) const - { - CARLA_SAFE_ASSERT_RETURN(index < getParameterCount(), nullptr); - return nullptr; - } - // ------------------------------------------------------------------- // Plugin midi-program calls @@ -401,11 +395,6 @@ public: return handlePtr->getParameterValue(index); } - static const char* _get_parameter_text(NativePluginHandle handle, uint32_t index /*, float value*/) - { - return handlePtr->getParameterText(index /*, value*/); - } - static uint32_t _get_midi_program_count(NativePluginHandle handle) { return handlePtr->getMidiProgramCount(); @@ -537,7 +526,6 @@ public: \ ClassName::_get_parameter_count, \ ClassName::_get_parameter_info, \ ClassName::_get_parameter_value, \ - ClassName::_get_parameter_text, \ ClassName::_get_midi_program_count, \ ClassName::_get_midi_program_info, \ ClassName::_set_parameter_value, \ diff --git a/source/jackbridge/JackBridge1.cpp b/source/jackbridge/JackBridge1.cpp index 6ed92b6c6..aaa05c12d 100644 --- a/source/jackbridge/JackBridge1.cpp +++ b/source/jackbridge/JackBridge1.cpp @@ -590,7 +590,7 @@ int jackbridge_client_name_size() if (getBridgeInstance().client_name_size_ptr != nullptr) return getBridgeInstance().client_name_size_ptr(); #endif - return 0; + return 33; } char* jackbridge_get_client_name(jack_client_t* client) @@ -1214,7 +1214,7 @@ int jackbridge_port_name_size() if (getBridgeInstance().port_name_size_ptr != nullptr) return getBridgeInstance().port_name_size_ptr(); #endif - return 0; + return 256; } int jackbridge_port_type_size() @@ -1226,7 +1226,7 @@ int jackbridge_port_type_size() if (getBridgeInstance().port_type_size_ptr != nullptr) return getBridgeInstance().port_type_size_ptr(); #endif - return 0; + return 32; } size_t jackbridge_port_type_get_buffer_size(jack_client_t* client, const char* port_type) diff --git a/source/native-plugins/_data.cpp b/source/native-plugins/_data.cpp index c60890703..10112ea54 100644 --- a/source/native-plugins/_data.cpp +++ b/source/native-plugins/_data.cpp @@ -21,10 +21,10 @@ #undef DESCFUNCS #define DESCFUNCS \ - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, \ - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, \ - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, \ - nullptr, nullptr, nullptr, nullptr + nullptr, nullptr, nullptr, nullptr, nullptr, \ + nullptr, nullptr, nullptr, nullptr, nullptr, \ + nullptr, nullptr, nullptr, nullptr, nullptr, \ + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr static const NativePluginDescriptor sNativePluginDescriptors[] = { diff --git a/source/native-plugins/bypass.c b/source/native-plugins/bypass.c index b41804453..a73b953bf 100644 --- a/source/native-plugins/bypass.c +++ b/source/native-plugins/bypass.c @@ -64,7 +64,6 @@ static const NativePluginDescriptor bypassDesc = { .get_parameter_count = NULL, .get_parameter_info = NULL, .get_parameter_value = NULL, - .get_parameter_text = NULL, .get_midi_program_count = NULL, .get_midi_program_info = NULL, diff --git a/source/native-plugins/lfo.c b/source/native-plugins/lfo.c index 38b2c6cdf..d1e7529c9 100644 --- a/source/native-plugins/lfo.c +++ b/source/native-plugins/lfo.c @@ -285,7 +285,6 @@ static const NativePluginDescriptor lfoDesc = { .get_parameter_count = lfo_get_parameter_count, .get_parameter_info = lfo_get_parameter_info, .get_parameter_value = lfo_get_parameter_value, - .get_parameter_text = NULL, .get_midi_program_count = NULL, .get_midi_program_info = NULL, diff --git a/source/native-plugins/midi-channel-filter.c b/source/native-plugins/midi-channel-filter.c index 21ab3ce5e..11a78fc5d 100644 --- a/source/native-plugins/midi-channel-filter.c +++ b/source/native-plugins/midi-channel-filter.c @@ -165,7 +165,6 @@ static const NativePluginDescriptor midichanfilterDesc = { .get_parameter_count = midichanfilter_get_parameter_count, .get_parameter_info = midichanfilter_get_parameter_info, .get_parameter_value = midichanfilter_get_parameter_value, - .get_parameter_text = NULL, .get_midi_program_count = NULL, .get_midi_program_info = NULL, diff --git a/source/native-plugins/midi-gain.c b/source/native-plugins/midi-gain.c index 91eb04577..06e1abc62 100644 --- a/source/native-plugins/midi-gain.c +++ b/source/native-plugins/midi-gain.c @@ -235,7 +235,6 @@ static const NativePluginDescriptor midigainDesc = { .get_parameter_count = midigain_get_parameter_count, .get_parameter_info = midigain_get_parameter_info, .get_parameter_value = midigain_get_parameter_value, - .get_parameter_text = NULL, .get_midi_program_count = NULL, .get_midi_program_info = NULL, diff --git a/source/native-plugins/midi-join.c b/source/native-plugins/midi-join.c index 6a3b9a3e6..0864ae8bc 100644 --- a/source/native-plugins/midi-join.c +++ b/source/native-plugins/midi-join.c @@ -105,7 +105,6 @@ static const NativePluginDescriptor midijoinDesc = { .get_parameter_count = NULL, .get_parameter_info = NULL, .get_parameter_value = NULL, - .get_parameter_text = NULL, .get_midi_program_count = NULL, .get_midi_program_info = NULL, diff --git a/source/native-plugins/midi-split.c b/source/native-plugins/midi-split.c index 4ba0a0c60..45edf82b0 100644 --- a/source/native-plugins/midi-split.c +++ b/source/native-plugins/midi-split.c @@ -105,7 +105,6 @@ static const NativePluginDescriptor midisplitDesc = { .get_parameter_count = NULL, .get_parameter_info = NULL, .get_parameter_value = NULL, - .get_parameter_text = NULL, .get_midi_program_count = NULL, .get_midi_program_info = NULL, diff --git a/source/native-plugins/midi-through.c b/source/native-plugins/midi-through.c index fa4f338ba..401313afc 100644 --- a/source/native-plugins/midi-through.c +++ b/source/native-plugins/midi-through.c @@ -86,7 +86,6 @@ static const NativePluginDescriptor midithroughDesc = { .get_parameter_count = NULL, .get_parameter_info = NULL, .get_parameter_value = NULL, - .get_parameter_text = NULL, .get_midi_program_count = NULL, .get_midi_program_info = NULL, diff --git a/source/native-plugins/midi-transpose.c b/source/native-plugins/midi-transpose.c index e272da4c8..e2ba97e62 100644 --- a/source/native-plugins/midi-transpose.c +++ b/source/native-plugins/midi-transpose.c @@ -164,7 +164,6 @@ static const NativePluginDescriptor miditransposeDesc = { .get_parameter_count = miditranspose_get_parameter_count, .get_parameter_info = miditranspose_get_parameter_info, .get_parameter_value = miditranspose_get_parameter_value, - .get_parameter_text = NULL, .get_midi_program_count = NULL, .get_midi_program_info = NULL, diff --git a/source/native-plugins/zita-rev1.cpp b/source/native-plugins/zita-rev1.cpp index 7aef7468e..52f610b5f 100644 --- a/source/native-plugins/zita-rev1.cpp +++ b/source/native-plugins/zita-rev1.cpp @@ -408,7 +408,6 @@ static const NativePluginDescriptor rev1AmbisonicDesc = { REV1Plugin::_get_parameter_count, REV1Plugin::_get_parameter_info, REV1Plugin::_get_parameter_value, - REV1Plugin::_get_parameter_text, REV1Plugin::_get_midi_program_count, REV1Plugin::_get_midi_program_info, REV1Plugin::_set_parameter_value, @@ -448,7 +447,6 @@ static const NativePluginDescriptor rev1StereoDesc = { REV1Plugin::_get_parameter_count, REV1Plugin::_get_parameter_info, REV1Plugin::_get_parameter_value, - REV1Plugin::_get_parameter_text, REV1Plugin::_get_midi_program_count, REV1Plugin::_get_midi_program_info, REV1Plugin::_set_parameter_value, diff --git a/source/plugin/carla-base.cpp b/source/plugin/carla-base.cpp index 543d6efc5..dce95ec2b 100644 --- a/source/plugin/carla-base.cpp +++ b/source/plugin/carla-base.cpp @@ -79,10 +79,6 @@ struct PluginListManager { continue; } - // skip midi plugins, not implemented yet - if (desc->audioIns == 0 && desc->audioOuts == 0 && desc->midiIns >= 1 && desc->midiOuts >= 1) - continue; - descs.append(desc); } } diff --git a/source/plugin/carla-lv2-export.cpp b/source/plugin/carla-lv2-export.cpp index d1bf31f2f..2c25b0931 100644 --- a/source/plugin/carla-lv2-export.cpp +++ b/source/plugin/carla-lv2-export.cpp @@ -328,15 +328,31 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc) text += " lv2:designation lv2:control ;\n"; text += " lv2:index " + String(portIndex++) + " ;\n"; - if (pluginDesc->midiIns > 1) + if (pluginDesc->hints & NATIVE_PLUGIN_USES_TIME) { - text += " lv2:symbol \"lv2_events_in_1\" ;\n"; - text += " lv2:name \"Events Input #1\" ;\n"; + if (pluginDesc->midiIns > 1) + { + text += " lv2:symbol \"lv2_events_in_1\" ;\n"; + text += " lv2:name \"Events Input #1\" ;\n"; + } + else + { + text += " lv2:symbol \"lv2_events_in\" ;\n"; + text += " lv2:name \"Events Input\" ;\n"; + } } else { - text += " lv2:symbol \"lv2_events_in\" ;\n"; - text += " lv2:name \"Events Input\" ;\n"; + if (pluginDesc->midiIns > 1) + { + text += " lv2:symbol \"lv2_midi_in_1\" ;\n"; + text += " lv2:name \"MIDI Input #1\" ;\n"; + } + else + { + text += " lv2:symbol \"lv2_midi_in\" ;\n"; + text += " lv2:name \"MIDI Input\" ;\n"; + } } text += " ] ;\n\n"; @@ -354,17 +370,8 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc) text += " atom:bufferType atom:Sequence ;\n"; text += " atom:supports <" LV2_MIDI__MidiEvent "> ;\n"; text += " lv2:index " + String(portIndex++) + " ;\n"; - - if (pluginDesc->midiIns > 1) - { - text += " lv2:symbol \"lv2_events_in_" + String(i+1) + "\" ;\n"; - text += " lv2:name \"Events Input #" + String(i+1) + "\" ;\n"; - } - else - { - text += " lv2:symbol \"lv2_events_in\" ;\n"; - text += " lv2:name \"Events Input\" ;\n"; - } + text += " lv2:symbol \"lv2_midi_in_" + String(i+1) + "\" ;\n"; + text += " lv2:name \"MIDI Input #" + String(i+1) + "\" ;\n"; if (i+1 == pluginDesc->midiIns) text += " ] ;\n\n"; @@ -372,7 +379,6 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc) text += " ] , [\n"; } -#if 0 // TODO // ------------------------------------------------------------------- // MIDI outputs @@ -402,7 +408,6 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc) else text += " ] , [\n"; } -#endif // ------------------------------------------------------------------- // Freewheel port @@ -416,7 +421,7 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc) text += " lv2:minimum 0.0 ;\n"; text += " lv2:maximum 1.0 ;\n"; text += " lv2:designation <" LV2_CORE__freeWheeling "> ;\n"; - text += " lv2:portProperty lv2:toggled ;\n"; + text += " lv2:portProperty lv2:toggled, <" LV2_PORT_PROPS__notOnGUI "> ;\n"; text += " ] ;\n"; text += "\n"; @@ -497,27 +502,20 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc) text += " lv2:minimum " + String::formatted("%f", paramInfo->ranges.min) + " ;\n"; text += " lv2:maximum " + String::formatted("%f", paramInfo->ranges.max) + " ;\n"; - if (paramInfo->hints & NATIVE_PARAMETER_IS_ENABLED) - { - if ((paramInfo->hints & NATIVE_PARAMETER_IS_AUTOMABLE) == 0) - text += " lv2:portProperty <" LV2_PORT_PROPS__expensive "> ;\n"; - if (paramInfo->hints & NATIVE_PARAMETER_IS_BOOLEAN) - text += " lv2:portProperty lv2:toggled ;\n"; - if (paramInfo->hints & NATIVE_PARAMETER_IS_INTEGER) - text += " lv2:portProperty lv2:integer ;\n"; - if (paramInfo->hints & NATIVE_PARAMETER_IS_LOGARITHMIC) - text += " lv2:portProperty <" LV2_PORT_PROPS__logarithmic "> ;\n"; - if (paramInfo->hints & NATIVE_PARAMETER_USES_SAMPLE_RATE) - text += " lv2:portProperty lv2:toggled ;\n"; - if (paramInfo->hints & NATIVE_PARAMETER_USES_SCALEPOINTS) - text += " lv2:portProperty lv2:enumeration ;\n"; - if (paramInfo->hints & NATIVE_PARAMETER_USES_CUSTOM_TEXT) - pass(); // TODO: custom lv2 extension for this - } - else - { + if ((paramInfo->hints & NATIVE_PARAMETER_IS_AUTOMABLE) == 0) + text += " lv2:portProperty <" LV2_PORT_PROPS__expensive "> ;\n"; + if (paramInfo->hints & NATIVE_PARAMETER_IS_BOOLEAN) + text += " lv2:portProperty lv2:toggled ;\n"; + if (paramInfo->hints & NATIVE_PARAMETER_IS_INTEGER) + text += " lv2:portProperty lv2:integer ;\n"; + if (paramInfo->hints & NATIVE_PARAMETER_IS_LOGARITHMIC) + text += " lv2:portProperty <" LV2_PORT_PROPS__logarithmic "> ;\n"; + if (paramInfo->hints & NATIVE_PARAMETER_USES_SAMPLE_RATE) + text += " lv2:portProperty lv2:toggled ;\n"; + if (paramInfo->hints & NATIVE_PARAMETER_USES_SCALEPOINTS) + text += " lv2:portProperty lv2:enumeration ;\n"; + if ((paramInfo->hints & NATIVE_PARAMETER_IS_ENABLED) == 0) text += " lv2:portProperty <" LV2_PORT_PROPS__notOnGUI "> ;\n"; - } for (uint32_t j=0; j < paramInfo->scalePointCount; ++j) { diff --git a/source/plugin/carla-lv2.cpp b/source/plugin/carla-lv2.cpp index f74d5b5b8..4383a34de 100644 --- a/source/plugin/carla-lv2.cpp +++ b/source/plugin/carla-lv2.cpp @@ -171,9 +171,7 @@ public: else if (fDescriptor->hints & NATIVE_PLUGIN_USES_TIME) fUI.portOffset += 1; -#if 0 // TODO fUI.portOffset += desc->midiOuts; -#endif fUI.portOffset += 1; // freewheel fUI.portOffset += desc->audioIns; fUI.portOffset += desc->audioOuts; @@ -265,60 +263,43 @@ public: for (uint32_t i=0; i < fPorts.paramCount; ++i) { + if (fPorts.paramsOut[i]) + continue; + CARLA_SAFE_ASSERT_CONTINUE(fPorts.paramsPtr[i] != nullptr) curValue = *fPorts.paramsPtr[i]; - if ((! carla_compareFloats(fPorts.paramsLast[i], curValue)) && (fDescriptor->get_parameter_info(fHandle, i)->hints & NATIVE_PARAMETER_IS_OUTPUT) == 0) - { - fPorts.paramsLast[i] = curValue; - fDescriptor->set_parameter_value(fHandle, i, curValue); - } + if (carla_compareFloats(fPorts.paramsLast[i], curValue)) + continue; + + fPorts.paramsLast[i] = curValue; + fDescriptor->set_parameter_value(fHandle, i, curValue); } - if (fDescriptor->midiIns > 0 || (fDescriptor->hints & NATIVE_PLUGIN_USES_TIME) != 0) + if (fDescriptor->midiIns > 0 || fDescriptor->midiOuts > 0 || (fDescriptor->hints & NATIVE_PLUGIN_USES_TIME) != 0) { fMidiEventCount = 0; carla_zeroStruct(fMidiEvents, kMaxMidiEvents*2); - LV2_ATOM_SEQUENCE_FOREACH(fPorts.eventsIn[0], iter) + if (fDescriptor->hints & NATIVE_PLUGIN_USES_TIME) { - const LV2_Atom_Event* const event((const LV2_Atom_Event*)iter); - - if (event == nullptr) - continue; - - if (event->body.type == fURIs.midiEvent) + LV2_ATOM_SEQUENCE_FOREACH(fPorts.eventsIn[0], iter) { - if (event->body.size > 4) - continue; - if (event->time.frames >= frames) + const LV2_Atom_Event* const event((const LV2_Atom_Event*)iter); + + if (event == nullptr) continue; - if (fMidiEventCount >= kMaxMidiEvents*2) + if (event->body.type != fURIs.atomBlank) continue; - const uint8_t* const data((const uint8_t*)(event + 1)); - - fMidiEvents[fMidiEventCount].port = 0; - fMidiEvents[fMidiEventCount].time = (uint32_t)event->time.frames; - fMidiEvents[fMidiEventCount].size = (uint8_t)event->body.size; - - for (uint32_t i=0; i < event->body.size; ++i) - fMidiEvents[fMidiEventCount].data[i] = data[i]; - - fMidiEventCount += 1; - continue; - } - - if (event->body.type == fURIs.atomBlank) - { const LV2_Atom_Object* const obj((const LV2_Atom_Object*)&event->body); if (obj->body.otype != fURIs.timePos) continue; - LV2_Atom* bar = nullptr; - LV2_Atom* barBeat = nullptr; + LV2_Atom* bar = nullptr; + LV2_Atom* barBeat = nullptr; LV2_Atom* beat = nullptr; LV2_Atom* beatUnit = nullptr; LV2_Atom* beatsPerBar = nullptr; @@ -455,11 +436,10 @@ public: } fTimeInfo.bbt.valid = (beatsPerMinute != nullptr && beatsPerBar != nullptr && beatUnit != nullptr); - continue; } } - for (uint32_t i=1; i < fDescriptor->midiIns; ++i) + for (uint32_t i=0; i < fDescriptor->midiIns; ++i) { LV2_ATOM_SEQUENCE_FOREACH(fPorts.eventsIn[i], iter) { @@ -478,20 +458,22 @@ public: const uint8_t* const data((const uint8_t*)(event + 1)); - fMidiEvents[fMidiEventCount].port = (uint8_t)i; - fMidiEvents[fMidiEventCount].size = (uint8_t)event->body.size; - fMidiEvents[fMidiEventCount].time = (uint32_t)event->time.frames; + NativeMidiEvent& nativeEvent(fMidiEvents[fMidiEventCount++]); + carla_zeroStruct(nativeEvent); - for (uint32_t j=0; j < event->body.size; ++j) - fMidiEvents[fMidiEventCount].data[j] = data[j]; + nativeEvent.port = (uint8_t)i; + nativeEvent.size = (uint8_t)event->body.size; + nativeEvent.time = (uint32_t)event->time.frames; - fMidiEventCount += 1; + for (uint32_t j=0; j < event->body.size; ++j) + nativeEvent.data[j] = data[j]; } } } fIsProcessing = true; - fDescriptor->process(fHandle, fPorts.audioIns, fPorts.audioOuts, frames, fMidiEvents, fMidiEventCount); + // FIXME + fDescriptor->process(fHandle, const_cast(fPorts.audioIns), fPorts.audioOuts, frames, fMidiEvents, fMidiEventCount); fIsProcessing = false; // update timePos for next callback @@ -529,9 +511,61 @@ public: } } - // TODO - midi out - updateParameterOutputs(); + + if (fDescriptor->midiOuts > 0) + { + uint32_t capacities[fDescriptor->midiOuts]; + uint32_t offsets [fDescriptor->midiOuts]; + + for (uint32_t i=0, size=fDescriptor->midiOuts; iatom.size; + offsets [i] = 0; + } + + LV2_Atom_Event* aev; + uint32_t size; + + // reverse lookup MIDI events + for (uint32_t i = (kMaxMidiEvents*2)-1; i >= fMidiEventCount; --i) + { + if (fMidiEvents[i].data[0] == 0) + break; + + NativeMidiEvent& nativeEvent(fMidiEvents[i]); + + const uint8_t port(nativeEvent.port); + CARLA_SAFE_ASSERT_CONTINUE(nativeEvent.port < fDescriptor->midiOuts); + + LV2_Atom_Sequence* const seq(fPorts.midiOuts[port]); + CARLA_SAFE_ASSERT_CONTINUE(seq != nullptr); + + if (sizeof(LV2_Atom_Event) + nativeEvent.size > capacities[port] - offsets[port]) + continue; + + if (offsets[port] == 0) + { + seq->atom.size = 0; + seq->atom.type = fURIs.atomSequence; + seq->body.unit = 0; + seq->body.pad = 0; + } + + aev = (LV2_Atom_Event*)(LV2_ATOM_CONTENTS(LV2_Atom_Sequence, seq) + offsets[port]); + aev->time.frames = nativeEvent.time; + aev->body.size = nativeEvent.size; + aev->body.type = fURIs.midiEvent; + std::memcpy(LV2_ATOM_BODY(&aev->body), nativeEvent.data, nativeEvent.size); + + size = lv2_atom_pad_size(sizeof(LV2_Atom_Event) + nativeEvent.size); + offsets[port] += size; + seq->atom.size += size; + } + } } // ------------------------------------------------------------------- @@ -878,13 +912,14 @@ protected: // reverse-find first free event, and put it there for (uint32_t i=(kMaxMidiEvents*2)-1; i > fMidiEventCount; --i) { - if (fMidiEvents[i].data[0] == 0) - { - std::memcpy(&fMidiEvents[i], event, sizeof(NativeMidiEvent)); - return true; - } + if (fMidiEvents[i].data[0] != 0) + continue; + + std::memcpy(&fMidiEvents[i], event, sizeof(NativeMidiEvent)); + return true; } + carla_stdout("NativePlugin::handleWriteMidiEvent(%p) - buffer full", event); return false; } @@ -1070,14 +1105,15 @@ private: } fUI; struct Ports { - LV2_Atom_Sequence** eventsIn; - LV2_Atom_Sequence** midiOuts; - float** audioIns; - float** audioOuts; + const LV2_Atom_Sequence** eventsIn; + /* */ LV2_Atom_Sequence** midiOuts; + const float** audioIns; + /* */ float** audioOuts; float* freewheel; uint32_t paramCount; float* paramsLast; float** paramsPtr; + bool* paramsOut; Ports() : eventsIn(nullptr), @@ -1087,7 +1123,8 @@ private: freewheel(nullptr), paramCount(0), paramsLast(nullptr), - paramsPtr(nullptr) {} + paramsPtr(nullptr), + paramsOut(nullptr) {} ~Ports() { @@ -1126,6 +1163,12 @@ private: delete[] paramsPtr; paramsPtr = nullptr; } + + if (paramsOut != nullptr) + { + delete[] paramsOut; + paramsOut = nullptr; + } } void init(const NativePluginDescriptor* const desc, NativePluginHandle handle) @@ -1134,14 +1177,14 @@ private: if (desc->midiIns > 0) { - eventsIn = new LV2_Atom_Sequence*[desc->midiIns]; + eventsIn = new const LV2_Atom_Sequence*[desc->midiIns]; for (uint32_t i=0; i < desc->midiIns; ++i) eventsIn[i] = nullptr; } else if (desc->hints & NATIVE_PLUGIN_USES_TIME) { - eventsIn = new LV2_Atom_Sequence*[1]; + eventsIn = new const LV2_Atom_Sequence*[1]; eventsIn[0] = nullptr; } @@ -1155,7 +1198,7 @@ private: if (desc->audioIns > 0) { - audioIns = new float*[desc->audioIns]; + audioIns = new const float*[desc->audioIns]; for (uint32_t i=0; i < desc->audioIns; ++i) audioIns[i] = nullptr; @@ -1177,11 +1220,13 @@ private: { paramsLast = new float[paramCount]; paramsPtr = new float*[paramCount]; + paramsOut = new bool[paramCount]; for (uint32_t i=0; i < paramCount; ++i) { paramsLast[i] = desc->get_parameter_value(handle, i); - paramsPtr[i] = nullptr; + paramsPtr [i] = nullptr; + paramsOut [i] = (desc->get_parameter_info(handle, i)->hints & NATIVE_PARAMETER_IS_OUTPUT); } } } @@ -1209,7 +1254,6 @@ private: } } -#if 0 // TODO for (uint32_t i=0; i < desc->midiOuts; ++i) { if (port == index++) @@ -1218,7 +1262,6 @@ private: return; } } -#endif if (port == index++) { diff --git a/source/plugin/carla-vst.cpp b/source/plugin/carla-vst.cpp index 6f74da4c5..d21a04d25 100644 --- a/source/plugin/carla-vst.cpp +++ b/source/plugin/carla-vst.cpp @@ -438,6 +438,7 @@ public: fMidiOutEvents.numEvents = 0; if (fHandle != nullptr) + // FIXME fDescriptor->process(fHandle, const_cast(inputs), outputs, static_cast(sampleFrames), fMidiEvents, fMidiEventCount); fMidiEventCount = 0;