VST SDK 3.x 开发(一):VST结构介绍

最后都变了- 提交于 2019-12-03 09:41:09

注:所有文章内容均可在VST SDK的doc文件夹中找到英文版。如果你英文非常好可以忽略这个系列的文章直接看原版。本文并不是翻译而是个人对说明文档的理解

一、VST音频插件

VST(Virtual Sound Technology)音频插件是Steinberg公司创造的。简单的说VST技术就是由一个宿主程序(如Cubase,Protools,Audition)提供音频数据块(block)到一个VST插件中,再由插件的编写者在VST插件中对音频数据块进行处理后返回给宿主程序的技术。

二、VST-MA

VST-MA(VST Module Architecture)是用来描述VST插件代码结构的术语。VST的开发类似于COM开发,主要通过接口与外部进行交流,但是VST插件并不是COM,所以目前VST代码只提供C++一种版本,并且不可以被其他语言所重复利用。

VST插件代码的主要结构如下:

首先由宿主程序扫描VST插件所在的文件夹(不同于COM通过注册ID),当用户通过宿主程序启动一个VST插件时,宿主程序通过IPluginFactory接口创建VST插件的实例,然后通过IPluginBase接口对VST插件及插件界面进行初始化或终止,通过IComponent接口获取VST插件的相关信息,然后VST插件通过IAudioProcessor接口与宿主程序进行交互,并在该接口中完成对音频数据的处理和返回。同时,用户还可以通过IEditController接口获得VST插件提供的控制界面,通过该界面可以帮助用户设定音频处理过程中产生的变量。

IComponent和IEditController都继承自IPluginBase,前者表示插件本身,后者表示插件界面,IAudioProcessor继承自FUnknown表示插件处理音频的接口。

以下为宿主程序创建VST插件的代码片段

//------------------------------------------------------------------------
   ...
   // 表示VST插件
   Vst::IComponent* processorComponent;
   // 表示VST插件的界面
   Vst::IEditController* editController;
   // 创建VST插件实例的接口
   IPluginFactory* factory;
   ...
   // 宿主程序启动后会对factory进行初始化
   ...
   // 第一步:通过插件ID创造一个VST插件的实例并赋值给processorComponent
   tresult result = factory->createInstance (classID, Vst::IComponent::iid, (void**)&processorComponent);
   if (processorComponent && (result == kResultOk))
   {
      // 第二步:初始化VST插件
      res = (processorComponent->initialize (gStandardPluginContext) == kResultOk);

      // 第三步:查看插件是否具有Interface(界面)
      if (processorComponent->queryInterface (Vst::IEditController::iid, (void**)&editController) != kResultTrue)
      {
         FUID controllerCID;

         if (processorComponent->getControllerClassId (controllerCID) == kResultTrue && controllerCID.isValid ())
         {     
            // 第四步:如果VST插件包含界面,则创建界面组件并赋值非editController
            result = factory->createInstance (controllerCID, Vst::IEditController::iid, (void**)&editController);
            if (editController && (result == kResultOk))
            {
               // 第五步:初始化VST插件的界面
               res = (editController->initialize (gStandardPluginContext) == kResultOk);
               
               // now processorComponent and editController are initialized... :-)
            }
         }
      }
   }
   //------------------------------------------------------------------------

基本数据结构及接口描述如下

FUID

每一个VST插件以及插件所包含的类都包含一个特定的长度为16字节的ID,叫做FUID,定义在Steinberg::FUID类中

FUnknown

VST插件最基本的接口是FUnknown类似于COM中的IUnknown,接口提供以下功能:

1.所有VST插件相关的类都继承这个接口,接口中包含一个唯一标识符FUID,用来区分这些类。

2.FUnknown接口包含一个可以遍历所有组件的方法。

3.FUnknown接口包含计数器增加、减少以及释放接口的方法,同COM中的IUnknown

IPluginBase

VST插件所继承的接口,这个接口包含两个方法,初始化和终止

IPluginFactory

宿主程序通过这个类的CreateInstance方法,创建一个VST插件的实例

IComponent
该接口包含一个插件的信息,比如获取插件ID,获取\设定插件运行模式,获取\设定插件状态,以及获取\设定声道数量等

IEditController
该接口提供一个界面,同时提供一系列的参数与界面上的控件进行绑定。同时可以通过接口提供的方法获取\设定参数值或者获取\设定界面及控件的状态。由于宿主程序通常由MFC开发,所以VST插件的界面是一个CView类型。

IAudioProcessor

数据处理接口,通过该接口可以设定缓冲大小,修改处理函数指针,设定声道数量。



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!