Hi Tim,
I like the style of your proposed API. A few comments:
*) Scope: your stated goal is to produce an API that is "full-featured
enough to be the primary plugin system for an audio-development
application". I think it would be more correct to say that this is
an API designed for virtual instrument plugins, with a programmatic
rather than GUI interface (as LADSPA is for effects plugins).
This is not a bad thing, in fact I think we are better served with
small, focussed plugin APIs for specific tasks -- and virtual
instruments and effects are two very worthwhile specific tasks.
Also, there are plugins that cannot be accomodated by this API; eg.
causal plugins (eg. reversal of large buffers), plugins for which
nsamples in != nsamples out (eg. time stretching and rate conversion),
and plugins which need to do a number of passes (eg. GWC's noise
reduction needs to profile some quiet data in a first pass); not to
mention that this plugin implies time domain manipulation only.
I don't think the scope of your API should be expanded to include
these, as it would lose much of its elegance -- it would be awful to
clutter the common cases (instruments and effects) just for the needs
of offline and highly analytic plugins. However I would suggest that
you refine the stated scope (eg. instruments and inline effects) and
concentrate on doing a good job of that.
*) Note control: I prefer your first method (separate voice_on() and off()
functions, rather than a single voice_ctrl() function) -- for the
same reason that "ioctls are bad, mmkay" and syscalls are good, ie.
there's no need for a cryptic overloaded control function, especially
here to implement only a well defined set of operations.
*) Identifying controls: It would be quite useful to share the same get()
and set() functions between a number of controls (eg. similar sliders
of an equaliser), for which you would want eg. an int parameter
identifying the control index. (In those situations, making a bunch of
tiny interface functions within the plugin is pretty ugly).
*) Descriptions: It'd be nice to supply both short and long descriptions
for controls as well as for the whole plugin.
that's it from me for now; nice work overall, I like that it treats
multiple channels coherently and handles enum and string inputs, that
makes generated GUIs a lot nicer :)
Conrad.