Browse Source

Add support for hosting staticly linked VSTs

tags/2021-05-28
hogliux 9 years ago
parent
commit
1696c23fb9
4 changed files with 52 additions and 14 deletions
  1. +2
    -2
      modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp
  2. +47
    -11
      modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
  3. +1
    -1
      modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h
  4. +2
    -0
      modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp

+ 2
- 2
modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp View File

@@ -65,7 +65,7 @@ void AudioPluginFormatManager::addDefaultFormats()
// you should only call this method once!
for (int i = formats.size(); --i >= 0;)
{
#if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)
#if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_IOS)
jassert (dynamic_cast<VSTPluginFormat*> (formats[i]) == nullptr);
#endif
@@ -87,7 +87,7 @@ void AudioPluginFormatManager::addDefaultFormats()
formats.add (new AudioUnitPluginFormat());
#endif
#if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)
#if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_IOS)
formats.add (new VSTPluginFormat());
#endif


+ 47
- 11
modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp View File

@@ -22,7 +22,7 @@
==============================================================================
*/
#if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)
#if JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_IOS)
//==============================================================================
#if JUCE_MAC && JUCE_SUPPORT_CARBON
@@ -165,7 +165,7 @@ namespace
{
#if JUCE_WINDOWS
return timeGetTime() * 1000000.0;
#elif JUCE_LINUX
#elif JUCE_LINUX || JUCE_IOS
timeval micro;
gettimeofday (&micro, 0);
return micro.tv_usec * 1000.0;
@@ -378,7 +378,7 @@ public:
{
getActiveModules().add (this);
#if JUCE_WINDOWS || JUCE_LINUX
#if JUCE_WINDOWS || JUCE_LINUX || JUCE_IOS
fullParentDirectoryPathName = f.getParentDirectory().getFullPathName();
#elif JUCE_MAC
FSRef ref;
@@ -394,9 +394,12 @@ public:
}
//==============================================================================
#if JUCE_WINDOWS || JUCE_LINUX
DynamicLibrary module;
#if ! JUCE_MAC
String fullParentDirectoryPathName;
#endif
#if JUCE_WINDOWS || JUCE_LINUX
DynamicLibrary module;
bool open()
{
@@ -460,11 +463,14 @@ public:
return String();
}
#endif
#else
#else
Handle resHandle;
CFBundleRef bundleRef;
#if JUCE_MAC
CFBundleRefNum resFileId;
FSSpec parentDirFSSpec;
ResFileRefNum resFileId;
#endif
bool open()
{
@@ -510,13 +516,18 @@ public:
if (pluginName.isEmpty())
pluginName = file.getFileNameWithoutExtension();
#if JUCE_MAC
resFileId = CFBundleOpenBundleResourceMap (bundleRef);
#endif
ok = true;
Array<File> vstXmlFiles;
file.getChildFile ("Contents")
file
#if JUCE_MAC
.getChildFile ("Contents")
.getChildFile ("Resources")
#endif
.findChildFiles (vstXmlFiles, File::findFiles, false, "*.vstxml");
if (vstXmlFiles.size() > 0)
@@ -541,7 +552,9 @@ public:
{
if (bundleRef != 0)
{
#if JUCE_MAC
CFBundleCloseBundleResourceMap (bundleRef, resFileId);
#endif
if (CFGetRetainCount (bundleRef) == 1)
CFBundleUnloadExecutable (bundleRef);
@@ -556,7 +569,7 @@ public:
eff->dispatcher (eff, effClose, 0, 0, 0, 0);
}
#endif
#endif
private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModuleHandle)
@@ -875,7 +888,12 @@ public:
}
//==============================================================================
#if JUCE_IOS
bool hasEditor() const override { return false; }
#else
bool hasEditor() const override { return effect != nullptr && (effect->flags & effFlagsHasEditor) != 0; }
#endif
AudioProcessorEditor* createEditor() override;
//==============================================================================
@@ -1806,6 +1824,7 @@ private:
};
//==============================================================================
#if ! JUCE_IOS
class VSTPluginWindow;
static Array<VSTPluginWindow*> activeVSTWindows;
@@ -2544,7 +2563,7 @@ private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginWindow)
};
#endif
#if JUCE_MSVC
#pragma warning (pop)
#endif
@@ -2552,8 +2571,12 @@ private:
//==============================================================================
AudioProcessorEditor* VSTPluginInstance::createEditor()
{
#if JUCE_IOS
return nullptr;
#else
return hasEditor() ? new VSTPluginWindow (*this)
: nullptr;
#endif
}
//==============================================================================
@@ -2690,7 +2713,7 @@ bool VSTPluginFormat::fileMightContainThisPluginType (const String& fileOrIdenti
{
const File f (File::createFileWithoutCheckingPath (fileOrIdentifier));
#if JUCE_MAC
#if JUCE_MAC || JUCE_IOS
return f.isDirectory() && f.hasFileExtension (".vst");
#elif JUCE_WINDOWS
return f.existsAsFile() && f.hasFileExtension (".dll");
@@ -2765,6 +2788,19 @@ FileSearchPath VSTPluginFormat::getDefaultLocationsToSearch()
paths.add (WindowsRegistry::getValue ("HKEY_LOCAL_MACHINE\\Software\\VST\\VSTPluginsPath",
programFiles + "\\VstPlugins"));
return paths;
#elif JUCE_IOS
// on iOS you can only load plug-ins inside the hosts bundle folder
CFURLRef relativePluginDir = CFBundleCopyBuiltInPlugInsURL (CFBundleGetMainBundle());
CFURLRef pluginDir = CFURLCopyAbsoluteURL (relativePluginDir);
CFRelease (relativePluginDir);
CFStringRef path = CFURLCopyFileSystemPath (pluginDir, kCFURLPOSIXPathStyle);
CFRelease (pluginDir);
FileSearchPath retval (String (CFStringGetCStringPtr (path, kCFStringEncodingUTF8)));
CFRelease (path);
return retval;
#endif
}


+ 1
- 1
modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h View File

@@ -22,7 +22,7 @@
==============================================================================
*/
#if (JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)) || DOXYGEN
#if (JUCE_PLUGINHOST_VST && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_IOS)) || DOXYGEN
//==============================================================================
/**


+ 2
- 0
modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp View File

@@ -348,8 +348,10 @@ public:
if (path.getNumPaths() > 0) // if the path is empty, then paths aren't used for this format.
{
#if ! JUCE_IOS
if (propertiesToUse != nullptr)
path = getLastSearchPath (*propertiesToUse, formatToScan);
#endif
pathList.setSize (500, 300);
pathList.setPath (path);


Loading…
Cancel
Save