[LV2] LV2: Communicate from the DSP to the UI

Michael Fisher mfisher31 at gmail.com
Mon Nov 4 21:48:15 PST 2013


On Mon, Nov 4, 2013 at 6:52 AM, Aurélien Leblond <blablack at gmail.com> wrote:

> Hi Michael,
>
>
> What I think I should be doing is using Blank Atom to transfer the
> data from DSP to UI, right?
>

It sounds logical to me, yeah.  Doing it this way could be done by forging
the Blank atom and then writing the float array as raw.   You would need to
map a few uris specifically for this to use inside of the blank object.

seems like peak proptocol etc etc.. would could also be used here.  I don't
think there's a single host that supports any of those kinds of features
though....

some fake code doing it with an atom object and a raw buffer, I didn't try
to compile any of this let alone try it in a real plugin.


float buffer [bufsize];
uint32_t object_type = this->map ("http://myuri#object");
uint32_t prop_type   = this->map ("http://myuri#prop");

...

ForgeFrame frame;

AtomObject obj (forge.write_blank (frame, 0, object_type));
forge.property_head (prop_type, 0);
forge.write_raw (buffer, sizeof (float) * bufsize);

forge.pop (frame);


and then on the GUI side use an AtomObject::iterator if you want it to look
more like c++.

AtomObject obj (data_from_port_event);
AtomObject::iterator prop = obj.begin();

float* buffer = 0;
while (prop != obj.end())
{
   if (prop->key == prop_type) {
      buffer = LV2_ATOM_BODY (&prop->value);
      break;
   }

  ++prop;
}

if (buffer)
    do_something_with (buffer);


regular object getting and querying obviously would also work on the GUI
end.


- guiext:notifyType atom:Blank ;
> - atom:supports atom:Audio ;
> - on the DSP side, use the AtomForge write_raw method to write the
> array of floats
>
> Is that the right way to go or is there anything else I should consider?
>
>
> As the the lv2 scope plugin has 2 inputs that need to be represented
> in the GUI, I was wondering if I can pass the 2 arrays of floats in
> one go through only one Atom.
> From the LV2 documentation, it looks like lv2 is loose enoigh that i
> can pass my own object, but I'm not sure how to approach that via LVTK
> (or via LV2 itself for that matter).
>
>
> Once again thanks in advance for your help,
>
> Aurélien
>
>
> On Mon, Oct 28, 2013 at 8:30 PM, Michael Fisher <mfisher31 at gmail.com>
> wrote:
> > On Mon, Oct 28, 2013 at 11:58 AM, Michael Fisher <mfisher31 at gmail.com>
> > wrote:
> >>
> >> On Mon, Oct 28, 2013 at 10:24 AM, Aurélien Leblond <blablack at gmail.com>
> >> wrote:
> >>>
> >>> > The map object is 'just there' for when you need it, like creating
> new
> >>> > forges ;)  I've always wondered if it made more sense  to provide a
> >>> > accessor
> >>> > method to it for clarity   Plugin::get_urid_map() const   or
> something
> >>> > like
> >>> > that.
> >>> >
> >>> > That looks right for creating a forge, AtomForge's  ctor will call
> >>> > lv2_atom_forge_init
> >>> > when the map is passed in (just like you do above)
> >>> >
> >>> >>
> >>> >>    void Scope::run(uint32_t nframes)
> >>> >>    {
> >>> >>        // you're sending things in an atom sequence so get the size
> >>> >> information
> >>> >>        // from the port buffer
> >>> >>
> >>> >>       LV2_Atom_Sequence* aseq = (LV2_Atom_Sequence*) p (p_notify);
> >>> >>       m_forge->set_buffer ((uint8_t*) aseq, aseq->atom.size);
> >>> >>
> >>> >>        m_forge->sequence_head(m_notify_frame, 0);
> >>> >>
> >>> >>        // sequences need a timestamp for each event added
> >>> >>        m_forge->frame_time(0);
> >>> >>
> >>> >>        m_forge->write_float(1604);
> >>> >>    }
> >>> >>
> >>> >
> >>> > Still nothing happening on the GUI end ay?  Could I just have a link
> to
> >>> > the
> >>> > full source code?  I'm better debugging hands on.  Sorry, I can't
> >>> > recall the
> >>> > git address to your plugin set.
> >>> >
> >>> > Forging atoms (in a way that actually works) isn't by any means a
> >>> > straight
> >>> > forward process.
> >>>
> >>> Thanks for checking, I really have the feeling I'm missing something
> >>> small here :)
> >>
> >>
> >> Yep, missing something small seems to happen to me frequently.  I'm
> >> jumping over to my Linux machine and will give it a go.
> >>
> >>>
> >>>
> >>> The SVN is here:
> >>> svn checkout svn://svn.code.sf.net/p/avwlv2/code/trunk avw.lv2
> >>>
> >>> (Ingen is the host I use to test them)
> >>
> >>
> >
> > First things first.  Your plugin, after modifying ttl files, works fine
> in
> > Jalv.   For ingen support, your best bet might be to add a Trac ticket on
> > drobilla.net.
> >
> > Ok, so I figured out the problem...   the GUI ttl file should look
> something
> > like this (with a portNotification setting)
> >
> > <http://avwlv2.sourceforge.net/plugins/avw/scope/gui>
> >
> >         a guiext:GtkUI ;
> >
> >         guiext:binary <scope_gui.so> ;
> >
> >         guiext:portNotification [
> >
> >             guiext:plugin <
> http://avwlv2.sourceforge.net/plugins/avw/scope>
> > ;
> >
> >             lv2:symbol "notify" ;
> >
> >             guiext:notifyType atom:Float
> >
> >         ] .
> >
> >
> >
> > the Port definition in the plugin's turtle :
> >
> >           ... [
> >
> >                 a lv2:OutputPort, atom:AtomPort ;
> >
> > atom:bufferType atom:Sequence ;
> >
> >                 atom:supports atom:Float ;   # <<<<<< NEED THIS (i think)
> >
> > lv2:index 1 ;
> >
> > lv2:symbol "notify" ;
> >
> > lv2:name "Notify" ;
> >
> >               ] .
> >
> >
> >
> > I also added more debug output to the GUI...  all relevant changes were
> > committed in a git mirror on Github (its just easier for me to do that)
>  The
> > only files I modified were  scope*.*  files
> >
> >
> > You'll want to look at the GUI code, because I also show you how to
> > 'un-package' the atom in the port_event method.
> >
> >
> > https://github.com/axetota/avwlv2/tree/devel
> >
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lv2plug.in/pipermail/devel-lv2plug.in/attachments/20131104/33aea4d2/attachment-0001.htm>


More information about the Devel mailing list