[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