[LV2] Questions about passing strings and other data from UI to LV2 plugin

Hanspeter Portner ventosus at airpost.net
Sun Nov 27 06:44:14 PST 2016


On 27.11.2016 14:08, Torbjörn Rathsman wrote:
> This is what I talk about (from sampler example):
> 
> LV2_Atom_Forge_Ref set = lv2_atom_forge_object( forge, &frame, 0,
> uris->patch_Set); lv2_atom_forge_key(forge, uris->patch_property);
> lv2_atom_forge_urid(forge, uris->eg_sample); lv2_atom_forge_key(forge,
> uris->patch_value); lv2_atom_forge_path(forge, filename, filename_len);
> lv2_atom_forge_pop(forge, &frame);
> 
> This is what happens after lv2_atom_forge_set_buffer. I guess I need to write
> data from DSP to UI as well when state is reloaded. Also I know the payload size
> without strlen.

I see, you're trying to implement the patch extension.
I'd recommend to look at eg-params as a proper example instead [1].

When UI is initialized (or wants to reload the whole state), it sends an empty
patch:Get message to the DSP. The DSP listens for patch:Get messages and answers
them with patch:Set messages. If some value is changed on the UI side, it sends
a patch:Set message to the DSP. If some value changes on the DSP side, it sends
a patch:Set message to the UI.

[1] http://lv2plug.in/git/cgit.cgi/lv2.git/tree/plugins/eg-params.lv2

> 2016-11-27 12:08 GMT+01:00 Hanspeter Portner <ventosus at airpost.net
> <mailto:ventosus at airpost.net>>:
> 
>     On 27.11.2016 09:58, Torbjörn Rathsman wrote:
>     > I need to pass a string from the UI to the plugin. From the eg-sample, it
>     > appears that an LV2 atom should be written to a atom port.
>     >
>     > If I understand it correctly
>     >
>     >  1. Allocate a LV2_Atom_Forge. May that object be on the stack or does it have
>     >     to survive after the UI event callback has returned?
> 
>     This could be on the stack, but it makes sense to make it part of UI/plugin
>     struct/class directly as the forge needs to be initialized before use
>     (lv2_atom_forge_init). e.g. initialize once (in your initialize routine), use
>     many times...
> 
>     >  2. Call lv2_atom_forge_set_buffer. How do I know the required size of the
>     >     buffer? Is it the size of the payload (the string), or does it include any
>     >     headers. The example sets it to 1024 bytes for no reason. May the
>     buffer be
>     >     allocated on the stack or does it have to survive the UI after the UI
>     event
>     >     callback has returned?
> 
>     It does include headers (and padding), so for your string, a safe minimum is:
>       uint32_t capacity = lv2_atom_pad_size(sizeof(LV2_Atom) + strlen(str) + 1)
> 
>     Don't forget to initialize the forge structure (lv2_atom_forge_init), this sets
>     vital variables in the structure.
> 
>     I use lv2_atom_forge_set_buffer manly on the DSP side (where you cannot use
>     malloc et al.). On the UI side it's more convenient to use
>     lv2_atom_forge_set_sink with which you can implement growing buffers and don't
>     have to ask yourself about maximal buffer sizes in the first place, e.g. [1].
> 
>     >  3. Add some objects. The API uses key-value pairs. Should the size of keys be
>     >     included in the buffer size?
> 
>     Not sure what API you mean, but as mentioned above, just use a growing buffer.
> 
>     >  4. Write the data to an atom input port
> 
>     Yes, but don't forget to use the proper port protocol in the writer function,
>     e.g. atom:eventTransfer [2].
> 
>     [1]
>     https://gitlab.com/OpenMusicKontrollers/tracker.lv2/blob/master/tracker_ui.c#L595
>     <https://gitlab.com/OpenMusicKontrollers/tracker.lv2/blob/master/tracker_ui.c#L595>
>     [2]
>     https://gitlab.com/OpenMusicKontrollers/tracker.lv2/blob/master/tracker_ui.c#L603
>     <https://gitlab.com/OpenMusicKontrollers/tracker.lv2/blob/master/tracker_ui.c#L603>



More information about the Devel mailing list