Esempio n. 1
0
int osc_start(struct deck *deck, struct library *library)
{
    osc_deck = deck;
    osc_library = library;
    
    address[0] = lo_address_new_from_url("osc.udp://0.0.0.0:7771/");
    address[1] = lo_address_new_from_url("osc.udp://0.0.0.0:7771/");
    
    
    /* start a new server on port 7770 */
    st = lo_server_thread_new("7770", error);
    
    lo_server_thread_add_method(st, "/xwax/load_track", "isss", load_track_handler, NULL);

    lo_server_thread_add_method(st, "/xwax/set_cue", "iif", set_cue_handler, NULL);

    lo_server_thread_add_method(st, "/xwax/punch_cue", "ii", punch_cue_handler, NULL);  

    lo_server_thread_add_method(st, "/xwax/get_status", "i", get_status_handler, NULL);
    
    lo_server_thread_add_method(st, "/xwax/recue", "i", recue_handler, NULL); 
  
    lo_server_thread_add_method(st, "/xwax/disconnect", "i", disconnect_handler, NULL);    
    
    lo_server_thread_add_method(st, "/xwax/reconnect", "i", reconnect_handler, NULL);    

    lo_server_thread_add_method(st, "/xwax/connect", "", connect_handler, NULL);

    lo_server_thread_add_method(st, "/xwax/pitch", "if", pitch_handler, NULL);

    lo_server_thread_add_method(st, "/xwax/position", "if", position_handler, NULL);
    
    /* add method that will match the path /quit with no args */
    lo_server_thread_add_method(st, "/quit", "", quit_handler, NULL);

    lo_server_thread_start(st);
    
    ///* Start a TCP server used for receiving PPM packets */
    //st_tcp = lo_server_thread_new_with_proto("7771", LO_TCP, error);
    //if (!st_tcp) {
        //printf("Could not create tcp server thread.\n");
        //exit(1);
    //}
    
    //lo_server s = lo_server_thread_get_server(st);   
    
    ///* add method that will match the path /foo/bar, with two numbers, coerced
     //* to float and int */
    
    //lo_server_thread_start(st_tcp);
    
    //printf("Listening on TCP port %s\n", "7771");

    return 0;
}
Esempio n. 2
0
	explicit OSCClientSender(const Raul::URI& url,
	                         size_t           max_packet_size)
		: Shared::OSCSender(max_packet_size)
		, _url(url)
	{
		_address = lo_address_new_from_url(url.c_str());
	}
Esempio n. 3
0
bool SpinEditorApp::OnCmdLineParsed(wxCmdLineParser& parser)
{
    spin::spinApp &spin = spin::spinApp::Instance();

    if (parser.Found(wxT("v")))
    {
        std::cout << "SPIN Framework: version " << VERSION << std::endl;
        return false;
    }

    wxString sceneID;
    if (parser.Found(wxT("s"), &sceneID))
        spin.setSceneID(sceneID.ToStdString());

    wxString userID;
    if (parser.Found(wxT("u"), &userID))
        spin.setUserID(userID.ToStdString());

    wxString serverAddr;
    if (parser.Found(wxT("r"), &serverAddr))
    {
        spinListener.lo_txAddrs_.clear();
        spinListener.lo_txAddrs_.push_back(lo_address_new_from_url(serverAddr.c_str()));
    }

    return true;
}
Esempio n. 4
0
void loop()
{
    printf("-------------------- GO ! --------------------\n");
    int i = 0;

    if (automate) {
        char source_name[1024], destination_name[1024];

        printf("%s\n", mdev_name(source));
        printf("%s\n", mdev_name(destination));

        lo_address a = lo_address_new_from_url("osc.udp://224.0.1.3:7570");
        lo_address_set_ttl(a, 1);

        lo_send(a, "/link", "ss", mdev_name(source), mdev_name(destination));

        msig_full_name(sendsig, source_name, 1024);
        msig_full_name(recvsig, destination_name, 1024);

        lo_send(a, "/connect", "ssss", source_name, destination_name,
                "@mode", "reverse");

        lo_address_free(a);
    }

    while (i >= 0 && !done) {
        msig_update_float(recvsig, ((i % 10) * 1.0f));
        printf("\ndestination value updated to %f -->\n", (i % 10) * 1.0f);
        mdev_poll(destination, 1);
        mdev_poll(source, 100);
        i++;
    }
}
Esempio n. 5
0
    void
    Client::announce(const char *application_name,
                     const char *capabilities,
                     const char *process_name)
    {
        // MESSAGE( "Announcing to NSM" );

        lo_address to = lo_address_new_from_url(nsm_url);

        if(!to)
            //    MESSAGE( "Bad address" );
            return;

        int pid = (int)getpid();

        lo_send_from(to,
                     _server,
                     LO_TT_IMMEDIATE,
                     "/nsm/server/announce",
                     "sssiii",
                     application_name,
                     capabilities,
                     process_name,
                     1,
                     /* api_major_version */
                     0,
                     /* api_minor_version */
                     pid);

        lo_address_free(to);
    }
