Re: [linux-audio-dev] Aeolus and OSC - comments requested

From: Pieter Palmers <pieterp@email-addr-hidden>
Date: Fri May 13 2005 - 00:21:28 EEST

Dave Robillard wrote:

>On Thu, 2005-12-05 at 17:54 +0200, stefan kersten wrote:
>
>>On Thu, May 12, 2005 at 05:22:43PM +0200, Alfons Adriaensen wrote:
>>
>>>One thing I forgot to mention regarding /addclient : the response
>>>to this will include a client ID (integer) that is a required
>>>parameter to all polled requests for information, such as e.g.
>>>the list of stops. This ID identifies the client on the common
>>>server socket (I see no other way to do this with a single socket).
>>>
>>i might be missing something, but why don't you use the
>>client network address as a unique identifier? you can use
>>recvfrom(2) to extract the return address from a udp packet.
>>
>
>I allow either method in Om. Using the client address does work
>usually, but there seems to be a bug in liblo (or below) where the
>source network address is garbled, that I havn't been able to figure out
>yet... allowing the user to explicitly set the address allows working
>around this and other networking oddities.
>
I use this sort of code for request/response RPC-like IPC. In order for
this to work I did have to fix a bug in liblo-0.18, but that was about
sockets not being closed properly. I wonder if this fix would solve your
problem too. I sent the bugfix to Steve, but at that moment he'd just
released 0.18 and feared the anger of Frenando@email-addr-hidden if he'd
release a 0.19. So I guess it's queued for the next release. In the
meantime there is a patched version up at:
http://prdownloads.sourceforge.net/freebob/liblo-0.18-pp.tar.bz2?download
Maybe you should try this one and see if it solves the problem.

As a side note: It might be worthwile to think about a generic solution
to this need for inter-process notifications and/or RPC. I see
LinuxSampler implementing a solution, I know we at freebob need it,
apparently Om does also, the question comes up regarding aeolus. I would
think that this is a natural extention because it pops up every time one
wants to control an app with multiple controllers (e.g. a separate UI
and a HW controller).

Greets,

Pieter

PS:For your reference: I added my code below. It is from the IPC handler
in the freebob deamon, but I removed all error checking and debug
statements for clarity.

<code>

int request_handler(const char *path, const char *types, lo_arg **argv,
int argc, lo_message msg, void *user_data) {

    IPCHandler *handler=(IPCHandler *)user_data;

    return handler->requestHandler(path, types,argv, argc, msg);
}

int
IPCHandler::requestHandler(const char *path,
                           const char *types,
                           lo_arg **argv,
                           int argc,
                           lo_message msg)
{
    lo_address src=lo_message_get_source ( msg );

    if(argc==1) {
        if(strcasecmp(&argv[0]->s,"connection_info")==0) {
            // send response
            lo_send(src, "/response", "s", pConnectionInfo );
        }
    }
    return 0;
}

FBReturnCodes IPCHandler::initialize()
{
    /* start a new server */
    m_serverThread = lo_server_thread_new(portnumber, ipc_error);

    /* add request handler */
    lo_server_thread_add_method(m_serverThread, "/freebob/request", "s",
request_handler, (void *)this);

    return eFBRC_Success;
}

FBReturnCodes IPCHandler::start() {

    lo_server_thread_start(m_serverThread);

    return eFBRC_Success;
}

FBReturnCodes IPCHandler::stop() {

    lo_server_thread_stop(m_serverThread);

    return eFBRC_Success;
}

</code>
Received on Fri May 13 04:15:08 2005

This archive was generated by hypermail 2.1.8 : Fri May 13 2005 - 04:15:09 EEST