【问题标题】:How do I scan/enumerate vst plugin dlls?如何扫描/枚举 vst 插件 dll?
【发布时间】:2010-11-10 20:48:14
【问题描述】:

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

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

ps:如果有可以为我完成所有这些工作的库,请告诉我。

【问题讨论】:

  • 您愿意分享您的一些主机代码吗?尝试自己创建一个 vst 主机,不知道从哪里开始。
  • @DanielRodrigues 我在github.com/teragonaudio/MrsWatson有一个开源 VST 主机

标签: dll audio vst


【解决方案1】:

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

要确定 VST 是否为 shell 插件,请将effGetPlugCategory 操作码发送到插件调度程序。如果它返回kPlugCategShell,那么它是一个shell 插件。要获取 shell 中的子插件列表,您基本上调用 effShellGetNextPlugin 直到它返回 0。示例代码片段(改编自 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 存储到加载全局变量,因为您将无法及时保存指向 AEffect 结构的 void* user 字段中任何有意义数据的指针,以便在主机回调中将其传回给您。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如何确定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。

      【讨论】:

      • 感谢您的回答。只是有些东西我没有完全理解。假设我找到了一个不是插件但导出“main”(这似乎是一个很常见的名称......)的 dll,然后从中返回一些东西。如果我尝试取消引用该值以查找“VstP”,我不会遇到麻烦吗?
      • 可能。您当然会检查指针是否非零。您也可以考虑检查是否调用了您的回调。用户将恶意 DLL 存储在他们的 VSTPlugIns 文件夹中是没有意义的。
      • @DaveGamble 是的,我主要担心的是恶意代码。好答案!
      猜你喜欢
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      相关资源
      最近更新 更多