Esempio n. 6
0
// Constructor.
qtractorNsmClient::qtractorNsmClient (
	const QString& nsm_url, QObject *pParent )
	: QObject(pParent),
	#ifdef CONFIG_LIBLO
		m_address(NULL),
		m_thread(NULL),
		m_server(NULL),
	#endif
		m_active(false)
{
#ifdef CONFIG_LIBLO
	m_address = lo_address_new_from_url(nsm_url.toUtf8().constData());
	const int proto = lo_address_get_protocol(m_address);
	m_thread = lo_server_thread_new_with_proto(NULL, proto, NULL);
	if (m_thread) {
		m_server = lo_server_thread_get_server(m_thread);
		lo_server_thread_add_method(m_thread,
			"/error", "sis", osc_nsm_error, this);
		lo_server_thread_add_method(m_thread,
			"/reply", "ssss", osc_nsm_reply, this);
		lo_server_thread_add_method(m_thread,
			"/nsm/client/open", "sss", osc_nsm_open, this);
		lo_server_thread_add_method(m_thread,
			"/nsm/client/save", "", osc_nsm_save, this);
		lo_server_thread_add_method(m_thread,
			"/nsm/client/session_is_loaded", "", osc_nsm_loaded, this);
		lo_server_thread_add_method(m_thread,
			"/nsm/client/show_optional_gui", "", osc_nsm_show, this);
		lo_server_thread_add_method(m_thread,
			"/nsm/client/hide_optional_gui", "", osc_nsm_hide, this);
		lo_server_thread_start(m_thread);
	}
#endif
}
Esempio n. 7
0
void connect_signals()
{
    char source_name[1024], destination_name[1024];

    printf("%s\n", mdev_name(source));
    printf("%s\n", mdev_name(destination));

    lo_address a = lo_address_new_from_url("osc.udp://224.0.1.3:7570");
    lo_address_set_ttl(a, 1);

    lo_send(a, "/link", "ss", mdev_name(source), mdev_name(destination));

    int j = 50;
    while (j >= 0) {
        mdev_poll(source, 10);
        mdev_poll(destination, 10);
        j--;
    }

    msig_full_name(sendsig, source_name, 1024);
    msig_full_name(recvsig, destination_name, 1024);

    lo_send(a, "/connect", "ss", source_name, destination_name);

    lo_address_free(a);
}
Esempio n. 8
0
int main(int argc, char *argv[])
{
    lo_server st = lo_server_thread_new(NULL, NULL);
    lo_address t;
   
    if (argc != 2) {
	fprintf(stderr, "Usage: subtest <uri>\n");

	return 1;
    }

    lo_server_thread_add_method(st, NULL, "i", subtest_handler, NULL);
    lo_server_thread_start(st);

    t = lo_address_new_from_url(argv[1]);
    lo_send(t, "/subtest", "i", 0xf00);

#ifdef WIN32
    Sleep(4000);
#else
    sleep(4);
#endif

    return 0;
}
Esempio n. 9
0
File: Mixer.C Progetto: imv/non
void
Mixer::reply_to_finger ( lo_message msg )
{    
    int argc = lo_message_get_argc( msg );
    lo_arg **argv = lo_message_get_argv( msg );

    if ( argc >= 4 )
    {
        const char *url = &argv[0]->s;
        const char *name = &argv[1]->s;
        const char *version = &argv[2]->s;
        const char *id = &argv[3]->s;

        MESSAGE( "Discovered NON peer %s (%s) @ %s with ID \"%s\"", name, version, url, id );
        MESSAGE( "Registering Signals" );

        lo_address to = lo_address_new_from_url( &argv[0]->s );
        
        osc_endpoint->send( to,
                            "/non/hello",
                            osc_endpoint->url(),
                            APP_NAME,
                            VERSION,
                            instance_name );
        
        mixer->osc_endpoint->hello( url );
    
        lo_address_free( to );
    }
}
Esempio n. 10
0
void connect_signals()
{
    char source_name[1024], destination_name[1024];

    printf("%s\n", mdev_name(source));
    printf("%s\n", mdev_name(destination));

    lo_address a = lo_address_new_from_url("osc.udp://224.0.1.3:7570");
    lo_address_set_ttl(a, 1);

    lo_send(a, "/link", "ss", mdev_name(source), mdev_name(destination));

    // wait for link to be processed
    int j = 50;
    while (j >= 0) {
        mdev_poll(source, 10);
        mdev_poll(destination, 10);
        j--;
    }

    msig_full_name(sendsig, source_name, 1024);
    msig_full_name(recvsig, destination_name, 1024);

    lo_send(a, "/connect", "ssssss", source_name, destination_name, "@mode", "expression", "@expression", "y=y{-1}+1");

    lo_address_free(a);

    // wait for connection to be processed
    j = 50;
    while (j >= 0) {
        mdev_poll(source, 10);
        mdev_poll(destination, 10);
        j--;
    }
}
Esempio n. 11
0
File: nsm-proxy.C Progetto: imv/non
int
osc_update ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
{
    lo_address to = lo_address_new_from_url( lo_address_get_url( lo_message_get_source( msg ) ));

    nsm_proxy->update( to );

    gui_addr = to;

    return 0;
}
Esempio n. 12
0
void	*veejay_new_osc_sender_uri( const char *uri )
{
	oscclient_t *osc = (oscclient_t*) vj_malloc(sizeof(oscclient_t));
	memset(osc,0,sizeof(oscclient_t));
	osc->addr = lo_address_new_from_url( uri );

	osc->addr_str = strdup(lo_address_get_hostname( osc->addr ));
	osc->port_str = strdup(lo_address_get_port ( osc->addr ));
	veejay_msg(0,"New OSC sender from uri '%s', Host %s, Port %s",
			uri, osc->addr_str, osc->port_str );
	return (void*) osc;
}
Esempio n. 13
0
int main(int argc, char *argv[])
{
  lo_address ad;

  if (argc > 1) {
    printf("Connecting to %s\n", argv[1]);
    ad = lo_address_new_from_url(argv[1]);
  } else {
    printf("Connecting to %s\n", MONOHORN_URL);
    ad = lo_address_new_from_url(MONOHORN_URL);
  }

  if (lo_address_errno(ad) < 0) {
    fprintf(stderr, "LO Error: %s\n", lo_address_errstr(ad));
    return 1;
  }

  int ret = 0;

  while (1)
  {
    rb_raise();
    rb_bottom();
    rb_render(ad);

    if (lo_send(ad, "/render", NULL) < 0)
    {
      fprintf(stderr, "LO Error: %s\n", lo_address_errstr(ad));
      ret = 1;
      break;
    }

    // 15 frames /sec
    usleep(1000000 / 15);
  }

  lo_send(ad, "/clear", NULL);

  return ret;
}
Esempio n. 14
0
File: nsm-proxy.C Progetto: imv/non
int
osc_announce_reply ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
{
    if ( strcmp( "/nsm/server/announce", &argv[0]->s ) )
         return -1;

    printf( "Successfully registered. NSM says: %s", &argv[1]->s );
    
    nsm_is_active = 1;
    nsm_addr = lo_address_new_from_url( lo_address_get_url( lo_message_get_source( msg ) ) );
    
    return 0;
}
Esempio n. 15
0
int main(int argc, char *argv[])
{
    if (argc < 5) {
        g_critical("not enough arguments supplied");
        return 1;
    }

    gtk_init(&argc, &argv);

    //char *exe_path = argv[0];
    char *host_url = argv[1];
    //char *lib_name = argv[2];
    char *plug_name = argv[3];
    char *identifier = argv[4];
    
    _osc_path = lo_url_get_path(host_url);
    _osc_host_addr = lo_address_new_from_url(host_url);
    
    _osc_server = lo_server_new(NULL, osc_error);
    lo_server_add_method(_osc_server, tmpstr("/%s/control",     _osc_path), "if", osc_control_handler,     NULL);
    lo_server_add_method(_osc_server, tmpstr("/%s/sample-rate", _osc_path), "i",  osc_samplerate_handler,  NULL);
    lo_server_add_method(_osc_server, tmpstr("/%s/program",     _osc_path), "ii", osc_program_handler,     NULL);
    lo_server_add_method(_osc_server, tmpstr("/%s/show",        _osc_path), NULL, osc_show_handler,        NULL);
    lo_server_add_method(_osc_server, tmpstr("/%s/hide",        _osc_path), NULL, osc_hide_handler,        NULL);
    lo_server_add_method(_osc_server, tmpstr("/%s/quit",        _osc_path), NULL, osc_quit_handler,        NULL);
    lo_server_add_method(_osc_server, NULL, NULL, osc_fallback_handler, NULL);
    
    host_request_update();
    
    gdk_input_add(lo_server_get_socket_fd(_osc_server), GDK_INPUT_READ, (GdkInputFunction)lo_server_recv_noblock, _osc_server);
    
    _window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));

    gtk_window_set_title(_window, tmpstr("%s - %s", plug_name, identifier));
	gtk_signal_connect(GTK_OBJECT(_window), "delete-event", on_window_deleted, NULL);

    size_t i; for (i=0; i<kAmsynthParameterCount; i++) {
        gdouble value = 0, lower = 0, upper = 0, step_increment = 0;
        get_parameter_properties(i, &lower, &upper, &value, &step_increment);
        _adjustments[i] = (GtkAdjustment *)gtk_adjustment_new(value, lower, upper, step_increment, 0, 0);
        g_signal_connect(_adjustments[i], "value-changed", (GCallback)&on_adjustment_value_changed, (gpointer)i);
    }

    GtkWidget *editor = editor_pane_new(new SynthesizerStub, _adjustments, TRUE);
    gtk_container_add(GTK_CONTAINER(_window), editor);
    gtk_widget_show_all(GTK_WIDGET(editor));
    
    gtk_main();
    
    return 0;
}
Esempio n. 16
0
    int
    Client::init_thread(const char *nsm_url)
    {
        this->nsm_url = nsm_url;

        lo_address addr = lo_address_new_from_url(nsm_url);
        int proto = lo_address_get_protocol(addr);
        lo_address_free(addr);

        _st     = lo_server_thread_new_with_proto(NULL, proto, NULL);
        _server = lo_server_thread_get_server(_st);

        if(!_server || !_st)
            return -1;

        lo_server_thread_add_method(_st,
                                    "/error",
                                    "sis",
                                    &Client::osc_error,
                                    this);
        lo_server_thread_add_method(_st,
                                    "/reply",
                                    "ssss",
                                    &Client::osc_announce_reply,
                                    this);
        lo_server_thread_add_method(_st,
                                    "/nsm/client/open",
                                    "sss",
                                    &Client::osc_open,
                                    this);
        lo_server_thread_add_method(_st,
                                    "/nsm/client/save",
                                    "",
                                    &Client::osc_save,
                                    this);
        lo_server_thread_add_method(_st,
                                    "/nsm/client/session_is_loaded",
                                    "",
                                    &Client::osc_session_is_loaded,
                                    this);
        lo_server_thread_add_method(_st,
                                    NULL,
                                    NULL,
                                    &Client::osc_broadcast,
                                    this);

        return 0;
    }
