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:
parent
60df98202e
commit
e2ecbde236
1 changed files with 34 additions and 11 deletions
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue