首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在VST3中构建最小的C++主机

在VST3中构建最小的C++主机
EN

Stack Overflow用户
提问于 2014-06-29 16:49:53
回答 2查看 6.3K关注 0票数 9

我很难找到一个关于如何使用VST3.xSDK设置最小插件主机的基本示例。官方的文件绝对是冗长而简短的,我哪儿也找不到。我想:

  1. 了解最低限度的设置:所需的头、接口以实现,.;
  2. 加载一个VST3插件(暂时没有花哨的GUI );
  3. 打印一些数据(例如插件名、参数、.)。

这将是一个很好的开端:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-30 08:10:44

是的,VST3相当神秘,而且文件记录也不多。好的例子不多,部分原因是除了斯坦伯格之外,没有多少公司真正关心VST3。但是,抛开所有的冷嘲热讽,最好的选择是看看Juce源代码,看看它们实现了一个VST3主机:

VST3PluginFormat.cpp

该包中还有其他几个与VST3 3相关的文件,值得检查。无论如何,这至少应该是足够的信息,让您开始使用VST3主机。

值得注意的是,Juce是GPL (除非您为许可证付费),所以除非您也使用GPL或拥有商业许可证,否则直接向它借用代码是一个很大的禁止-不。只是一个友好的提醒,当一个负责任的程序员时,看看GPL的代码在网上。:)

票数 9
EN

Stack Overflow用户

发布于 2021-08-20 16:09:10

VST中已经存在简单的VST3主机。增加它们并不困难,但有一些事情要记住。

  • VST中public.skd/VST托管下的示例包含一个EditorHost和和AudioHost。第一个处理GUI,第二个处理效果(信号处理)。你可以把两者结合起来。两者都不是全面实施的。
  • VST对象是COM对象,因此必须确保正确设置应用程序上下文,以便COM对象在调用之间保持不变。EditorHost和AudioHost都是在全局上下文变量中的几行(查找pluginContext)中这样做的。
  • 如果使用单独的调用来加载和卸载效果、进程数据等,则必须保留COM对象指针,这样才不会卸载它们。例如,您可能会忽略Steinberg::Vst::模块模块,因为一旦加载了效果,您就不需要它了,但是您必须将指向它的指针保存在全局的某个地方或主应用程序线程中。否则,该指针的自动卸载也将卸载插件,随后对插件的调用也将失败。
  • VST效应的构造比较简单。它们由一个组件(效果)和一个控制器( GUI)组成。在加载Steinberg::Vst::PlugProvider时,将对两者进行实例化(有些效果没有GUI)。上述两个示例都加载了一个插件提供程序。一旦加载了一个插件提供程序,基本上就完成了。

以下代码足以加载插件提供程序(整个效果)。假设返回-1表示错误:

代码语言:javascript
运行
复制
std::string error;
std::string path = "somepath/someeffect.vst3";

VST3::Hosting::Module::Ptr module = 
    VST3::Hosting::Module::create(path, error);
if (! module)
    return -1;

IPtr<PlugProvider> plugProvider; 
VST3::Optional<VST3::UID> effectID = std::move(uid);
for (auto& classInfo : module->
    getFactory().classInfos())
{
    if (classInfo.category() == kVstAudioEffectClass)
    {
        if (effectID)
        {
            if (*effectID != classInfo.ID())
                continue;
        }
            plugProvider = owned(new 
                PlugProvider(module->getFactory(), 
                classInfo, true));
            break;
    }
}

if (! plugProvider)
    return -1;

之后,plugProvider->getComponent()和plugProvider->getController()给出了效果和GUI。当然,控制器必须显示在窗口中,这是在EditorHost中完成的。这些是IComponent、IAudioProcessor和IEditController在VST中的实现。

VST的源代码/VST/testsuite部分将向您展示这两个部分的全部功能(实际上,它将为您提供功能调用,您可以使用这些函数调用来完成您想做的任何事情)。

注意上面代码中加载的模块和plugprovider。如前所述,如果不保留模块指针,就无法保证plugprovider指针能够存活下来。很难跟踪在VST中发布了什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24478173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档