Как сканировать / перечислять DLL плагинов vst?
Я пытаюсь создать небольшую программу, в которой размещаются эффекты vst, и я хотел бы сканировать папку для DLL плагинов.
Я знаю, как найти все библиотеки DLL, но теперь у меня есть следующие вопросы:
- каков наилучший способ определить, является ли данная dll плагином vst?
Я попытался просто посмотреть, экспортирует ли ddl правильную функцию, и это отлично работает для плагинов, сделанных с более поздними версиями VST sdk, поскольку он экспортирует метод под названием "VstPluginMain", но более старые версии экспортируют довольно общую" основную " функцию. - как определить, является ли плагин эффектом или инструментом?
- как сканировать Плагины оболочки vst?
Плагины оболочки-это в основном DLL, которые каким-то образом содержат несколько эффектов. Примером этого являются Плагины, сделанные Waves Audio http://www.waves.com/
PS: Если есть библиотека, которая может делать все это для меня пожалуйста, дайте мне знать.
3 ответов
Как определить плагин VST?
Как только вы нашли main / VSTPluginMain... называют его!
Если возвращаемое значение равно NULL, это не VST.
Если возвращается указатель на байты " VstP "(см. VstInt32 magic; ///< must be #kEffectMagic ('VstP')
in aeffect.h), тогда у вас есть VST.
VSTPluginMain возвращает указатель на структуру AEffect. Вам нужно будет взглянуть на эту структуру.
эффект или инструмент? AEffect::flags | (effFlagsIsSynth = 1 << 8)
оболочки VSTs являются более сложными:
@Dave Gamble прибил его, но я хотел добавить несколько вещей на Плагины VST shell, так как с ними немного сложно работать.
чтобы определить, является ли VST плагином оболочки, отправьте effGetPlugCategory
код операции диспетчера плагинов. Если он вернется kPlugCategShell
, тогда это плагин оболочки. Чтобы получить список суб-плагинов в оболочке, вы в основном вызываете effShellGetNextPlugin
пока не вернется 0. Пример фрагмента кода (адаптирован из рабочий хост VST):
// 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] == '') {
break;
}
else {
// Do something with the name and ID
}
}
если вы на самом деле хотите загрузить плагин в оболочку VST, это немного сложнее. Во-первых, ваш хост должен обрабатывать audioMasterCurrentId
код операции в обратном вызове хоста. Когда вы вызываете VST VSTPluginMain()
метод для создания экземпляра плагина он вызовет обратный вызов хоста с помощью этого кода операции и запросит уникальный идентификатор, который должен быть загружен.
потому что этот обратный вызов до основная функция возвращает (и, следовательно, прежде чем она доставит AEffect*
для вашего хоста), это означает, что вы, вероятно, будете необходимо сохранить идентификатор плагина оболочки для загрузки в глобальную переменную, так как вы не сможете сохранить указатель на какие-либо значимые данные в
Если вы хотите развить ваши VST хост-приложения .Чистая взглянем на VST.NET