1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-22 01:34:21 +00:00

LV2 Host: Allow fileAllTypesForFile to accept bundle paths as well as bundle URIs

This commit is contained in:
reuk 2023-11-20 13:35:26 +00:00
parent 60df98202e
commit e2ecbde236
No known key found for this signature in database
GPG key ID: FCB43929F012EE5C

View file

@ -1785,6 +1785,13 @@ private:
SupportsTime time = SupportsTime::no;
};
struct FreeString { void operator() (void* ptr) const noexcept { lilv_free (ptr); } };
static File bundlePathFromUri (const char* uri)
{
return File { std::unique_ptr<char, FreeString> { lilv_file_uri_parse (uri, nullptr) }.get() };
}
class Plugins
{
public:
@ -1800,6 +1807,17 @@ public:
return lilv_plugins_get_by_uri (plugins, uri.get());
}
const LilvPlugin* getByFile (const File& file) const
{
for (const auto* plugin : *this)
{
if (bundlePathFromUri (lilv_node_as_uri (lilv_plugin_get_bundle_uri (plugin))) == file)
return plugin;
}
return nullptr;
}
private:
const LilvPlugins* plugins = nullptr;
};
@ -2135,8 +2153,6 @@ private:
JUCE_LEAK_DETECTOR (PortMap)
};
struct FreeString { void operator() (void* ptr) const noexcept { lilv_free (ptr); } };
class PluginState
{
public:
@ -2584,11 +2600,6 @@ public:
auto withPluginUri (URL v) const noexcept { return withMember (*this, &UiInstanceArgs::pluginUri, std::move (v)); }
};
static File bundlePathFromUri (const char* uri)
{
return File { std::unique_ptr<char, FreeString> { lilv_file_uri_parse (uri, nullptr) }.get() };
}
/*
Creates and holds a UI instance for a plugin with a specific URI, using the provided descriptor.
*/
@ -5213,10 +5224,17 @@ public:
void findAllTypesForFile (OwnedArray<PluginDescription>& result,
const String& identifier)
{
auto desc = getDescription (findPluginByUri (identifier));
if (File::isAbsolutePath (identifier))
world->loadBundle (world->newFileUri (nullptr, File::addTrailingSeparator (identifier).toRawUTF8()));
if (desc.fileOrIdentifier.isNotEmpty())
result.add (std::make_unique<PluginDescription> (desc));
for (const auto& plugin : { findPluginByUri (identifier), findPluginByFile (identifier) })
{
if (auto desc = getDescription (plugin); desc.fileOrIdentifier.isNotEmpty())
{
result.add (std::make_unique<PluginDescription> (desc));
break;
}
}
}
bool fileMightContainThisPluginType (const String& file) const
@ -5226,7 +5244,7 @@ public:
const auto numBytes = file.getNumBytesAsUTF8();
std::vector<uint8_t> vec (numBytes + 1, 0);
std::copy (data, data + numBytes, vec.begin());
return serd_uri_string_has_scheme (vec.data());
return serd_uri_string_has_scheme (vec.data()) || file.endsWith (".lv2");
}
String getNameOfPluginFromIdentifier (const String& identifier)
@ -5488,6 +5506,11 @@ private:
return world->getAllPlugins().getByUri (world->newUri (s.toRawUTF8()));
}
const LilvPlugin* findPluginByFile (const File& f)
{
return world->getAllPlugins().getByFile (f);
}
template <typename Fn>
void visitParentClasses (const LilvPluginClass* c, Fn&& fn) const
{