如何扫描/枚举vst插件dll?

时间:2009-07-15 01:34:38

标签: dll audio vst

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

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

ps:如果有一个库可以为我做所有这些,请告诉我。

3 个答案:

答案 0 :(得分:8)

如何确定VST插件?

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

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

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

Shell VST更复杂:

类别将是kPlugCategShell

支持“shellCategory”canDo。

使用effShellGetNextPlugin枚举。

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

答案 1 :(得分:3)

@Dave Gamble对此进行了修改,但我想在VST shell插件上添加一些内容,因为它们使用起来有点棘手。

要确定VST是否为shell插件,请将effGetPlugCategory操作码发送给插件调度程序。如果它返回kPlugCategShell,那么它是一个shell插件。要获取shell中的子插件列表,基本上调用effShellGetNextPlugin直到它返回0.示例代码snippit(改编自working VST host):

// 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。

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

答案 2 :(得分:1)

如果您想在.NET中开发VST主机应用程序,请查看VST.NET