7#include "CarlaString.hpp"
8#include "CarlaBackendUtils.hpp"
9#include "CarlaLv2Utils.hpp"
11#ifndef STATIC_PLUGIN_TARGET
17# include "CarlaJsfxUtils.hpp"
32 case CB::PLUGIN_INTERNAL:
45_CarlaCachedPluginInfo::_CarlaCachedPluginInfo()
noexcept
65static std::vector<water::File>
gSFZs;
67static void findSFZs(
const char*
const sfzPaths)
73 if (sfzPaths[0] ==
'\0')
80 std::vector<water::File> results;
85 gSFZs.insert(
gSFZs.end(), results.begin(), results.end());
94static std::vector<CB::CarlaJsfxUnit> gJSFXs;
96static void findJSFXs(
const char*
const jsfxPaths)
102 if (jsfxPaths[0] ==
'\0')
107 for (
water::String *it = splitPaths.begin(), *end = splitPaths.end(); it != end; ++it)
109 std::vector<water::File> results;
114 gJSFXs.reserve(gJSFXs.size() + results.size());
116 for (std::vector<water::File>::iterator it2=results.begin(), end2=results.end(); it2 != end2; ++it2)
121 gJSFXs.push_back(CB::CarlaJsfxUnit(path,
file));
134 info.category =
static_cast<CB::PluginCategory
>(desc.
category);
138 info.hints |= CB::PLUGIN_IS_RTSAFE;
140 info.hints |= CB::PLUGIN_IS_SYNTH;
142 info.hints |= CB::PLUGIN_HAS_CUSTOM_UI;
144 info.hints |= CB::PLUGIN_HAS_INLINE_DISPLAY;
146 info.hints |= CB::PLUGIN_NEEDS_FIXED_BUFFERS;
148 info.hints |= CB::PLUGIN_NEEDS_UI_MAIN_THREAD;
150 info.hints |= CB::PLUGIN_USES_MULTI_PROGS;
175 bool supported =
true;
181 static CarlaString suri, sname, smaker, slicense;
182 suri.clear(); sname.clear(); smaker.clear(); slicense.clear();
184 suri = lilvPlugin.get_uri().as_uri();
186 if (
char*
const bundle =
lilv_file_uri_parse(lilvPlugin.get_bundle_uri().as_uri(),
nullptr))
199 if (suri ==
"urn:ardour:a-fluidsynth")
201 if (suri ==
"http://calf.sourceforge.net/plugins/Fluidsynth")
219 Lilv::Nodes licenseNodes(lilvPlugin.get_value(lv2World.doap_license));
221 if (licenseNodes.size() > 0)
233 info.name = sname.buffer();
234 info.label = suri.buffer();
235 info.maker = smaker.buffer();
236 info.copyright = slicense.buffer();
245 Lilv::UIs lilvUIs(lilvPlugin.get_uis());
247 if (lilvUIs.size() > 0)
249 info.hints |= CB::PLUGIN_HAS_CUSTOM_UI;
253 Lilv::UI lilvUI(lilvUIs.get(it));
254 lv2World.load_resource(lilvUI.get_uri());
256 #if defined(CARLA_OS_MAC)
257 if (lilvUI.is_a(lv2World.ui_cocoa))
258 #elif defined(CARLA_OS_WIN)
259 if (lilvUI.is_a(lv2World.ui_windows))
260 #elif defined(HAVE_X11)
261 if (lilvUI.is_a(lv2World.ui_x11))
266 info.hints |= CB::PLUGIN_HAS_CUSTOM_EMBED_UI;
272 else if (lilvPlugin.get_modgui_resources_directory().as_uri() !=
nullptr)
273 info.hints |= CB::PLUGIN_HAS_CUSTOM_UI;
280 Lilv::Nodes lilvRequiredFeatureNodes(lilvPlugin.get_required_features());
284 Lilv::Node lilvFeatureNode(lilvRequiredFeatureNodes.get(it));
285 const char*
const featureURI(lilvFeatureNode.as_uri());
288 if (! is_lv2_feature_supported(featureURI))
298 carla_stderr(
"LV2 plugin '%s' requires unsupported feature '%s'",
info.label, featureURI);
306 Lilv::Nodes lilvSupportedFeatureNodes(lilvPlugin.get_supported_features());
310 Lilv::Node lilvFeatureNode(lilvSupportedFeatureNodes.get(it));
311 const char*
const featureURI(lilvFeatureNode.as_uri());
316 info.hints |= CB::PLUGIN_IS_RTSAFE;
320 info.hints |= CB::PLUGIN_HAS_INLINE_DISPLAY;
325 carla_stderr(
"LV2 plugin '%s' DSP wants UI feature '%s', ignoring this",
info.label, featureURI);
335 info.category = CB::PLUGIN_CATEGORY_NONE;
338 Lilv::Nodes typeNodes(lilvPlugin.get_value(lv2World.rdf_type));
340 if (typeNodes.size() > 0)
342 if (typeNodes.contains(lv2World.class_allpass))
343 info.category = CB::PLUGIN_CATEGORY_FILTER;
344 if (typeNodes.contains(lv2World.class_amplifier))
345 info.category = CB::PLUGIN_CATEGORY_DYNAMICS;
346 if (typeNodes.contains(lv2World.class_analyzer))
347 info.category = CB::PLUGIN_CATEGORY_UTILITY;
348 if (typeNodes.contains(lv2World.class_bandpass))
349 info.category = CB::PLUGIN_CATEGORY_FILTER;
350 if (typeNodes.contains(lv2World.class_chorus))
351 info.category = CB::PLUGIN_CATEGORY_MODULATOR;
352 if (typeNodes.contains(lv2World.class_comb))
353 info.category = CB::PLUGIN_CATEGORY_FILTER;
354 if (typeNodes.contains(lv2World.class_compressor))
355 info.category = CB::PLUGIN_CATEGORY_DYNAMICS;
356 if (typeNodes.contains(lv2World.class_constant))
357 info.category = CB::PLUGIN_CATEGORY_OTHER;
358 if (typeNodes.contains(lv2World.class_converter))
359 info.category = CB::PLUGIN_CATEGORY_UTILITY;
360 if (typeNodes.contains(lv2World.class_delay))
361 info.category = CB::PLUGIN_CATEGORY_DELAY;
362 if (typeNodes.contains(lv2World.class_distortion))
363 info.category = CB::PLUGIN_CATEGORY_DISTORTION;
364 if (typeNodes.contains(lv2World.class_dynamics))
365 info.category = CB::PLUGIN_CATEGORY_DYNAMICS;
366 if (typeNodes.contains(lv2World.class_eq))
367 info.category = CB::PLUGIN_CATEGORY_EQ;
368 if (typeNodes.contains(lv2World.class_envelope))
369 info.category = CB::PLUGIN_CATEGORY_DYNAMICS;
370 if (typeNodes.contains(lv2World.class_expander))
371 info.category = CB::PLUGIN_CATEGORY_DYNAMICS;
372 if (typeNodes.contains(lv2World.class_filter))
373 info.category = CB::PLUGIN_CATEGORY_FILTER;
374 if (typeNodes.contains(lv2World.class_flanger))
375 info.category = CB::PLUGIN_CATEGORY_MODULATOR;
376 if (typeNodes.contains(lv2World.class_function))
377 info.category = CB::PLUGIN_CATEGORY_UTILITY;
378 if (typeNodes.contains(lv2World.class_gate))
379 info.category = CB::PLUGIN_CATEGORY_DYNAMICS;
380 if (typeNodes.contains(lv2World.class_generator))
381 info.category = CB::PLUGIN_CATEGORY_OTHER;
382 if (typeNodes.contains(lv2World.class_highpass))
383 info.category = CB::PLUGIN_CATEGORY_FILTER;
384 if (typeNodes.contains(lv2World.class_limiter))
385 info.category = CB::PLUGIN_CATEGORY_DYNAMICS;
386 if (typeNodes.contains(lv2World.class_lowpass))
387 info.category = CB::PLUGIN_CATEGORY_FILTER;
388 if (typeNodes.contains(lv2World.class_mixer))
389 info.category = CB::PLUGIN_CATEGORY_UTILITY;
390 if (typeNodes.contains(lv2World.class_modulator))
391 info.category = CB::PLUGIN_CATEGORY_MODULATOR;
392 if (typeNodes.contains(lv2World.class_multiEQ))
393 info.category = CB::PLUGIN_CATEGORY_EQ;
394 if (typeNodes.contains(lv2World.class_oscillator))
395 info.category = CB::PLUGIN_CATEGORY_OTHER;
396 if (typeNodes.contains(lv2World.class_paraEQ))
397 info.category = CB::PLUGIN_CATEGORY_EQ;
398 if (typeNodes.contains(lv2World.class_phaser))
399 info.category = CB::PLUGIN_CATEGORY_MODULATOR;
400 if (typeNodes.contains(lv2World.class_pitch))
401 info.category = CB::PLUGIN_CATEGORY_OTHER;
402 if (typeNodes.contains(lv2World.class_reverb))
403 info.category = CB::PLUGIN_CATEGORY_DELAY;
404 if (typeNodes.contains(lv2World.class_simulator))
405 info.category = CB::PLUGIN_CATEGORY_OTHER;
406 if (typeNodes.contains(lv2World.class_spatial))
407 info.category = CB::PLUGIN_CATEGORY_OTHER;
408 if (typeNodes.contains(lv2World.class_spectral))
409 info.category = CB::PLUGIN_CATEGORY_OTHER;
410 if (typeNodes.contains(lv2World.class_utility))
411 info.category = CB::PLUGIN_CATEGORY_UTILITY;
412 if (typeNodes.contains(lv2World.class_waveshaper))
413 info.category = CB::PLUGIN_CATEGORY_DISTORTION;
414 if (typeNodes.contains(lv2World.class_instrument))
416 info.category = CB::PLUGIN_CATEGORY_SYNTH;
417 info.hints |= CB::PLUGIN_IS_SYNTH;
433 info.parameterIns = 0;
434 info.parameterOuts = 0;
438 Lilv::Port lilvPort(lilvPlugin.get_port_by_index(
i));
442 if (lilvPort.is_a(lv2World.port_input))
446 else if (lilvPort.is_a(lv2World.port_output))
452 const LilvNode*
const symbolNode = lilvPort.get_symbol();
458 carla_stderr(
"LV2 plugin '%s' port '%s' is neither input or output",
info.label, symbol);
462 if (lilvPort.is_a(lv2World.port_control))
465 if (lilvPort.has_property(lv2World.reportsLatency))
468 if (
LilvNode*
const designationNode =
lilv_port_get(lilvPort.parent, lilvPort.me, lv2World.designation.me))
511 ++(
info.parameterIns);
513 ++(
info.parameterOuts);
515 else if (lilvPort.is_a(lv2World.port_audio))
522 else if (lilvPort.is_a(lv2World.port_cv))
529 else if (lilvPort.is_a(lv2World.port_atom))
531 Lilv::Nodes supportNodes(lilvPort.get_value(lv2World.atom_supports));
538 if (node.equals(lv2World.midi_event))
549 else if (lilvPort.is_a(lv2World.port_event))
551 if (lilvPort.supports_event(lv2World.midi_event))
559 else if (lilvPort.is_a(lv2World.port_midi))
568 const LilvNode*
const symbolNode = lilvPort.get_symbol();
575 carla_stderr(
"LV2 plugin '%s' port '%s' is required but has unsupported type",
info.label, symbol);
594 name =
file.getFileNameWithoutExtension().toRawUTF8();
595 name.replace(
'_',
' ');
599 info.category = CB::PLUGIN_CATEGORY_SYNTH;
600 info.hints = CB::PLUGIN_IS_SYNTH;
610 info.parameterIns = 0;
611 info.parameterOuts = 1;
663 info.category = CB::CarlaJsfxCategories::getFromEffect(effect.get());
674 info.parameterIns = 0;
675 info.parameterOuts = 0;
686 info.hints |= CB::PLUGIN_HAS_CUSTOM_UI;
691 info.maker = maker.buffer();
703 carla_debug(
"carla_get_cached_plugin_count(%i:%s, %s)", ptype, CB::PluginType2Str(ptype), pluginPath);
707 case CB::PLUGIN_INTERNAL: {
713 case CB::PLUGIN_LV2: {
714 Lv2WorldClass& lv2World(Lv2WorldClass::getInstance());
715 lv2World.initIfNeeded(pluginPath);
716 return lv2World.getPluginCount();
726 case CB::PLUGIN_JSFX:
727 findJSFXs(pluginPath);
728 return static_cast<uint>(gJSFXs.size());
738 carla_debug(
"carla_get_cached_plugin_info(%i:%s, %i)", ptype, CB::PluginType2Str(ptype), index);
742 case CB::PLUGIN_INTERNAL: {
752 case CB::PLUGIN_LV2: {
753 Lv2WorldClass& lv2World(Lv2WorldClass::getInstance());
755 const LilvPlugin*
const cPlugin(lv2World.getPluginFromIndex(index));
758 Lilv::Plugin lilvPlugin(cPlugin);
771 case CB::PLUGIN_JSFX:
773 return get_cached_plugin_jsfx(gJSFXs[index]);
786#ifndef CARLA_PLUGIN_BUILD
787# include "../native-plugins/_data.cpp"
#define CARLA_BACKEND_NAMESPACE
Definition CarlaBackend.h:32
#define CARLA_OS_SEP_STR
Definition CarlaDefines.h:319
#define CARLA_OS_SEP
Definition CarlaDefines.h:318
#define CARLA_OS_SPLIT_STR
Definition CarlaDefines.h:321
#define CARLA_SAFE_ASSERT_CONTINUE(cond)
Definition CarlaDefines.h:189
#define CARLA_SAFE_ASSERT_RETURN(cond, ret)
Definition CarlaDefines.h:190
unsigned int uint
Definition CarlaDefines.h:327
#define CARLA_SAFE_ASSERT_BREAK(cond)
Definition CarlaDefines.h:188
#define noexcept
Definition DistrhoDefines.h:72
static void copyright()
Definition adplugdb.cpp:261
static const CarlaCachedPluginInfo * get_cached_plugin_lv2(Lv2WorldClass &lv2World, Lilv::Plugin &lilvPlugin)
Definition CachedPlugins.cpp:170
static std::vector< water::File > gSFZs
Definition CachedPlugins.cpp:65
static const CarlaCachedPluginInfo * get_cached_plugin_sfz(const water::File &file)
Definition CachedPlugins.cpp:588
static void findSFZs(const char *const sfzPaths)
Definition CachedPlugins.cpp:67
static const char *const gCachedPluginsNullCharPtr
Definition CachedPlugins.cpp:26
const CarlaCachedPluginInfo * carla_get_cached_plugin_info(CB::PluginType ptype, uint index)
Definition CachedPlugins.cpp:736
uint carla_get_cached_plugin_count(CB::PluginType ptype, const char *pluginPath)
Definition CachedPlugins.cpp:700
static bool isCachedPluginType(const CB::PluginType ptype)
Definition CachedPlugins.cpp:28
static const CarlaCachedPluginInfo * get_cached_plugin_internal(const NativePluginDescriptor &desc)
Definition CachedPlugins.cpp:130
@ findFiles
Definition File.h:462
@ ignoreHiddenFiles
Definition File.h:464
String getFileName() const
Definition File.cpp:373
uint findChildFiles(std::vector< File > &results, int whatToLookFor, bool searchRecursively, const String &wildCardPattern="*") const
Definition File.cpp:581
Definition StringArray.h:41
String * begin() const noexcept
Definition StringArray.h:120
static StringArray fromTokens(StringRef stringToTokenise, bool preserveQuotedStrings)
Definition StringArray.cpp:369
String * end() const noexcept
Definition StringArray.h:125
bool equalsIgnoreCase(const String &other) const noexcept
Definition String.cpp:518
const char * toRawUTF8() const
Definition String.cpp:1925
bool isEmpty() const noexcept
Definition String.h:238
register unsigned i
Definition inflate.c:1575
static char filename[]
Definition features.c:5
@ PLUGIN_CATEGORY_NONE
Definition CarlaBackend.h:708
CARLA_API_EXPORT const NativePluginDescriptor * carla_get_native_plugins_data(uint32_t *count)
Definition _data.cpp:599
struct _NativePluginDescriptor NativePluginDescriptor
@ NATIVE_PLUGIN_USES_MULTI_PROGS
Definition CarlaNative.h:62
@ NATIVE_PLUGIN_IS_SYNTH
Definition CarlaNative.h:57
@ NATIVE_PLUGIN_HAS_INLINE_DISPLAY
Definition CarlaNative.h:67
@ NATIVE_PLUGIN_NEEDS_UI_MAIN_THREAD
Definition CarlaNative.h:60
@ NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS
Definition CarlaNative.h:59
@ NATIVE_PLUGIN_IS_RTSAFE
Definition CarlaNative.h:56
@ NATIVE_PLUGIN_HAS_UI
Definition CarlaNative.h:58
struct _CarlaCachedPluginInfo CarlaCachedPluginInfo
#define LV2_DATA_ACCESS_URI
http://lv2plug.in/ns/ext/data-access
Definition data-access.h:30
static const char * name
Definition pugl.h:1582
#define LV2_INLINEDISPLAY__queue_draw
Definition inline-display.h:37
#define LV2_INSTANCE_ACCESS_URI
http://lv2plug.in/ns/ext/instance-access
Definition instance-access.h:30
LILV_API LilvNode * lilv_nodes_get_first(const LilvNodes *collection)
Definition collections.c:236
LILV_API LilvIter * lilv_nodes_begin(const LilvNodes *collection)
LILV_API bool lilv_nodes_is_end(const LilvNodes *collection, LilvIter *i)
LILV_API LilvIter * lilv_nodes_next(const LilvNodes *collection, LilvIter *i)
LILV_API void lilv_nodes_free(LilvNodes *collection)
Definition collections.c:230
LILV_API const LilvNode * lilv_nodes_get(const LilvNodes *collection, LilvIter *i)
#define LILV_FOREACH(colltype, iter, collection)
Definition lilv.h:398
LILV_API bool lilv_node_is_string(const LilvNode *value)
Definition node.c:351
LILV_API const char * lilv_node_as_string(const LilvNode *value)
Definition node.c:357
LILV_API char * lilv_file_uri_parse(const char *uri, char **hostname)
Definition util.c:106
LILV_API void lilv_node_free(LilvNode *val)
Definition node.c:229
LILV_API LilvNode * lilv_plugin_get_author_name(const LilvPlugin *plugin)
Definition plugin.c:922
LILV_API LilvNode * lilv_plugin_get_name(const LilvPlugin *plugin)
Definition plugin.c:498
LILV_API LilvNode * lilv_port_get(const LilvPlugin *plugin, const LilvPort *port, const LilvNode *predicate)
Definition port.c:139
void LilvNodes
Definition lilv.h:97
LILV_API void lilv_free(void *ptr)
Definition util.c:37
struct LilvPluginImpl LilvPlugin
Definition lilv.h:82
struct LilvNodeImpl LilvNode
Definition lilv.h:87
void LilvIter
Definition lilv.h:92
#define LV2_CORE__freeWheeling
http://lv2plug.in/ns/lv2core#freeWheeling
Definition lv2.h:98
#define LV2_CORE__hardRTCapable
http://lv2plug.in/ns/lv2core#hardRTCapable
Definition lv2.h:99
#define LV2_CORE__control
http://lv2plug.in/ns/lv2core#control
Definition lv2.h:92
#define LV2_CORE__latency
http://lv2plug.in/ns/lv2core#latency
Definition lv2.h:104
#define LV2_PARAMETERS__sampleRate
http://lv2plug.in/ns/ext/parameters#sampleRate
Definition parameters.h:51
#define LV2_TIME__framesPerSecond
http://lv2plug.in/ns/ext/time#framesPerSecond
Definition time.h:46
#define LV2_TIME__beat
http://lv2plug.in/ns/ext/time#beat
Definition time.h:41
#define LV2_TIME__frame
http://lv2plug.in/ns/ext/time#frame
Definition time.h:45
#define LV2_TIME__barBeat
http://lv2plug.in/ns/ext/time#barBeat
Definition time.h:39
#define LV2_TIME__beatsPerMinute
http://lv2plug.in/ns/ext/time#beatsPerMinute
Definition time.h:44
#define LV2_TIME__speed
http://lv2plug.in/ns/ext/time#speed
Definition time.h:47
#define LV2_TIME__beatUnit
http://lv2plug.in/ns/ext/time#beatUnit
Definition time.h:42
#define LV2_TIME__beatsPerBar
http://lv2plug.in/ns/ext/time#beatsPerBar
Definition time.h:43
#define LV2_TIME__bar
http://lv2plug.in/ns/ext/time#bar
Definition time.h:40
struct backing_store_struct * info
Definition jmemsys.h:183
#define LV2_KXSTUDIO_PROPERTIES__TimePositionTicksPerBeat
Definition lv2_kxstudio_properties.h:30
unsigned int uint32_t
Definition mid.cpp:100
@ label
Definition juce_AccessibilityRole.h:44
#define false
Definition ordinals.h:83
png_const_structrp png_const_inforp int * unit
Definition png.h:2161
const char *const copyright
Definition CarlaNative.h:260
const char *const name
Definition CarlaNative.h:257
const uint32_t midiOuts
Definition CarlaNative.h:254
const uint32_t audioIns
Definition CarlaNative.h:251
const uint32_t cvIns
Definition CarlaNative.h:302
const uint32_t cvOuts
Definition CarlaNative.h:303
const char *const maker
Definition CarlaNative.h:259
const NativePluginCategory category
Definition CarlaNative.h:248
const uint32_t audioOuts
Definition CarlaNative.h:252
const char *const label
Definition CarlaNative.h:258
const NativePluginHints hints
Definition CarlaNative.h:249
const uint32_t midiIns
Definition CarlaNative.h:253
const uint32_t paramOuts
Definition CarlaNative.h:256
const uint32_t paramIns
Definition CarlaNative.h:255
struct zdirent * file
Definition win32.c:1500
_WDL_CSTRING_PREFIX void INT_PTR count
Definition wdlcstring.h:263
@ ysfx_max_sliders
Definition ysfx.h:52
@ ysfx_section_gfx
Definition ysfx.h:157
@ ysfx_section_sample
Definition ysfx.h:156
@ ysfx_section_block
Definition ysfx.h:155
YSFX_API const char * ysfx_get_author(ysfx_t *fx)
Definition ysfx.cpp:569
YSFX_API ysfx_t * ysfx_new(ysfx_config_t *config)
Definition ysfx.cpp:82
YSFX_API void ysfx_register_builtin_audio_formats(ysfx_config_t *config)
Definition ysfx_config.cpp:105
YSFX_API ysfx_config_t * ysfx_config_new()
Definition ysfx_config.cpp:24
YSFX_API bool ysfx_load_file(ysfx_t *fx, const char *filepath, uint32_t loadopts)
Definition ysfx.cpp:197
YSFX_API void ysfx_guess_file_roots(ysfx_config_t *config, const char *sourcepath)
Definition ysfx_config.cpp:63
YSFX_API uint32_t ysfx_get_num_outputs(ysfx_t *fx)
Definition ysfx.cpp:608
YSFX_API bool ysfx_slider_exists(ysfx_t *fx, uint32_t index)
Definition ysfx.cpp:703
YSFX_API uint32_t ysfx_get_num_inputs(ysfx_t *fx)
Definition ysfx.cpp:600
YSFX_API bool ysfx_has_section(ysfx_t *fx, uint32_t type)
Definition ysfx.cpp:698
YSFX_API void ysfx_set_log_reporter(ysfx_config_t *config, ysfx_log_reporter_t *reporter)
Definition ysfx_config.cpp:111
YSFX_API const char * ysfx_get_name(ysfx_t *fx)
Definition ysfx.cpp:556
YSFX_API void ysfx_set_import_root(ysfx_config_t *config, const char *root)
Definition ysfx_config.cpp:43