[chuck-users] osc listener shred woes

Stefan Blixt stefan.blixt at gmail.com
Mon Apr 28 16:19:57 EDT 2008


Sorry if I came across as a big arrogant earlier - it's an interesting
problem. I got to thinking while walking home from work if you couldn't use
some polymorphic class setup. Here's a thing i tried:
----------------------------------

class OscListener {

fun void listenOnOsc(string msg, int port) {

OscRecv recv;

port => recv.port;

recv.listen();

recv.event(msg) @=> OscEvent oe;

while (true) {

oe => now;

while (oe.nextMsg()) {

receiveEvent(oe);

}

}

}

fun void receiveEvent(OscEvent oe) {

}

}


SinOsc raw => dac;

SinOsc avg => dac;


//---- Listen on OSC for raw

class ListenOnRaw extends OscListener {

fun void receiveEvent(OscEvent oe) {

<<< "Received raw event" >>>;

oe.getInt() => raw.freq;

}

}

ListenOnRaw listenOnRaw;

spork ~ listenOnRaw.listenOnOsc("/leftraw/press,i", 8000);


//---- Listen on OSC for avg

class ListenOnAvg extends OscListener {

fun void receiveEvent(OscEvent oe) {

<<< "Received avg event" >>>;

oe.getInt() => avg.freq;

}

}

ListenOnAvg listenOnAvg;

spork ~ listenOnAvg.listenOnOsc("/leftavg/press,i", 8001);


while (true) {

1::second => now;

}
----------------------------------
I tried out a modified version of this code - I only have one OSC-sending
device that sends three parameters - but I think it should work. However you
do this, I agree that it amounts up to a lot of code for each kind of OSC
message, but I guess it can't be avoided.

Hope you get everything in order for the installation!

/Stefan

On Mon, Apr 28, 2008 at 8:43 PM, mike clemow <gelfmuse at gmail.com> wrote:

> Wow, okay...  Trying to make sense of this...
>
> > Actually, come to think of it, Mike, why have the Bang object at all?
> Why
> > not just move the code (the if statements) from the main loop into the
> > oscListener loops/shreds, and replace the broadcast with actual
> > functionality instead?  Maybe there is some more advanced stuff that you
> > haven't included that prevents this?
>
> No, the only thing that I left out were the spork lines for the other
> 12 OSC listeners I need.  :)
>
> I guess the answer to your question is that I never thought of doing
> that because I'm still trying to wrap my head around Chuck's notions
> of scope.  What you're indirectly telling me is that it's possible to
> access my SinOsc objects (and indeed my whole patch) from the other
> shreds, which I imagined would not be possible because of scope
> limitations.  However, considering how classes work, I'm clearly not
> fully grasping reality here.  I thought that the only way I could
> share data between shreds was an event.
>
> Kassen, I completely forgot about me.yield(), which makes me feel
> pretty dumb.  But I guess concurrency is not as simple as Chuck leads
> me to believe!
>
> Dan, thanks for pointing out the bug.  Honestly, I seem to remember
> running into issues where if I had one OSC message with a signature of
> "/test, i" and another with a signature of "/mike, i" and both were
> coming in on the same port, that Chuck couldn't tell the difference
> between them for some reason.  I remember fixing this with multiple
> listeners on multiple ports.  Perhaps I was doing something else
> wrong.
>
> I'm going to mess around with these excellent suggestions and get back
> to you all.  (sadly, this is all due today.  oh well.)
>
> Thanks!
> Mike
>
>
>
> On Mon, Apr 28, 2008 at 12:10 PM, Stefan Blixt <stefan.blixt at gmail.com>
> wrote:
> > Actually, come to think of it, Mike, why have the Bang object at all?
> Why
> > not just move the code (the if statements) from the main loop into the
> > oscListener loops/shreds, and replace the broadcast with actual
> > functionality instead? Maybe there is some more advanced stuff that you
> > haven't included that prevents this?
> >
> > /Stefan
> >
> >
> >
> > On Mon, Apr 28, 2008 at 6:00 PM, Stefan Blixt <stefan.blixt at gmail.com>
> > wrote:
> > > Yeah, but note that there are two shreds running this loop in
> parallell.
> > So if one event on each port arrive at the same time, chances are that
> the
> > first yield will hand over execution to the second shred, that in turn
> > overwrites b.value and b.message. I think you need at least two Bang
> > instances to be sure that this doesn't happen.
> > >
> > > /Stefan
> > >
> > >
> > >
> > >
> > >
> > > On Mon, Apr 28, 2008 at 5:10 PM, Kassen <signal.automatique at gmail.com>
> > wrote:
> > >
> > > >
> > > >
> > > >
> > > > 2008/4/28 Stefan Blixt <stefan.blixt at gmail.com>:
> > > >
> > > >
> > > >
> > > > > I don't know about the segv signal, but it seems to me that there
> is
> > only one Bang instance that is shared by all iterations/shreds. This
> means
> > that if two events arrive at this loop:
> > > > >
> > > > >
> > > > >        while( oe.nextMsg() ) {
> > > > >            oe.getInt() => b.value;
> > > > >            osctype => b.message;
> > > > >            b.broadcast();
> > > > >        }
> > > > >
> > > > > the second's values will overwrite those of the first (value and
> > message from the first event will be lost).
> > > >
> > > > I think that's right and I think the way around this would be
> > > >
> > > >
> > > >        while( oe.nextMsg() ) {
> > > >            oe.getInt() => b.value;
> > > >            osctype => b.message;
> > > >            b.broadcast();
> > > >            //yield to receiving shreds,
> > > >            //then continue processing the message cue
> > > >            me.yield();
> > > >        }
> > > >
> > > > This is the exact same principle I talked about earlier in this
> topic;
> > if you don't yield you don't give the waiting shreds a chance to run.
> > Advancing time here would probably not be a good idea.
> > > >
> > > > Yours,
> > > > Kas.
> > > >
> > > >
> > > > _______________________________________________
> > > > chuck-users mailing list
> > > > chuck-users at lists.cs.princeton.edu
> > > > https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
> > > >
> > > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > --
> > > Release me, insect, or I will destroy the Cosmos!
> >
> >
> >
> > --
> > Release me, insect, or I will destroy the Cosmos!
> > _______________________________________________
> >  chuck-users mailing list
> >  chuck-users at lists.cs.princeton.edu
> >  https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
> >
> >
>
>
>
> --
> http://semiotech.org
> _______________________________________________
> chuck-users mailing list
> chuck-users at lists.cs.princeton.edu
> https://lists.cs.princeton.edu/mailman/listinfo/chuck-users
>



-- 
Release me, insect, or I will destroy the Cosmos!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cs.princeton.edu/pipermail/chuck-users/attachments/20080428/f1da7366/attachment.html>


More information about the chuck-users mailing list