Esempio n. 17
0
File: nsm-proxy.C Progetto: imv/non
void
announce ( const char *nsm_url, const char *client_name, const char *process_name )
{
    printf( "Announcing to NSM\n" );

    lo_address to = lo_address_new_from_url( nsm_url );

    int pid = (int)getpid();

    lo_send_from( to, losrv, LO_TT_IMMEDIATE, "/nsm/server/announce", "sssiii",
                  client_name,
                  ":optional-gui:",
                  process_name,
                  1, /* api_major_version */
                  0, /* api_minor_version */
                  pid );

    lo_address_free( to );
}
Esempio n. 18
0
void loop()
{
    printf("-------------------- GO ! --------------------\n");
    int i = 0, j = 0, count;

    if (automate) {
        char source_name[1024], destination_name[1024];

        printf("%s\n", mdev_name(source));
        printf("%s\n", mdev_name(destination));

        lo_address a = lo_address_new_from_url("osc.udp://224.0.1.3:7570");
        lo_address_set_ttl(a, 1);

        lo_send(a, "/link", "ss", mdev_name(source), mdev_name(destination));

        for (int i = 0; i < 4; i++) {
            msig_full_name(sendsig[i], source_name, 1024);
            msig_full_name(recvsig[i], destination_name, 1024);

            lo_send(a, "/connect", "ss", source_name, destination_name);
        }

        lo_address_free(a);
    }

    while (i >= 0 && !done) {
        for (j = 0; j < 4; j++) {
            msig_update_float(recvsig[j], ((i % 10) * 1.0f));
        }
        printf("\ndestination values updated to %d -->\n", i % 10);
        for (j = 0; j < 4; j++) {
            count = msig_query_remote(sendsig[j], dummysig[j]);
            printf("Sent %i queries for sendsig[%i]\n", count, j);
        }
        mdev_poll(destination, 100);
        mdev_poll(source, 0);
        i++;
        usleep(500 * 1000);
    }
}
Esempio n. 19
0
void port_checker::server::init(const char* target_url)
{
    target = lo_address_new_from_url(target_url);
    if(!target || !lo_address_get_url(target) ||
       !lo_address_get_port(target) ||
        lo_address_get_protocol(target) != LO_UDP)
        throw std::runtime_error("invalid address");

    srv = lo_server_new_with_proto(nullptr, LO_UDP, liblo_error_cb);
    if(srv == nullptr)
        throw std::runtime_error("Could not create lo server");
    lo_server_add_method(srv, nullptr, nullptr, handle_st, this);

    rtosc_arg_val_t hi[2];
    hi[0].type = hi[1].type = 's';
    hi[0].val.s = hi[1].val.s = "";
    send_msg("/path-search", 2, hi);
    std::vector<rtosc_arg_val_t> reply;
    std::vector<char> buf;
    wait_for_reply(&buf, &reply, "/paths");
}
Esempio n. 20
0
void loop()
{
    printf("-------------------- GO ! --------------------\n");
    int i = 0;

    if (automate) {
        char source_name_1[1024], destination_name_1[1024];
        char source_name_2[1024], destination_name_2[1024];

        printf("%s\n", mdev_name(source));
        printf("%s\n", mdev_name(destination));

        lo_address a = lo_address_new_from_url("osc.udp://224.0.1.3:7570");
        lo_address_set_ttl(a, 1);

        lo_send(a, "/link", "ss", mdev_name(source), mdev_name(destination));

        msig_full_name(sendsig_1, source_name_1, 1024);
        msig_full_name(recvsig_1, destination_name_1, 1024);

        lo_send(a, "/connect", "ss", source_name_1, destination_name_1);

        msig_full_name(sendsig_2, source_name_2, 1024);
        msig_full_name(recvsig_2, destination_name_2, 1024);

        lo_send(a, "/connect", "ss", source_name_2, destination_name_2);

        lo_address_free(a);
    }

    while (i >= 0 && !done) {
        mdev_poll(source, 0);
        msig_update_float(source->outputs[0], ((i % 10) * 1.0f));
        msig_update_float(source->outputs[1], ((i % 10) * 1.0f));
        printf("source value updated to %d -->\n", i % 10);

        printf("Received %i messages.\n\n", mdev_poll(destination, 100));
        i++;
    }
}
Esempio n. 21
0
int connect_handler(const char *path, const char *types, lo_arg ** argv,
                int argc, void *data, void *user_data)
{
    /* example showing pulling the argument values out of the argv array */
    printf("%s\n", path);
    fflush(stdout);
    
    lo_address a = lo_message_get_source(data);
    
    if(strcmp(lo_address_get_url(address[0]), lo_address_get_url(a)) == 0 || 
        strcmp(lo_address_get_url(address[1]), lo_address_get_url(a)) == 0) {
        // already stored as a client
    } else {
        address[osc_nconnection%2] = lo_address_new_from_url(lo_address_get_url(a));
        printf("OSC client %i address changed to:%s\n", osc_nconnection%2, lo_address_get_url(address[osc_nconnection%2]));
        
        
        ++osc_nconnection;
        if(osc_nclient < 2)
            ++osc_nclient;
    }

    struct deck *de;
    struct player *pl;

    fprintf(stderr, "osc_nclient %i osc_ndeck: %i\n", osc_nclient, osc_ndeck);
    int d;
    for(d = 0; d < osc_ndeck; ++d) {
        de = &osc_deck[d];
        pl = &de->player;
        osc_send_track_load(de);
        osc_send_ppm_block(pl->track);
    }
        
    
    return 0;
}
Esempio n. 22
0
    int
    Client::osc_announce_reply(const char *path,
                               const char *types,
                               lo_arg **argv,
                               int argc,
                               lo_message msg,
                               void *user_data)
    {
        if(strcmp(&argv[0]->s, "/nsm/server/announce"))
            return -1;

        NSM::Client *nsm = (NSM::Client *)user_data;

//        MESSAGE( "Successfully registered. NSM says: %s", &argv[1]->s );
        nsm->nsm_is_active = true;
        nsm->_session_manager_name = strdup(&argv[2]->s);
        nsm->nsm_addr =
            lo_address_new_from_url(lo_address_get_url(lo_message_get_source(
                                                           msg)));

        nsm->command_active(nsm->nsm_is_active);

        return 0;
    }
