2009-07-15 95 views
8

我正在嘗試構建一個託管vst效果的小程序,我想掃描一個文件夾以查看插件dll。
我知道如何找到所有的DLL,但現在我有以下問題:如何掃描/枚舉vst插件dll?

  • 什麼是確定給定的dll是一個VST插件的最好方法?
    我試圖看看ddl是否導出了正確的函數,這對於使用vst sdk的更新版本所做的插件來說很好,因爲它導出了一個名爲「VstPluginMain」的方法,但是舊版本導出了一個相當通用的「main」函數。
  • 如何確定插件是效果器還是樂器?
  • 如何掃描vst shell插件?
    Shell插件基本上是以某種方式包含多個效果的dll。一個例子是由Waves Audio製作的插件http://www.waves.com/

ps:如果有一個庫可以爲我做所有這些,請讓我知道。

+0

你願意分享一些你的主機代碼嗎?試圖自己創建一個vst主機,不知道從哪裏開始。 – 2011-05-26 14:02:02

+0

@DanielRodrigues我在http://github.com/teragonaudio/MrsWatson/ – 2013-05-17 16:00:10

回答

7

如何確定一個VST插件?

一旦找到main/VSTPluginMain ...調用它! 如果返回的是NULL,它不是VST。 如果返回的是指向字節「VstP」的指針(請參閱aeffect.h中的VstInt32 magic; ///< must be #kEffectMagic ('VstP')),那麼您有VST。

VSTPluginMain返回一個指向AEffect結構的指針。你需要看看這個結構。

效果還是樂器? AEffect::flags | (effFlagsIsSynth = 1 << 8)

殼牌VSTS比較複雜:

類別將kPlugCategShell

支持的 「shellCategory」 劍度。

使用effShellGetNextPlugin枚舉。

例如,用您想要的ID在您的回調中迴應audioMasterCurrentId。

3

@戴夫寶潔釘,但我想補充的VST插件殼的幾件事情,因爲他們是有點棘手跟...共事。

要確定VST是否是shell插件,請將effGetPlugCategory操作碼發送到插件調度程序。如果它返回kPlugCategShell,那麼它是一個shell插件。爲了獲得在shell子插件列表,你基本上調用effShellGetNextPlugin,直到它返回0。示例代碼片段(改編自working VST host):

// All this stuff should probably be set up far earlier in your code... 
// This assumes that you have already opened the plugin and called VSTPluginMain() 
typedef VstIntPtr (*Vst2xPluginDispatcherFunc)(AEffect *effect, VstInt32 opCode, VstInt32 index, VstIntPtr value, void *ptr, float opt); 
Vst2xPluginDispatcherFunc dispatcher; 
AEffect* plugin; 
char nameBuffer[40]; 

while(true) { 
    memset(nameBuffer, 0, 40); 
    VstInt32 shellPluginId = dispatcher(pluginHandle, effShellGetNextPlugin, 0, 0, nameBuffer, 0.0f); 
    if(shellPluginId == 0 || nameBuffer[0] == '\0') { 
    break; 
    } 
    else { 
    // Do something with the name and ID 
    } 
} 

如果你確實想在VST外殼加載插件,這有點棘手。首先,您的主機需要處理主機回調中的audioMasterCurrentId操作碼。當您調用VST的VSTPluginMain()方法來實例化插件時,它將使用此操作碼調用主機回調並請求應加載的唯一ID。

因爲這個回調是由主函數返回之前(因此,它提供了一個AEffect*到你的主機之前),這意味着你可能會需要存儲的外殼插件ID在一個全局變量來加載,因爲你不能在主機回調中將指針保存在AEffect結構體的void* user字段中,以及時將其返回給你。