# VST3 interfaces

See
[docs/vst3.md](https://github.com/robbert-vdh/yabridge/blob/master/docs/vst3.md)
for more information on how the serialization works.

The following interfaces are not yet implemented:

- Every interface introduced after VST 3.0.1 with the exceptons of
  `IEditController2` and `INoteExpressionController` which has already been
  implemented
- The [Presonus extensions](https://presonussoftware.com/en_US/developer),
  although most of these things seem to overlap with newer VST3 interfaces

VST3 plugin interfaces are implemented as follows:

| yabridge class               | Included in         | Interfaces                                             |
| ---------------------------- | ------------------- | ------------------------------------------------------ |
| `YaPluginFactory`            |                     | `IPluginFactory`, `IPluginFactory2`, `IPluginFactory3` |
| `Vst3ConnectionPointProxy`   |                     | `IConnectionPoint` through `YaConnectionPoint`         |
| `Vst3PlugViewProxy`          |                     | All of the below:                                      |
| `YaPlugView`                 | `Vst3PlugViewProxy` | `IPlugView`                                            |
| `Vst3PluginProxy`            |                     | All of the below:                                      |
| `YaAudioProcessor`           | `Vst3PluginProxy`   | `IAudioProcessor`                                      |
| `YaComponent`                | `Vst3PluginProxy`   | `IComponent`                                           |
| `YaConnectionPoint`          | `Vst3PluginProxy`   | `IConnectionPoint`                                     |
| `YaEditController`           | `Vst3PluginProxy`   | `IEditController`                                      |
| `YaEditController2`          | `Vst3PluginProxy`   | `IEditController2`                                     |
| `YaMidiMapping`              | `Vst3PluginProxy`   | `IMidiMapping`                                         |
| `YaNoteExpressionController` | `Vst3PluginProxy`   | `INoteExpressionController`                            |
| `YaPluginBase`               | `Vst3PluginProxy`   | `IPluginBase`                                          |
| `YaProgramListData`          | `Vst3PluginProxy`   | `IProgramListData`                                     |
| `YaUnitData`                 | `Vst3PluginProxy`   | `IUnitData`                                            |
| `YaUnitInfo`                 | `Vst3PluginProxy`   | `IUnitInfo`                                            |

VST3 host interfaces are implemented as follows:

| yabridge class              | Included in                 | Interfaces          |
| --------------------------- | --------------------------- | ------------------- |
| `Vst3HostContextProxy`      |                             | All of the below:   |
| `YaHostApplication`         | `Vst3HostContextProxy`      | `IHostApplication`  |
| `Vst3ComponentHandlerProxy` |                             | All of the below:   |
| `YaComponentHandler`        | `Vst3ComponentHandlerProxy` | `IComponentHandler` |
| `YaUnitHandler`             | `Vst3ComponentHandlerProxy` | `IUnitHandler`      |
| `Vst3PlugFrameProxy`        |                             | All of the below:   |
| `YaPlugFrame`               | `Vst3PlugFrameProxy`        | `IPlugFrame`        |

The following host interfaces are passed as function arguments and are thus also
implemented for serialization purposes:

| yabridge class       | Interfaces          | Notes                                                                  |
| -------------------- | ------------------- | ---------------------------------------------------------------------- |
| `YaAttributeList`    | `IAttributeList`    |                                                                        |
| `YaEventList`        | `IEventList`        | Comes with a lot of serialization wrappers around the related structs. |
| `YaMessage`          | `IMessage`          |                                                                        |
| `YaMessagePtr`       | `IMessage`          | Should be used in inter process communication to exchange messages     |
| `YaParameterChanges` | `IParameterChanges` |                                                                        |
| `YaParamValueQueue`  | `IParamValueQueue`  |                                                                        |
| `VectorStream`       | `IBStream`          | Used for serializing data streams.                                     |

And finally `YaProcessData` uses the above along with `YaAudioBusBuffers` to
wrap around `ProcessData`.
