On Mon, Nov 4, 2013 at 6:52 AM, Aurélien Leblond <blablack@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@gmail.com> wrote:
> On Mon, Oct 28, 2013 at 11:58 AM, Michael Fisher <mfisher31@gmail.com>
> wrote:
>>
>> On Mon, Oct 28, 2013 at 10:24 AM, Aurélien Leblond <blablack@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
>
>
>