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

Michael Fisher mfisher31 at gmail.com
Sun Oct 27 13:38:23 PDT 2013


On Sun, Oct 27, 2013 at 3:18 PM, Michael Fisher <mfisher31 at gmail.com> wrote:

>
> On Sun, Oct 27, 2013 at 2:25 PM, Aurélien Leblond <blablack at gmail.com>wrote:
>
>> Hi everyone,
>>
>> In my lv2 plugin, I need to communicate information from the DSP to
>> the UI, but I don't want to break the DSP/UI separation principle (no
>> Instance or Data access). On top of that, I'm using LVTK.
>>
>> The type of data I'm trying to move is a Vector of Float (buffer type
>> Sound in the ttl) - but even basic information on how to transfer a
>> Float from the DSP to the UI would be valuable.
>>
>
> he, he, yeah it can get a little confusing... maybe this will help.
>
>     // 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);
>
>

Sorry, I prematurely pressed 'send' on the last message.

continuing on...  after forging a frame_time, just write a normal float (no
blank object needed)

m_forge->write_float (1604);

And that should be it.  From a technical standpoint, whenever writing to a
sequence you MUST write the time stamp  (forge->frame_time
(a_timestamp_value)) before adding the 'next' event.

Your ttl file has  atom:Float  as the buffer type.  I've never used
anything besides atom:Sequence.  I imagine this buffer type doesn't need a
sequence head forged first.  Maybe David will jump in on how atom:Float
 bufferType'd  ports are supposed to forged into and out of.

I recommend, if you want to use LVTK to do atom forging, that you subclass
 lvtk::AtomForge and add appropriate methods to it...

Here's a snippet that shows how to write  patch get/set messages with a
subclassed AtomForge.  It also shows how to write raw midi.

http://pastebin.com/C1LYtXpv  --  the code in there uses small uses the
nullptr macro.  just change those to "0"  if you're not using c++11


... and that should be it Plugin-Side.



>
>
>
>
>
>
> In my UI, I just want to see if I receive this data
> In the port_event method, at the moment the only thing I'm doing is:
>     std::cout << port << " - " << format << std::endl;
>
>
>
> The port is defined in the TTL as follows:
>     a lv2:OutputPort, atom:AtomPort ;
>     atom:bufferType atom:Float ;
>     atom:supports <http://lv2plug.in/ns/ext/patch#Message> ;
>     lv2:index 1 ;
>     lv2:symbol "notify" ;
>     lv2:name "Notify" ;
>
>
>
>
>> What I have do so far in the DSP (run method)
>>     m_forge->set_buffer((uint8_t*)p(p_notify), sizeof(float));
>> //p_notify being the atom port
>>     m_forge->sequence_head(m_notify_frame, 0);
>>
>>     ForgeFrame p_frame;
>>     Atom p_msg = m_forge->write_blank(p_frame, 1, urids.atom_Float);
>>     m_forge->property_head(urids.atom_value, 0);
>>     m_forge->write_float(1604); //test data i'm trying to move
>>     m_forge->pop(p_frame);
>>
>>
>>
>> In my UI, I just want to see if I receive this data
>> In the port_event method, at the moment the only thing I'm doing is:
>>     std::cout << port << " - " << format << std::endl;
>>
>>
>>
>> The port is defined in the TTL as follows:
>>     a lv2:OutputPort, atom:AtomPort ;
>>     atom:bufferType atom:Float ;
>>     atom:supports <http://lv2plug.in/ns/ext/patch#Message> ;
>>     lv2:index 1 ;
>>     lv2:symbol "notify" ;
>>     lv2:name "Notify" ;
>>
>>
>>
>> At the moment, the code compiles and runs without crashing (yeah!),
>> but nothing happens (boo!).
>> Would you guys have any ideas?
>>
>> Thanks in advance,
>> Aurélien
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lv2plug.in/pipermail/devel-lv2plug.in/attachments/20131027/62c6e716/attachment-0001.htm>


More information about the Devel mailing list