注:所有文章内容均可在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