我试图建立一个小程序,托管vst效果,我想扫描一个文件夹的插件dll。
我知道如何找到所有的all,但现在我有以下问题:
如果有一个图书馆可以为我做所有这一切,请告诉我。
发布于 2009-07-15 02:49:37
如何确定VST插件?
一旦你找到main/VSTPluginMain..。快说啊!如果返回的内容为NULL,则它不是VST。如果返回的是一个指向字节"VstP“的指针(参见aEfft.h中的VstInt32 magic; ///< must be #kEffectMagic ('VstP') ),那么您将得到一个VST。
VSTPluginMain返回指向AEffect结构的指针。您将需要查看这个结构。
效果还是工具?AEffect::flags | (effFlagsIsSynth = 1 << 8)
Shell VST更复杂:
类别为kPlugCategShell
支持"shellCategory“canDo。
使用effShellGetNextPlugin枚举。
例如,使用所需的ID响应回调中的audioMasterCurrentId。
发布于 2013-05-17 16:09:01
@Dave做得不错,但我想在VST插件上添加一些东西,因为它们的使用有点棘手。
若要确定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外壳中加载一个插件,那就有点棘手了。首先,主机需要处理主机回调中的audioMasterCurrentId操作码。当您调用VST的VSTPluginMain()方法实例化插件时,它将使用此操作代码调用主机回调,并询问应该加载的唯一ID。
由于此回调是在主函数返回之前进行的(因此,在将AEffect*传递给主机之前),这意味着您可能需要将外壳插件ID存储在全局变量中,因为您无法及时在AEffect结构的void* user字段中保存指向任何有意义数据的指针,以便在主机回调中将其传回给您。
发布于 2010-02-03 11:56:10
如果您想在.NET中开发VST主机应用程序,请看一下VST.NET
https://stackoverflow.com/questions/1128958
复制相似问题