VSTSDK3.x开发(⼀):VST结构介绍
注:所有⽂章内容均可在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插件的代码⽚段
/
/------------------------------------------------------------------------sdk
...
// 表⽰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 :-)
}
}
}
}
//------------------------------------------------------------------------
基本数据结构及接⼝描述如下
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
数据处理接⼝,通过该接⼝可以设定缓冲⼤⼩,修改处理函数指针,设定声道数量。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。