Esempio n. 23
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {

  int err;
  int hslen;
  lo_address d;

  if (nrhs != 2 && nrhs!=1) {
    mexErrMsgTxt("Please specify host name/address and port or URL");
    return;
  }
  if (nlhs > 1) {
    mexErrMsgTxt("Too many output arguments.");
    return;
  }

  if(! mxIsChar(prhs[0])) {
    mexErrMsgTxt("Expecting a character array in the first argument (hostname or URL).");
    return;
  }

  if(nrhs==2 && ! mxIsNumeric(prhs[1])) {
    mexErrMsgTxt("Expecting a numeric scalar in the second argument (port number).");
    return;
  }

  hslen = (mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1;
  if(hslen > sizeof(host)+1) {
    mexErrMsgTxt("Maximum url/hostname string length is 255 characters.");
    return;
  }
  err = mxGetString(prhs[0], host, hslen);

  if(err != 0) {
    mexErrMsgTxt("Error reading url/hostname string.");
    return;
  }

  if (nrhs==2) {
      sprintf(port, "%d", (int)(mxGetScalar(prhs[1])));
      d = lo_address_new(host, port);
  } else {
      d = lo_address_new_from_url(host);
  }

  if(! d) {
    mexErrMsgTxt(lo_address_errstr(d));
    return;
  }

  if(sizeof(d) == sizeof(long int)) {
    sprintf(maddr, "osc_address:%lx", (long int)d);
  } else if(sizeof(d) == sizeof(long long int)) {
    sprintf(maddr, "osc_address:%llx", (long long int)d);
  } else {
    mexErrMsgTxt("Unsupported pointer size.");
    return;
  }
  
  plhs[0] = mxCreateString(maddr);

}
Esempio n. 24
0
// *********************************************************
// -(new)---------------------------------------------------
void *oscmulticast_new(t_symbol *s, int argc, t_atom *argv)
{
	t_oscmulticast *x = NULL;
    int i, got_port = 0;
    char address[64];

#ifdef MAXMSP
    if ((x = object_alloc(oscmulticast_class))) {
        x->outlet3 = listout((t_object *)x);
        x->outlet2 = listout((t_object *)x);
        x->outlet1 = listout((t_object *)x);
#else
    if (x = (t_oscmulticast *) pd_new(oscmulticast_class)) {
        x->outlet1 = outlet_new(&x->ob, gensym("list"));
        x->outlet2 = outlet_new(&x->ob, gensym("list"));
        x->outlet3 = outlet_new(&x->ob, gensym("list"));
#endif

        x->group = NULL;
        x->iface = NULL;

        if (argc < 4) {
            post("oscmulticast: not enough arguments!\n");
            return NULL;
        }
        for (i = 0; i < argc; i++) {
            if(strcmp(maxpd_atom_get_string(argv+i), "@group") == 0) {
                if ((argv+i+1)->a_type == A_SYM) {
                    x->group = strdup(maxpd_atom_get_string(argv+i+1));
                    i++;
                }
            }
            else if (strcmp(maxpd_atom_get_string(argv+i), "@port") == 0) {
                if ((argv+i+1)->a_type == A_FLOAT) {
                    snprintf(x->port, 10, "%i", (int)maxpd_atom_get_float(argv+i+1));
                    got_port = 1;
                    i++;
                }
#ifdef MAXMSP
                else if ((argv+i+1)->a_type == A_LONG) {
                    snprintf(x->port, 10, "%i", (int)atom_getlong(argv+i+1));
                    got_port = 1;
                    i++;
                }
#endif
            }
            else if(strcmp(maxpd_atom_get_string(argv+i), "@interface") == 0) {
                if ((argv+i+1)->a_type == A_SYM) {
                    x->iface = strdup(maxpd_atom_get_string(argv+i+1));
                    i++;
                }
            }
        }

        if (!x->group || !got_port) {
            post("oscmulticast: need to specify group and port!");
            return NULL;
        }

        /* Open address */
        snprintf(address, 64, "osc.udp://%s:%s", x->group, x->port);
        x->address = lo_address_new_from_url(address);
        if (!x->address) {
            post("oscmulticast: could not create lo_address.");
            return NULL;
        }

        /* Set TTL for packet to 1 -> local subnet */
        lo_address_set_ttl(x->address, 1);

        /* Specify the interface to use for multicasting */
        if (x->iface) {
            if (lo_address_set_iface(x->address, x->iface, 0)) {
                post("oscmulticast: could not create lo_address.");
                return NULL;
            }
            x->server = lo_server_new_multicast_iface(x->group, x->port, x->iface, 0, 0);
        }
        else {
            x->server = lo_server_new_multicast(x->group, x->port, 0);
        }

        if (!x->server) {
            post("oscmulticast: could not create lo_server");
            lo_address_free(x->address);
            return NULL;
        }

        // Disable liblo message queueing
        lo_server_enable_queue(x->server, 0, 1);

        if (x->iface)
            post("oscmulticast: using interface %s", lo_address_get_iface(x->address));
        else
            post("oscmulticast: using default interface");
        lo_server_add_method(x->server, NULL, NULL, oscmulticast_handler, x);

#ifdef MAXMSP
        x->clock = clock_new(x, (method)oscmulticast_poll);	// Create the timing clock
#else
        x->clock = clock_new(x, (t_method)oscmulticast_poll);
#endif
        clock_delay(x->clock, INTERVAL);  // Set clock to go off after delay
    }
	return (x);
}

// *********************************************************
// -(free)--------------------------------------------------
void oscmulticast_free(t_oscmulticast *x)
{
    if (x->clock) {
        clock_unset(x->clock);	// Remove clock routine from the scheduler
        clock_free(x->clock);		// Frees memory used by clock
    }
    if (x->server) {
        lo_server_free(x->server);
    }
    if (x->address) {
        lo_address_free(x->address);
    }
    if (x->iface) {
        free(x->iface);
    }
    if (x->group) {
        free(x->group);
    }
}

// *********************************************************
// -(inlet/outlet assist - maxmsp only)---------------------
#ifdef MAXMSP
void oscmulticast_assist(t_oscmulticast *x, void *b, long m, long a, char *s)
{
	if (m == ASSIST_INLET) { // inlet
		sprintf(s, "OSC to be sent to multicast bus");
	}
	else {	// outlet
        sprintf(s, "OSC from multicast bus");
	}
}
#endif

// *********************************************************
// -(interface)---------------------------------------------
static void oscmulticast_interface(t_oscmulticast *x, t_symbol *s, int argc, t_atom *argv)
{
    const char *iface = 0;

    if (argc < 1)
        return;

    if (argv->a_type != A_SYM)
        return;

    iface = maxpd_atom_get_string(argv);

    if (lo_address_set_iface(x->address, iface, 0)) {
        post("oscmulticast: could not create lo_address.");
        return;
    }

    if (x->server)
        lo_server_free(x->server);
    x->server = lo_server_new_multicast_iface(x->group, x->port, iface, 0, 0);

    if (!x->server) {
        post("oscmulticast: could not create lo_server");
        return;
    }

    post("oscmulticast: using interface %s", lo_address_get_iface(x->address));
    lo_server_add_method(x->server, NULL, NULL, oscmulticast_handler, x);
}

// *********************************************************
// -(anything)----------------------------------------------
void oscmulticast_anything(t_oscmulticast *x, t_symbol *s, int argc, t_atom *argv)
{
    lo_message m = lo_message_new();
    if (!m) {
        post("lo_message_new() error");
        return;
    }

    int i;
    for (i=0; i<argc; i++)
    {
        switch ((argv + i)->a_type)
        {
			case A_FLOAT:
                lo_message_add_float(m, atom_getfloat(argv + i));
                break;
#ifdef MAXMSP
            case A_LONG:
                lo_message_add_int32(m, (int)atom_getlong(argv + i));
                break;
#endif
            case A_SYM:
                lo_message_add_string(m, maxpd_atom_get_string(argv + i));
                break;
        }
    }
    //set timetag?

    lo_send_message(x->address, s->s_name, m);
    lo_message_free(m);
}
Esempio n. 25
0
int main()
{
    lo_blob btest = lo_blob_new(sizeof(testdata), testdata);
    lo_server_thread st, sta, stb;
    lo_server s = lo_server_new(NULL, error);
    lo_bundle b;
    lo_message m1, m2;
    char *server_url, *path, *protocol, *host, *port;
    const char *host2, *port2;
    lo_address a;
    uint8_t midi_data[4] = {0xff, 0xf7, 0xAA, 0x00};
    union end_test32 et32;
    union end_test64 et64;
    lo_timetag tt = {0x1, 0x80000000}, sched;
    int count;
    int proto;
    char cmd[256];

    test_deserialise();

    sta = lo_server_thread_new("7591", error);
    stb = lo_server_thread_new("7591", rep_error);
    if (stb) {
	fprintf(stderr, "FAILED: create bad server thread object!\n");
	exit(1);
    }
    lo_server_thread_free(sta);

    /* leak check */
    st = lo_server_thread_new(NULL, error);
    lo_server_thread_start(st);
#ifdef WIN32
    Sleep(4);
#else
    usleep(4000);
#endif
    lo_server_thread_stop(st);
    lo_server_thread_free(st);
    st = lo_server_thread_new(NULL, error);
    lo_server_thread_start(st);
    lo_server_thread_stop(st);
    lo_server_thread_free(st);
    st = lo_server_thread_new(NULL, error);
    lo_server_thread_free(st);
    st = lo_server_thread_new(NULL, error);
    lo_server_thread_free(st);
    st = lo_server_thread_new(NULL, error);

    a = lo_address_new_from_url("osc://localhost/");
    TEST(a != NULL);
    lo_address_free(a);

    a = lo_address_new_from_url("osc.://localhost/");
    TEST(a == NULL);


    atexit(exitcheck);

    printf("type tests\n");
    TEST(sizeof(float) == sizeof(int32_t));
    TEST(sizeof(double) == sizeof(int64_t));

    et32.i = 0x23242526U;
    et32.i = lo_htoo32(et32.i);
    if (et32.c[0] != 0x23 || et32.c[1] != 0x24 || et32.c[2] != 0x25 ||
	et32.c[3] != 0x26) {
	fprintf(stderr, "failed 32bit endian conversion test\n");
	fprintf(stderr, "0x23242526 -> %X\n", et32.i);
	exit(1);
    } else {
	printf("passed 32bit endian conversion test\n");
    }

    et64.i = 0x232425262728292AULL;
    et64.i = lo_htoo64(et64.i);
    if (et64.c[0] != 0x23 || et64.c[1] != 0x24 || et64.c[2] != 0x25 ||
	et64.c[3] != 0x26 || et64.c[4] != 0x27 || et64.c[5] != 0x28 ||
	et64.c[6] != 0x29 || et64.c[7] != 0x2A) {
	fprintf(stderr, "failed 64bit endian conversion\n");
	fprintf(stderr, "0x232425262728292A -> %llX\n", (long long unsigned int)et64.i);
	exit(1);
    } else {
	printf("passed 64bit endian conversion\n");
    }
    printf("\n");

    /* OSC URL tests */
    path = lo_url_get_path("osc.udp://localhost:9999/a/path/is/here");
    if (strcmp(path, "/a/path/is/here")) {
	printf("failed lo_url_get_path() test1\n");
	printf("'%s' != '/a/path/is/here'\n", path);
	exit(1);
    } else {
	printf("passed lo_url_get_path() test1\n");
    }
    free(path);

    protocol = lo_url_get_protocol("osc.udp://localhost:9999/a/path/is/here");
    if (strcmp(protocol, "udp")) {
	printf("failed lo_url_get_protocol() test1\n");
	printf("'%s' != 'udp'\n", protocol);
	exit(1);
    } else {
	printf("passed lo_url_get_protocol() test1\n");
    }
    free(protocol);

    protocol = lo_url_get_protocol("osc.tcp://localhost:9999/a/path/is/here");
    if (strcmp(protocol, "tcp")) {
	printf("failed lo_url_get_protocol() test2\n");
	printf("'%s' != 'tcp'\n", protocol);
	exit(1);
    } else {
	printf("passed lo_url_get_protocol() test2\n");
    }
    free(protocol);
    
    protocol = lo_url_get_protocol("osc.udp://[::ffff:localhost]:9999/a/path/is/here");
    if (strcmp(protocol, "udp")) {
	printf("failed lo_url_get_protocol() test1 (IPv6)\n");
	printf("'%s' != 'udp'\n", protocol);
	exit(1);
    } else {
	printf("passed lo_url_get_protocol() test1 (IPv6)\n");
    }
    free(protocol);

    proto = lo_url_get_protocol_id("osc.udp://localhost:9999/a/path/is/here");
    if (proto != LO_UDP) {
	printf("failed lo_url_get_protocol_id() test1\n");
	printf("'%d' != LO_UDP\n", proto);
	exit(1);
    } else {
	printf("passed lo_url_get_protocol_id() test1\n");
    }

    proto = lo_url_get_protocol_id("osc.tcp://localhost:9999/a/path/is/here");
    if (proto != LO_TCP) {
	printf("failed lo_url_get_protocol_id() test2\n");
	printf("'%d' != LO_TCP\n", proto);
	exit(1);
    } else {
	printf("passed lo_url_get_protocol_id() test2\n");
    }
    
    proto = lo_url_get_protocol_id("osc.invalid://localhost:9999/a/path/is/here");
    if (proto != -1) {
	printf("failed lo_url_get_protocol_id() test3\n");
	printf("'%d' != -1\n", proto);
	exit(1);
    } else {
	printf("passed lo_url_get_protocol_id() test3\n");
    }
    
    proto = lo_url_get_protocol_id("osc.udp://[::ffff:localhost]:9999/a/path/is/here");
    if (proto != LO_UDP) {
	printf("failed lo_url_get_protocol_id() test1 (IPv6)\n");
	printf("'%d' != LO_UDP\n", proto);
	exit(1);
    } else {
	printf("passed lo_url_get_protocol_id() test1 (IPv6)\n");
    }

    host = lo_url_get_hostname("osc.udp://foo.example.com:9999/a/path/is/here");
    if (strcmp(host, "foo.example.com")) {
	printf("failed lo_url_get_hostname() test1\n");
	printf("'%s' != 'foo.example.com'\n", host);
	exit(1);
    } else {
	printf("passed lo_url_get_hostname() test1\n");
    }
    free(host);

    host = lo_url_get_hostname("osc.udp://[0000::::0001]:9999/a/path/is/here");
    if (strcmp(host, "0000::::0001")) {
	printf("failed lo_url_get_hostname() test2 (IPv6)\n");
	printf("'%s' != '0000::::0001'\n", host);
	exit(1);
    } else {
	printf("passed lo_url_get_hostname() test2 (IPv6)\n");
    }
    free(host);

    port = lo_url_get_port("osc.udp://localhost:9999/a/path/is/here");
    if (strcmp(port, "9999")) {
	printf("failed lo_url_get_port() test1\n");
	printf("'%s' != '9999'\n", port);
	exit(1);
    } else {
	printf("passed lo_url_get_port() test1\n");
    }
    free(port);
    
    port = lo_url_get_port("osc.udp://[::ffff:127.0.0.1]:9999/a/path/is/here");
    if (strcmp(port, "9999")) {
	printf("failed lo_url_get_port() test1 (IPv6)\n");
	printf("'%s' != '9999'\n", port);
	exit(1);
    } else {
	printf("passed lo_url_get_port() test1 (IPv6)\n");
    }
    free(port);
    printf("\n");
    
    
    
    
    
    a = lo_address_new_from_url("osc.tcp://foo.example.com:9999/");
    host2 = lo_address_get_hostname(a);
    if (strcmp(host2, "foo.example.com")) {
	printf("failed lo_address_get_hostname() test\n");
	printf("'%s' != 'foo.example.com'\n", host2);
	exit(1);
    } else {
	printf("passed lo_address_get_hostname() test\n");
    }

    port2 = lo_address_get_port(a);
    if (strcmp(port2, "9999")) {
	printf("failed lo_address_get_port() test\n");
	printf("'%s' != '9999'\n", port2);
	exit(1);
    } else {
	printf("passed lo_address_get_port() test\n");
    }

    proto = lo_address_get_protocol(a);
    if (proto != LO_TCP) {
	printf("failed lo_address_get_protocol() test\n");
	printf("'%d' != '%d'\n", proto, LO_TCP);
	exit(1);
    } else {
	printf("passed lo_address_get_protocol() test\n");
    }

    server_url = lo_address_get_url(a);
    if (strcmp(server_url, "osc.tcp://foo.example.com:9999/")) {
	printf("failed lo_address_get_url() test\n");
	printf("'%s' != '%s'\n", server_url, "osc.tcp://foo.example.com:9999/");
	exit(1);
    } else {
	printf("passed lo_address_get_url() test\n");
    }
    free(server_url);
    lo_address_free( a );
    printf("\n");
    

    /* Test blod sizes */
    if (lo_blob_datasize(btest) != 5 || lo_blobsize(btest) != 12) {
	printf("blob is %d (%d) bytes long, should be 5 (12)\n",
               lo_blob_datasize(btest), lo_blobsize(btest));
	lo_arg_pp(LO_BLOB, btest);
	printf(" <- blob\n");
	exit(1);
    }
    
    
    
    /* Server method handler tests */
    server_url = lo_server_thread_get_url(st);
    a = lo_address_new_from_url(server_url);
    printf("Server URL: %s\n", server_url);
    free(server_url);

    /* add method that will match the path /foo/bar, with two numbers, coerced
     * to float and int */

    lo_server_thread_add_method(st, "/foo/bar", "fi", foo_handler, lo_server_thread_get_server(st));

    lo_server_thread_add_method(st, "/reply", "s", reply_handler, NULL);

    lo_server_thread_add_method(st, "/lotsofformats", "fisbmhtdSccTFNI",
				lots_handler, NULL);

    lo_server_thread_add_method(st, "/coerce", "dfhiSs",
				coerce_handler, NULL);

    lo_server_thread_add_method(st, "/bundle", NULL,
				bundle_handler, NULL);
    lo_server_thread_add_method(st, "/timestamp", NULL,
				timestamp_handler, NULL);
    lo_server_thread_add_method(st, "/jitter", "ti",
				jitter_handler, NULL);

    lo_server_thread_add_method(st, "/pattern/foo", NULL,
				pattern_handler, "foo");
    lo_server_thread_add_method(st, "/pattern/bar", NULL,
				pattern_handler, "bar");
    lo_server_thread_add_method(st, "/pattern/baz", NULL,
				pattern_handler, "baz");

    lo_server_thread_add_method(st, "/subtest", "i",
				subtest_handler, st);

    lo_server_thread_add_method(st, "/subtest-reply", "i",
				subtest_reply_handler, NULL);

    /* add method that will match any path and args */
    lo_server_thread_add_method(st, NULL, NULL, generic_handler, NULL);

    /* add method that will match the path /quit with no args */
    lo_server_thread_add_method(st, "/quit", "", quit_handler, NULL);

    /* check that the thread restarts */
    lo_server_thread_start(st);
    lo_server_thread_stop(st);
    lo_server_thread_start(st);

    if (lo_send(a, "/foo/bar", "ff", 0.12345678f, 23.0f) == -1) {
	printf("OSC error A %d: %s\n", lo_address_errno(a), lo_address_errstr(a));
	exit(1);
    }

    if (lo_send(a, "/foo/bar", "ff", 0.12345678f, 23.0f) == -1) {
	printf("OSC error B %d: %s\n", lo_address_errno(a), lo_address_errstr(a));
	exit(1);
    }

    test_validation(a);
    test_multicast(st);

    lo_send(a, "/", "i", 242);
    lo_send(a, "/pattern/", "i", 243);

#ifndef _MSC_VER  /* MS compiler refuses to compile this case */
    lo_send(a, "/bar", "ff", 0.12345678f, 1.0/0.0);
#endif
    lo_send(a, "/lotsofformats", "fisbmhtdSccTFNI", 0.12345678f, 123, "123",
	    btest, midi_data, 0x0123456789abcdefULL, tt, 0.9999, "sym",
	    'X', 'Y');
    lo_send(a, "/coerce", "fdihsS", 0.1f, 0.2, 123, 124LL, "aaa", "bbb");
    lo_send(a, "/coerce", "ffffss", 0.1f, 0.2f, 123.0, 124.0, "aaa", "bbb");
    lo_send(a, "/coerce", "ddddSS", 0.1, 0.2, 123.0, 124.0, "aaa", "bbb");
    lo_send(a, "/a/b/c/d", "sfsff", "one", 0.12345678f, "three",
	    -0.00000023001f, 1.0);
    lo_send(a, "/a/b/c/d", "b", btest);

    TEST(test_varargs(a, "/lotsofformats", "fisbmhtdSccTFNI", 0.12345678f, 123,
                      "123", btest, midi_data, 0x0123456789abcdefULL, tt,
                      0.9999, "sym", 'X', 'Y', LO_ARGS_END) == 0);

#ifdef __GNUC__
    // Note: Lack of support for variable-argument macros in non-GCC compilers
    //       does not allow us to test for these conditions.

    // too many args
    TEST(test_varargs(a, "/lotsofformats", "f", 0.12345678f, 123,
                      "123", btest, midi_data, 0x0123456789abcdefULL, tt,
                      0.9999, "sym", 'X', 'Y', LO_ARGS_END) != 0);
    // too many types
    TEST(test_varargs(a, "/lotsofformats", "fisbmhtdSccTFNI", 0.12345678f, 123,
                      "123", btest, midi_data, 0x0123456789abcdefULL, tt, 0.5,
                      LO_ARGS_END) != 0);
#endif

    // test lo_message_add
    m1 = lo_message_new();
    TEST(lo_message_add(m1, "fisbmhtdSccTFNI", 0.12345678f, 123, "123",
                        btest, midi_data, 0x0123456789abcdefULL, tt, 0.9999, "sym",
                        'X', 'Y') == 0);
    lo_send_message(a, "/lotsofformats", m1);
    lo_message_free(m1);
 
    lo_blob_free(btest);

    lo_send(a, "/pattern/*", "s", "a");
    lo_send(a, "/pattern/ba[rz]", "s", "b");

    server_url = lo_server_thread_get_url(st);
    sprintf(cmd, "." PATHDELIM "subtest %s &", server_url);
    if (system(cmd) != 0) {
	fprintf(stderr, "Cannot execute subtest command\n");
	exit(1);
    }
    system(cmd);
    free(server_url);

#ifdef WIN32
    Sleep(2000);
#else
    sleep(2);
#endif
    TEST(reply_count == 3);
    TEST(pattern_count == 5);
    TEST(subtest_count == 2);
    TEST(subtest_reply_count == 22);
    printf("\n");

    {
        lo_timetag t = {10,0xFFFFFFFC};
        b = lo_bundle_new(t);
    }
    m1 = lo_message_new();
    lo_message_add_string(m1, "abcdefghijklmnopqrstuvwxyz");
    lo_message_add_string(m1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    lo_bundle_add_message(b, "/bundle", m1);
    lo_send_bundle(a, b);

    /* This should be safe for multiple copies of the same message. */
    lo_bundle_free_messages(b);

    {
        lo_timetag t = {1,2};
        b = lo_bundle_new(t);
    }
    m1 = lo_message_new();
    lo_message_add_int32(m1, 23);
    lo_message_add_string(m1, "23");
    lo_bundle_add_message(b, "/bundle", m1);
    m2 = lo_message_new();
    lo_message_add_string(m2, "24");
    lo_message_add_int32(m2, 24);
    lo_bundle_add_message(b, "/bundle", m2);
    lo_bundle_add_message(b, "/bundle", m1);

/* 
    lo_send_bundle(a, b);
    if (a->errnum) {
	printf("error %d: %s\n", a->errnum, a->errstr);
	exit(1);
    }
*/
    TEST(lo_send_bundle(a, b) == 88);

    /* Test freeing out-of-order copies of messages in a bundle. */
    lo_bundle_free_messages(b);

    {
        lo_timetag t = {10,0xFFFFFFFE};
        b = lo_bundle_new(t);
    }
    m1 = lo_message_new();
    lo_message_add_string(m1, "abcdefghijklmnopqrstuvwxyz");
    lo_message_add_string(m1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    lo_bundle_add_message(b, "/bundle", m1);
    lo_send_bundle(a, b);
    lo_message_free(m1);
    lo_bundle_free(b);

    lo_timetag_now(&sched);

    sched.sec += 5;
    b = lo_bundle_new(sched);
    m1 = lo_message_new();
    lo_message_add_string(m1, "future");
    lo_message_add_string(m1, "time");
    lo_message_add_string(m1, "test");
    lo_bundle_add_message(b, "/bundle", m1);

    lo_send_bundle(a, b);
    lo_message_free(m1);
    lo_bundle_free(b);

    lo_send_timestamped(a, sched, "/bundle", "s", "lo_send_timestamped() test");

    /* test bundle timestamp ends up in message struct (and doesn't end up in
       unbundled messages) */
    lo_timetag_now(&sched);    
    lo_send_timestamped(a, sched, "/timestamp", "it", 1, sched);
    lo_send(a, "/timestamp", "it", 0, sched);

#define JITTER_ITS 25
    /* jitter tests */
    {
	lo_timetag stamps[JITTER_ITS];
	lo_timetag now;
	int i;

	for (i=0; i<JITTER_ITS; i++) {
	    lo_timetag_now(&now);
	    stamps[i] = now;
	    stamps[i].sec += 1;
	    stamps[i].frac = rand();
	    lo_send_timestamped(a, stamps[i], "/jitter", "ti", stamps[i], i);
	}
    }

#ifdef WIN32
    Sleep(2000);
#else
    sleep(2);
#endif

    lo_address_free(a);

    TEST(lo_server_thread_events_pending(st));

    while (lo_server_thread_events_pending(st)) {
	printf("pending events, wait...\n");
#ifdef WIN32
	fflush(stdout);
	Sleep(1000);
#else
	sleep(1);
#endif
    }
    
    TEST(bundle_count == 7);
    printf("\n");

    printf("bundle timing jitter results:\n"
	   "max jitter = %fs\n"
	   "avg jitter = %fs\n"
           "min jitter = %fs\n\n",
           jitter_max, jitter_total/(float)jitter_count, jitter_min);

    server_url = lo_server_get_url(s);

    lo_server_add_method(s, NULL, NULL, generic_handler, NULL);
    a = lo_address_new_from_url(server_url);
    TEST(lo_server_recv_noblock(s, 0) == 0);
    printf("Testing noblock API on %s\n", server_url);
    lo_send(a, "/non-block-test", "f", 23.0);

    count = 0;
    while (!lo_server_recv_noblock(s, 10) && count++ < 1000) { }
    if (count >= 1000) {
	printf("lo_server_recv_noblock() test failed\n");

	exit(1);
    }

    /* Delete methods */
    lo_server_thread_del_method(st, "/coerce", "dfhiSs");
    lo_server_del_method(s, NULL, NULL);

    lo_address_free(a);
    lo_server_free(s);
    free(server_url);

#ifndef WIN32
    { /* UNIX domain tests */
	lo_address ua;
	lo_server us;
	char *addr;

	unlink("/tmp/testlo.osc");
	us = lo_server_new_with_proto("/tmp/testlo.osc", LO_UNIX, error);
	ua = lo_address_new_from_url("osc.unix:///tmp/testlo.osc");
	TEST(lo_server_get_protocol(us) == LO_UNIX);
	TEST(lo_send(ua, "/unix", "f", 23.0) == 16);
	TEST(lo_server_recv(us) == 16);
	addr = lo_server_get_url(us);
	TEST(!strcmp("osc.unix:////tmp/testlo.osc", addr));
	free(addr);
	lo_address_free(ua);
	ua = lo_address_new_with_proto(LO_UNIX, NULL, "/tmp/testlo.osc");
	TEST(lo_send(ua, "/unix", "f", 23.0) == 16);
	TEST(lo_server_recv(us) == 16);
	lo_server_free(us);
	lo_address_free(ua);
    }
#endif

    { /* TCP tests */
	lo_address ta;
	lo_server ts;
	char *addr;

	ts = lo_server_new_with_proto(NULL, LO_TCP, error);
	addr = lo_server_get_url(ts);
	ta = lo_address_new_from_url(addr);
	if (lo_address_errno(ta)) {
	    printf("err: %s\n", lo_address_errstr(ta));
	    exit(1);
	}
	TEST(lo_server_get_protocol(ts) == LO_TCP);
	TEST(lo_send(ta, "/tcp", "f", 23.0) == 16);
	TEST(lo_send(ta, "/tcp", "f", 23.0) == 16);
	TEST(lo_server_recv(ts) == 16);
	TEST(lo_server_recv(ts) == 16);
	free(addr);
	lo_server_free(ts);
	lo_address_free(ta);
    }

    server_url = lo_server_thread_get_url(st);
    a = lo_address_new_from_url(server_url);
    /* exit */
    lo_send(a, "/quit", NULL);
    lo_address_free(a);

    while (!done) {
#ifdef WIN32
    Sleep(1);
#else
	usleep(1000);
#endif
    }

    lo_server_thread_free(st);
    free(server_url);


    return 0;
}
Esempio n. 26
0
/* catch any osc incoming messages. */
int
OscCtrlServer::osc_handler(const char *path,
                           const char *types,
                           lo_arg ** argv, int argc, void * /*data */ ,
                           void *user_data) {
  OscCtrlServer *context = static_cast<OscCtrlServer *>(user_data);
  std::shared_ptr<QuiddityManager> manager =
      context->get_quiddity_manager();
  if (!(bool) manager) {
    g_warning("OscCtrlServer: cannot get quiddity manager");
    return 0;
  }

  // create
  if (g_str_has_prefix(path, "/c") || g_str_has_prefix(path, "/C")) {
    if (argc == 1) {
      gchar *class_name = string_from_osc_arg(types[0], argv[0]);
      manager->create(class_name);
      g_free(class_name);
    }
    else if (argc == 2) {
      gchar *class_name = string_from_osc_arg(types[0], argv[0]);
      gchar *quid_name = string_from_osc_arg(types[1], argv[1]);
      manager->create(class_name, quid_name);
      g_free(class_name);
      g_free(quid_name);
    }
    else
      g_warning("OSCctl: wrong arg number for create");
    return 0;
  }

  // remove
  if (g_str_has_prefix(path, "/r") || g_str_has_prefix(path, "/R")) {
    if (argc == 1) {
      gchar *quid_name = string_from_osc_arg(types[0], argv[0]);
      manager->remove(quid_name);
      g_free(quid_name);
    }
    else
      g_warning("OSCctl: wrong arg number for remove");
    return 0;
  }

  // set_property
  if (g_str_has_prefix(path, "/s") || g_str_has_prefix(path, "/S")) {
    if (argc == 3) {
      gchar *quid_name = string_from_osc_arg(types[0], argv[0]);
      gchar *prop_name = string_from_osc_arg(types[1], argv[1]);
      gchar *value = string_from_osc_arg(types[2], argv[2]);
      manager->set_property(quid_name, prop_name, value);
      g_free(quid_name);
      g_free(prop_name);
      g_free(value);
    }
    else
      g_warning("OSCctl: wrong arg number for set_property");
    return 0;
  }

  // invoke
  if (g_str_has_prefix(path, "/i") || g_str_has_prefix(path, "/I")) {
    if (argc >= 2) {
      gchar *quid_name = string_from_osc_arg(types[0], argv[0]);
      gchar *method_name = string_from_osc_arg(types[1], argv[1]);
      int i;
      std::vector<std::string> args;
      for (i = 2; i < argc; i++) {
        gchar *val = string_from_osc_arg(types[i], argv[i]);
        args.push_back(val);
        g_free(val);
      }
      manager->invoke(quid_name, method_name, nullptr, args);
      g_free(quid_name);
      g_free(method_name);
    }
    else
      g_warning("OSCctl: wrong arg number for invoke");
    return 0;
  }

  // add an osc subscriber
  if (g_str_has_prefix(path, "/a") || g_str_has_prefix(path, "/A")) {
    if (argc == 3) {
      gchar *subscriber_name = string_from_osc_arg(types[0], argv[0]);
      gchar *host = string_from_osc_arg(types[1], argv[1]);
      gchar *port = string_from_osc_arg(types[2], argv[2]);
      gchar *port_int = string_float_to_string_int(port);
      gchar *internal_subscriber_name =
          context->make_internal_subscriber_name(subscriber_name);
      if (context->osc_subscribers_.end() ==
          context->osc_subscribers_.find(internal_subscriber_name)) {
        g_warning
            ("OscCtrlServer: a subscriber named %s is already registered",
             subscriber_name);
        return 0;
      }
      if (host == nullptr || port_int == nullptr) {
        g_warning("OscCtrlServer: issue with host name or port");
        return 0;
      }
      context->osc_subscribers_[internal_subscriber_name] =
          std::make_pair(host, port_int);
      if (!manager->make_property_subscriber(internal_subscriber_name,
                                             OscCtrlServer::prop_cb,
                                             context))
        return 0;

      g_debug("subscriber %s, %s, %s", subscriber_name, host, port_int);

      g_free(internal_subscriber_name);
      g_free(subscriber_name);
      g_free(host);
      g_free(port);
      g_free(port_int);
    }
    else
      g_warning("OSCctl: add subscriber needs 3 args (name, host, port)");
    return 0;
  }

  // delete an osc subscriber
  if (g_str_has_prefix(path, "/d") || g_str_has_prefix(path, "/D")) {
    if (argc == 1) {
      gchar *subscriber_name = string_from_osc_arg(types[0], argv[0]);
      gchar *internal_subscriber_name =
          context->make_internal_subscriber_name(subscriber_name);
      auto it = context->osc_subscribers_.find(internal_subscriber_name);
      if (context->osc_subscribers_.end() == it) {
        g_warning
            ("OscCtrlServer: cannot delete non existing subscriber named %s",
             subscriber_name);
        return 0;
      }
      manager->remove_property_subscriber(internal_subscriber_name);
      context->osc_subscribers_.erase(it);
      g_free(internal_subscriber_name);
      g_free(subscriber_name);
    }
    else
      g_warning("OSCctl: delete subscriber needs 1 args (name)");
    return 0;
  }

  // subscribe to a property
  if (g_strcmp0(path, "/get") == 0) {
    if (argc == 3) {
      gchar *quiddity_name = string_from_osc_arg(types[0], argv[0]);
      gchar *property_name = string_from_osc_arg(types[1], argv[1]);
      gchar *response_url = string_from_osc_arg(types[2], argv[2]);

      if (quiddity_name == nullptr || property_name == nullptr
          || response_url == nullptr) {
        g_warning
            ("OscCtrlServer: issue with quiddity name or property name or response url");
        return 0;
      }

      std::string value = manager->get_property(quiddity_name,
                                                property_name);
      lo_address response_lo_address =
          lo_address_new_from_url(response_url);

      if (response_lo_address != nullptr
          && !lo_address_errno(response_lo_address)) {
        gchar *message = g_strdup_printf("/%s/%s",
                                         quiddity_name,
                                         property_name);
        lo_send(response_lo_address, message, "s", value.c_str());
        lo_address_free(response_lo_address);
        g_free(message);
      }
      else
        g_debug("url osc error in get");

      g_free(quiddity_name);
      g_free(property_name);
      g_free(response_url);
    }
    else
      g_warning
          ("OSCctl: subscribe property needs 3 args (name, quiddity, property)");
    return 0;
  }

  // subscribe to a property
  if (g_str_has_prefix(path, "/get_property_")
      || g_str_has_prefix(path, "/G")) {
    if (argc == 3) {
      gchar *subscriber_name = string_from_osc_arg(types[0], argv[0]);
      gchar *quiddity_name = string_from_osc_arg(types[1], argv[1]);
      gchar *property_name = string_from_osc_arg(types[2], argv[2]);
      gchar *internal_subscriber_name =
          context->make_internal_subscriber_name(subscriber_name);
      if (context->osc_subscribers_.end() ==
          context->osc_subscribers_.find(internal_subscriber_name)) {
        g_warning
            ("OscCtrlServer: a subscriber named %s does not exist",
             subscriber_name);
        return 0;
      }
      if (quiddity_name == nullptr || property_name == nullptr) {
        g_warning
            ("OscCtrlServer: issue with quiddity name or property name");
        return 0;
      }

      if (!manager->subscribe_property(internal_subscriber_name,
                                       quiddity_name, property_name))
        g_warning("OscCtrlServer: pb subscribing to %s, %s",
                  quiddity_name, property_name);

      g_free(internal_subscriber_name);
      g_free(subscriber_name);
      g_free(quiddity_name);
      g_free(property_name);
    }
    else
      g_warning
          ("OSCctl: subscribe property needs 3 args (name, quiddity, property)");
    return 0;
  }

  // unsubscribe to a property
  if (g_str_has_prefix(path, "/u") || g_str_has_prefix(path, "/U")) {
    if (argc == 3) {
      gchar *subscriber_name = string_from_osc_arg(types[0], argv[0]);
      gchar *quiddity_name = string_from_osc_arg(types[1], argv[1]);
      gchar *property_name = string_from_osc_arg(types[2], argv[2]);
      gchar *internal_subscriber_name =
          context->make_internal_subscriber_name(subscriber_name);
      if (context->osc_subscribers_.end() ==
          context->osc_subscribers_.find(internal_subscriber_name)) {
        g_warning
            ("OscCtrlServer: a subscriber named %s does not exist",
             subscriber_name);
        return 0;
      }
      if (quiddity_name == nullptr || property_name == nullptr) {
        g_warning
            ("OscCtrlServer: issue with quiddity name or property name");
        return 0;
      }

      if (!manager->unsubscribe_property(internal_subscriber_name,
                                         quiddity_name, property_name))
        g_warning("OscCtrlServer: pb unsubscribing to %s, %s",
                  quiddity_name, property_name);

      g_free(internal_subscriber_name);
      g_free(subscriber_name);
      g_free(quiddity_name);
      g_free(property_name);
    }
    else
      g_warning
          ("OSCctl: unsubscribe property needs 3 args (name, quiddity, property)");
    return 0;
  }

  g_debug("unknown osc path %s", path);
  return 0;
}
Esempio n. 27
0
int dest_handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data)
{
	if (dest != NULL) free(dest);
	dest = lo_address_new_from_url((char*) argv[0]);
	return 0;
}