I don't know if that would fit that I would need.
More complex plugins like the Dynamic Waves with 4, 6, or 8 VCOs and Envelops, they have the same number of inputs, outputs but a completely different number of Comtrol Ports.

I was thinking in the simpler line of having 3 different ttls calling the same binaries, but I can't find a way to find a way in the plugin to find out the nunber of port referenced in the ttls.

I could always have 3 ttls with 3 shared objects. Each shared object could call a final shared object where the plugin code could actually be. But I would have to add additional code to find the right index of the right controls port which would increase the amount of cpu resource used or I would have to organise the ports in such a way it wouldn't be very user friendly.

At the end of the day, I don't know if any of your or my solution is worth it compared to just a bit of extra copy/past!

Thanks anyway,

Aurélien





On Fri, Dec 5, 2014 at 5:24 PM, David Robillard <d@drobilla.net> wrote:
On 2014-11-30 07:31, Aurélien Leblond wrote:
> While porting AlsaModularSynth modules to LV2 plugins, I was wondering
> something... AMS has some similar modules where the only thing changing is
>  the number of inputs (Mixer with 2, 4 or 8 inputs), the number of outputs
> (CV source with 2, 4 or 8 outputs) or the number of VCOs/Envs/etc.
> (DynamicWaves with 4, 8 or 16 VCOs).
>
> In AMS there is only one class for such plugins and AMS would pass the
> number of inputs/outputs/sections/etc. when creating the different modules.
> I couldn't find an easy way to reproduce this in LV2 plugins, therefor so
> far I have been creating different LV2 plugins for each and everyone of
> them and doing a lot of copy/past/editing.
>
> That let me to wonder if there wouldn't be a better way.
>
> The pros:
> - it's easier to maintain if I have only one class
> - it's a lot less boring than doing a lot of copy/past/editing - I have
> been doing it only for simple ones so far like Mixers or CV source, but now
> I'm starting to port DynamicWaves which is way more complex
>
> The Cons:
> - I have the feeling that gaining on code simplicity actually decrease the
> performance when the plugin is running - i can imagine it to be less
> strainuous on the CPU to have simple code instead of dealing with loops and
> arrays
>
> Being a rare case I can't imagine the need to have this supported directly
> in LV2, but I was wondering if people with more talent than me in creating
> audio software might have some advice?

AU works this way, but LV2 does not currently have an extension for it.

There are two aspects that I see:

1) Dynamic ports

2) Multiple channels in a single port (one "port", but mono, or stereo,
or whatever)

I don't know if 2 is worth it (additional complexity) but it has some
advantages.  If your number of  ports was actually the same, and you
only change the number of channels, then 2 can be done with just a new
port type (buffer of pointers to buffers or some such).

To do 1 truly dynamically after the plugin has been instantiated would
be quite a burden on hosts, almost all of which assume a static set of
ports for an existing plugin.  We could do it at instantiation time
(probably by passing options) easily enough, though.

The question is, how to actually describe the port (type, value range,
and so on)?  A free for all where you have to completely describe a new
one, or define 'templates' in the data and simply say you want n of
those at instantiation time.

I don't think it would actually be that hard to do, but nobody has
really expressed an active interest in it yet.  Most of the difficulty
would be for hosts, which generally assume they can figure out how many
ports of whatever type(s) exist from looking at the data.  I think it
would need to be done in such a way that the default looks like a normal
non-dynamic-ports plugin so it would work in existing hosts, but smarter
hosts could see the option to tinker with the port signature and do so
if they please.

--
dr