Domanda

Sto cercando di costruire un piccolo programma che ospita gli effetti VST e vorrei per la scansione di una cartella per il plugin DLL.
So come trovare tutte le DLL, ma ora ho le seguenti domande:

  • Qual è il modo migliore per determinare se una data dll è un plug-in VST?
    Ho provato a vedere solo se il ddl esporta la funzione e questo funziona bene per i plugin realizzati con le più recenti versioni del SDK vst in quanto esporta un metodo chiamato "VstPluginMain", ma le versioni più vecchie esportare una funzione piuttosto generico "principale".
  • Come faccio a determinare se il plugin è un effetto o uno strumento?
  • Come si esegue la scansione dei plugin VST shell?
    plugin Shell sono fondamentalmente DLL che contengono in qualche modo più effetti. Un esempio di questo sono i plugin effettuati dalle onde http://www.waves.com/

ps:. Se c'è una libreria che può fare tutto questo per me per favore fatemelo sapere

È stato utile?

Soluzione

Come determinare un plug-in VST?

Una volta trovato principale / VSTPluginMain ... chiamarlo! Se ciò che è restituito è NULL, non è un VST. Se ciò che è restituito è un puntatore al byte "VstP" (vedi VstInt32 magic; ///< must be #kEffectMagic ('VstP') in aeffect.h), allora avete un VST.

Il VSTPluginMain restituisce un puntatore a una struttura AEffect. Avrete bisogno di guardare questa struttura.

Effetto o uno strumento? AEffect::flags | (effFlagsIsSynth = 1 << 8)

Shell VST sono più complesse:

Categoria sarà kPlugCategShell

Sostenere la "shellCategory" Cando.

Usa effShellGetNextPlugin per enumerare.

Per esempio, rispondere a audioMasterCurrentId nel vostro richiamata con l'ID che si desidera.

Altri suggerimenti

@ Dave Gamble inchiodato, ma ho voluto aggiungere un paio di cose sulla plugin VST shell, dal momento che sono un po 'difficile da lavorare.

Per determinare se un VST è un plugin conchiglia, inviare il codice operativo effGetPlugCategory al dispatcher plugin. Se restituisce kPlugCategShell, allora è un plug-in guscio. Per ottenere l'elenco di sub-plugins nella shell, che, fondamentalmente, chiami effShellGetNextPlugin fino a quando non restituisce 0. Esempio di codice snippit (adattato da un VST lavora ospite ):

// 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
  }
}

Se si vuole realmente caricare un plugin in un guscio di VST, è un po 'più complicato. In primo luogo, il vostro ospite ha bisogno per gestire il codice operativo audioMasterCurrentId nella richiamata ospite. Quando si chiama il metodo VSTPluginMain() del VST per istanziare il plugin, si chiamerà il callback host con questo codice operativo e chiedere l'ID univoco che deve essere caricato.

Perché questo callback è fatto prima le principali restituisce la funzione (e, di conseguenza, prima che eroga una AEffect* al vostro ospite), il che significa che probabilmente sarà necessario memorizzare l'ID shell plugin per caricare una variabile globale, dal momento che non sarà in grado di salvare un puntatore a tutti i dati significativi nel campo void* user della struct AEffect in tempo per poter essere ripassato a voi nel callback host.

Se si vuole sviluppare l'applicazione host VST in .NET dare un'occhiata a VST.NET

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top