[LV2] Some thoughts/RFCs on the host stack

Harry van Haaren harryhaaren at gmail.com
Mon May 14 14:47:54 PDT 2018


On Mon, May 14, 2018 at 8:22 PM, David Robillard <d at drobilla.net> wrote:

> Hi all,
>
> I've been finding some time to put into my long-enqueued project of
> cleaning up the LV2 host stack (probably towards putting everything
> into a single distribution to be more palatable to people who don't
> just rely on package managers, and generally being a lot simpler).
> Since the host mess has become a topic of conversation lately, here's a
> related brain dump / progress report:
>
> Currently I'm working on serd1 (really, serd2) which unifies serd and
> sord, to be the one non-LV2-specific library things are based on.
> Concretely, the main thing I'm shooting towards here is collapsing the
> billion (well, 3 or 4) different node types there currently are:
>
> SerdNode (purely syntactic string stuff)
> SordNode (SerdNode plus some store specific stuff)
> LilvNode (SordNode plus some numeric stuff and an API wrapper)
>

Less things to learn gets a +1 from me


> The idea is to merge these all into one, and expose SerdNode directly
> in the Lilv API, so there's just one type of data node everywhere.
> This will greatly simplify a lot of things, but leads me to what I'm
> currently wondering: we also have these atom things.
>
> I think one of the good things about LV2, static data and not needing
> to run code to just discover plugins, is also a big weakness, because
> we have to make hard decisions about what's static and what's dynamic,
> and these worlds are quite different.  Certain dynamic functionality
> (say, dynamic channel configuration) is still missing because of this.
> Things would be nicer if dealing with the static data (via lilv) and
> interacting with the plugin (via atoms) were as similar and compatible
> as possible.  In an ideal world, nearly indistinguishable.
>
> ... and there's the tie-in.  Currently my SerdNode is:
>
> struct SerdNode {
>         size_t        n_bytes;
>         SerdNodeFlags flags;
>         SerdType      type;
>         // data immediately follows here
> };
>
> Look familiar?  The flags are an optimization which can be dispensed
> with without too much trouble, leaving:
>
> struct SerdNode {
>         size_t   n_bytes;
>         SerdType type;
>         // data immediately follows here
> };
>
> Toss the ability to deal with very large (gigabyte scale) individual
> values (which is... maybe fine?) and we're left with:
>
> struct SerdNode {
>         uint32_t n_bytes;
>         SerdType type;
>         // data immediately follows here
> };
>
> Which just so happens to be binary compatible with LV2_Atom.
>

I'm starting (hah) to see the world in a very Atom-y way recently, more on
that in a sec...



> So I'm wondering if this is worth pursuing.  To make this work, we
> would have to deal with the dynamic atom type problem (previously
> mentioned here, and would make a bunch of other things much simpler on
> its own), carving out some space for static type IDs.
>
> Then, lilv could talk in a unified way about/with static data and live
> plugins. Conceptually this is quite nice, but I haven't thought much
> about what this concretely brings.
>
> Being able to ask, via lilv, if a plugin supports a particular message
> (say, OSC), and have this transparently use the static data or talk to
> an instance if it depends on configuration?  Doing the same for channel
> configuration?  Loading messages from disk (plugin data, saved state,
> host specific stuff, etc), and passing them directly to a running
> plugin instance?
>
> In terms of clarity, I think it would help a lot of LV2 had a simple
> data model (basically the atom one, a relatively simple set of strings
> and numbers and stuff), and 100% of host and plugin communication used
> it.  Host authors wouldn't really need to care (much) that there's this
> static RDF data, and also a plugin to talk to, because it all speaks
> the same language and lilv hides any gory details in most places.  Kids
> these days like JSON, right?  It's not far off, just a lot more
> meaningful :)
>
> It would be quite nice if, say, a { 4, LV2_INT, 12345 } struct could
> represent the int 12345 absolutely everywhere in the LV2 ecosystem.
>
> ... so, that's that thought.  Sorry for the wall of text, I can't
> really distill this into something more concrete, I'm just trying to
> find the common core of nicety here and strip away as much other crap
> as possible with the benefit of hindsight (the LADSPA-plus-a-thing-or-
> two days are long ago, now).  Thoughts of whatever variety welcome.
>

In general I'm nodding my head at the above. Atoms (or some basic "nugget"
of
data to communicate between things) make a lot of sense.

If we can reduce concepts that implement LV2 to Atoms as the
data-structures,
with a few known URIs, I'd see value there.

Not to bring in too much non-LV2 stuff to this conversation... however I'm
currently
thinking that creating mappings from HW Controllers to hosts / plugins
would benefit
from some "known" Atom message (think MIDI but then flexible and awesome ;)

Perhaps we can get a dev-discussion at the LAC?

Cheers,
>
> --
> dr
>

Regards, and hopefully see ye'all soon in Berlin :) -Harry

-- 

http://www.openavproductions.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lv2plug.in/pipermail/devel-lv2plug.in/attachments/20180514/125036c7/attachment.html>


More information about the Devel mailing list