@Dave Gamble はうまくいきましたが、VST シェル プラグインは扱いが少し難しいので、いくつか追加したいと思いました。
VST がシェル プラグインかどうかを判断するには、effGetPlugCategoryオペコードをプラグイン ディスパッチャに送信します。が返された場合kPlugCategShell、それはシェル プラグインです。シェルでサブプラグインのリストを取得するには、基本的に、effShellGetNextPlugin0 が返されるまで呼び出します。サンプル コード スニペット (動作中の 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] == '\0') {
break;
}
else {
// Do something with the name and ID
}
}
実際にプラグインを VST シェルにロードしたい場合は、少しトリッキーです。まず、ホストaudioMasterCurrentIdはホスト コールバックでオペコードを処理する必要があります。プラグインをインスタンス化するために VST のVSTPluginMain()メソッドを呼び出すと、このオペコードでホスト コールバックが呼び出され、ロードする必要がある一意の ID が要求されます。
このコールバックはメイン関数が戻る前(つまり、ホストに を配信する前AEffect*) に行われるため、ロードするシェル プラグイン ID をグローバル変数に保存する必要があることを意味します。ホストコールバックで返されるのに間に合うようにvoid* user、構造体のフィールドに意味のあるデータへのポインターを保存します。AEffect