1. 程式人生 > >VST SDK 3.x 開發(一):VST結構介紹

VST SDK 3.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外掛的程式碼片段

//------------------------------------------------------------------------
   ...
   // 表示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 資料處理介面,通過該介面可以設定緩衝大小,修改處理函式指標,設定聲道數量。