我正在尝试构建一个托管vst效果的小程序,我想扫描一个文件夹中的插件dll。
我知道如何找到所有的dll,但现在我有以下问题:
ps:如果有一个库可以为我做所有这些,请告诉我。
答案 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