10

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

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

ps:如果有图书馆可以为我完成所有这些,请告诉我。

4

3 回答 3

9

如何确定 VST 插件?

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

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

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

Shell VST 更复杂:

类别将是 kPlugCategShell

支持“shellCategory”canDo。

使用 effShellGetNextPlugin 枚举。

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

于 2009-07-15T02:49:37.520 回答
3

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

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

于 2013-05-17T16:09:01.883 回答
1

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

于 2010-02-03T11:56:10.717 回答