2009-07-15 6 views
8

J'essaye de construire un petit programme qui accueille des effets de VST et je voudrais scanner un dossier pour des dll de plugin.
Je sais comment trouver tous les dll, mais maintenant j'ai les questions suivantes:Comment numériser/énumérer les dll de plugin vst?

  • Quelle est la meilleure façon de déterminer si une dll donnée est un plugin vst?
    J'ai essayé de voir si le ddl exporte la bonne fonction et cela fonctionne bien pour les plugins faits avec les versions plus récentes de vst sdk car il exporte une méthode appelée "VstPluginMain" mais les anciennes versions exportent une fonction "principale" plutôt générique .
  • Comment déterminer si le plugin est un effet ou un instrument?
  • Comment analyser les plugins vst shell?
    Les plugins shell sont essentiellement des dll qui contiennent d'une manière ou d'une autre plusieurs effets. Un exemple de ceci sont les plugins faits par Waves Audio http://www.waves.com/

ps: S'il y a une bibliothèque qui peut faire tout cela pour moi s'il vous plaît faites le moi savoir.

+0

Seriez-vous prêt à partager une partie de votre code hôte? Essayer de créer un hôte vst moi-même, aucune idée par où commencer. –

+0

@DanielRodrigues J'ai un hôte VST open-source à http://github.com/teragonaudio/MrsWatson/ –

Répondre

7

Comment déterminer un plug-in VST?

Une fois que vous avez trouvé main/VSTPluginMain ... appelez-le! Si ce qui est retourné est NULL, ce n'est pas un VST. Si ce qui est retourné est un pointeur vers les octets "VstP" (voir VstInt32 magic; ///< must be #kEffectMagic ('VstP') dans aeffect.h), alors vous avez un VST.

Le VSTPluginMain renvoie un pointeur vers une structure AEffect. Vous aurez besoin de regarder cette structure.

Effet ou instrument? AEffect::flags | (effFlagsIsSynth = 1 << 8)

Shell VSTs sont plus complexes:

Catégorie sera kPlugCategShell

Soutenir le "shellCategory" Cando.

Utilisez effShellGetNextPlugin pour énumérer.

Par exemple, répondez à audioMasterCurrentId dans votre rappel avec l'ID que vous voulez.

+0

Merci pour la réponse. Il y a juste quelque chose que je ne comprends pas complètement. Supposons que je trouve une DLL qui n'est pas un plugin mais qui exporte "main" (ce qui semble un nom assez commun ...) et qui retourne quelque chose. Est-ce que je ne vais pas avoir de problèmes si j'essaie de déréférencer cette valeur à la recherche de "VstP"? – Roald

+1

Potentiellement. Vous vérifieriez certainement si le pointeur était différent de zéro. Vous pouvez également envisager de vérifier si votre rappel a été appelé. Il serait peu logique pour un utilisateur d'avoir stocké une DLL malveillante dans son dossier VSTPlugIns. –

+0

A droite, le rappel ... merci beaucoup !! – Roald

1

Si vous souhaitez développer votre application hôte VST dans .NET jeter un oeil à VST.NET

3

@ Dave Gamble cloués, mais je voulais ajouter quelques petites choses sur les plugins shell VST, car ils sont un peu délicat travailler avec.

Pour déterminer si un VST est un plug-in shell, envoyez l'opcode effGetPlugCategory au répartiteur de plug-ins. Si elle renvoie kPlugCategShell, alors il s'agit d'un plugin shell. Pour obtenir la liste des sous-plugins dans le shell, vous appelez essentiellement effShellGetNextPlugin jusqu'à ce qu'il retourne 0. Exemple de code snippit (adapté d'un 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 
    } 
} 

Si vous voulez vraiment charger un plug-in dans un shell VST , c'est un peu plus compliqué. Tout d'abord, votre hôte doit gérer l'opcode audioMasterCurrentId dans le rappel de l'hôte. Lorsque vous appelez la méthode VSTPluginMain() de VST pour instancier le plugin, il appelle le rappel de l'hôte avec cet opcode et demande l'ID unique qui doit être chargé.

Parce que ce rappel est fait avant les principaux retours de fonction (et, par conséquent, avant de transmettre un AEffect* à votre hôte), cela signifie que vous aurez probablement besoin de stocker l'ID de plugin shell pour charger dans une variable globale, car vous ne pourrez pas enregistrer de pointeur sur des données significatives dans le champ void* user de la structure AEffect à temps pour qu'il vous soit renvoyé dans le rappel de l'hôte.

Questions connexes