我正在尝试构建一个托管 vst 效果的小程序,并且我想扫描文件夹中的插件 dll。
我知道如何找到所有 dll,但现在我有以下问题:

  • 确定给定 dll 是否是 vst 插件的最佳方法是什么?
    我试图看看 ddl 是否导出正确的函数,这对于使用较新版本的 vst sdk 制作的插件来说效果很好,因为它导出一个名为“VstPluginMain”的方法,但旧版本导出一个相当通用的“main”函数。
  • 如何确定插件是效果器还是乐器?
  • 如何扫描 vst shell 插件?
    Shell 插件基本上是包含多种效果的 dll。Waves Audio 制作的插件就是一个例子 http://www.waves.com/

附:如果有一个图书馆可以为我完成所有这些工作,请告诉我。

有帮助吗?

解决方案

如何确定VST插件?

找到 main/VSTPluginMain 后...叫它!如果返回的是NULL,则它不是VST。如果返回的是指向字节“VstP”的指针(请参阅 VstInt32 magic; ///< must be #kEffectMagic ('VstP') 在 aeffect.h 中),那么你就有了一个 VST。

VSTPluginMain 返回指向 AEffect 结构的指针。您将需要查看此结构。

效果器还是乐器? AEffect::flags | (effFlagsIsSynth = 1 << 8)

Shell VST 更为复杂:

类别将为 kPlugCaegShell

支持“shellCategory”canDo。

使用 effShellGetNextPlugin 进行枚举。

例如,使用您想要的 ID 在回调中响应 audioMasterCurrentId。

其他提示

@Dave Gamble 搞定了,但我想在 VST shell 插件上添加一些东西,因为它们使用起来有点棘手。

要确定 VST 是否是 shell 插件,请发送 effGetPlugCategory 插件调度程序的操作码。如果返回的话 kPlugCategShell, ,那么它就是一个shell插件。要获取 shell 中的子插件列表,您基本上可以调用 effShellGetNextPlugin 直到返回0。示例代码片段(改编自 工作 VST 主机):

// All this stuff should probably be set up far earlier in your code...
// This assumes that you have already opened the plugin and called VSTPluginMain()
typedef VstIntPtr (*Vst2xPluginDispatcherFunc)(AEffect *effect, VstInt32 opCode, VstInt32 index, VstIntPtr value, void *ptr, float opt);
Vst2xPluginDispatcherFunc dispatcher;
AEffect* plugin;
char nameBuffer[40];

while(true) {
  memset(nameBuffer, 0, 40);
  VstInt32 shellPluginId = dispatcher(pluginHandle, effShellGetNextPlugin, 0, 0, nameBuffer, 0.0f);
  if(shellPluginId == 0 || nameBuffer[0] == '\0') {
    break;
  }
  else {
    // Do something with the name and ID
  }
}

如果您确实想在 VST shell 中加载插件,那就有点棘手了。首先,您的主机需要处理 audioMasterCurrentId 主机回调中的操作码。当您致电 VST 时 VSTPluginMain() 方法来实例化插件,它将使用此操作码调用主机回调并询问应加载的唯一 ID。

因为这个回调是进行的 main 函数返回(因此,在它传递一个 AEffect* 到您的主机),这意味着您可能需要存储 shell 插件 ID 以加载到全局变量中,因为您将无法保存指向任何有意义数据的指针 void* user 领域的 AEffect struct 及时将其在主机回调中传递回给您。

如果您想在 .NET 中开发 VST Host 应用程序,请查看 伟仕网络

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top