Files
veejay/veejay-ng/ui/uiosc.c
Niels Elburg 777567c7a5 added dialog box, bugfixes to veejay-ng and veejay-ui
git-svn-id: svn://code.dyne.org/veejay/trunk@623 eb8d1916-c9e9-0310-b8de-cf0c9472ead5
2006-10-08 19:23:53 +00:00

1111 lines
27 KiB
C

/* veejay - Linux VeeJay
* (C) 2002-2004 Niels Elburg <nelburg@looze.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <config.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <glib.h>
#include <glade/glade.h>
#include <libvevo/libvevo.h>
#include <ui/builder.h>
#include <ui/director.h>
#include <lo/lo.h>
#ifdef STRICT_CHECKING
#include <assert.h>
#endif
typedef struct
{
lo_address addr;
char *addr_str;
char *port_str;
} oscclient_t;
typedef struct
{
lo_server st;
void *tree;
void *sender;
int softlock;
void *template;
} osc_recv_t;
void *ui_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 = lo_address_get_hostname( osc->addr );
osc->port_str = 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;
}
void *ui_new_osc_sender( const char *addr, const char *port )
{
oscclient_t *osc = (oscclient_t*) malloc(sizeof(oscclient_t));
osc->addr = lo_address_new( addr, port );
osc->addr_str = strdup( addr );
osc->port_str = port ? strdup( port ) : NULL;
return (void*) osc;
}
void ui_free_osc_sender( void *dosc )
{
oscclient_t *osc = (oscclient_t*) dosc;
lo_address_free( osc->addr );
if( osc->port_str )
free( osc->port_str);
free(osc->addr_str);
free(osc);
osc = NULL;
}
static void veejay_add_arguments_ ( lo_message lmsg, const char *format, va_list ap )
{
//http://liblo.sourceforge.net/docs/group__liblolowlevel.html#g31ac1e4c0ec6c61f665ce3f9bbdc53c3
while( *format != 'x' && *format != '\0' )
{
switch(*format)
{
case 'i':
{ int32_t val = (int32_t) va_arg( ap, int32_t);
lo_message_add_int32( lmsg,val);
}
break;
case 'h':
lo_message_add_int64( lmsg, (int64_t) va_arg( ap, int64_t));
break;
case 's':
lo_message_add_string( lmsg, (char*) va_arg( ap, char*) );
break;
case 'd':
lo_message_add_double( lmsg, (double) va_arg(ap, double));
break;
default:
break;
}
*format ++;
}
}
int ui_send_osc( void *info ,const char *msg, const char *format, ... )
{
osc_recv_t *d = (osc_recv_t*) info;
oscclient_t *c = d->sender;
if(!c->addr)
{
veejay_msg(0,"OSC sender not ready\n");
#ifdef STRICT_CHECKING
assert(0);
#endif
return 0;
}
lo_message lmsg = lo_message_new();
if( format )
{
va_list ap;
va_start( ap, format );
veejay_add_arguments_( lmsg, format, ap );
va_end(ap);
}
int result = lo_send_message( c->addr, msg, lmsg );
lo_message_free( lmsg );
return result;
}
int ui_send_osc_( void *info ,const char *msg, const char *format, ... )
{
oscclient_t *c = (oscclient_t*) info;
if(!c->addr)
{
veejay_msg(0,"OSC sender not ready\n");
return 0;
}
lo_message lmsg = lo_message_new();
if( format )
{
va_list ap;
va_start( ap, format );
veejay_add_arguments_( lmsg, format, ap );
va_end(ap);
}
int result = lo_send_message( c->addr, msg, lmsg );
lo_message_free( lmsg );
return result;
}
int send_once(const char *addr,
const char *port )
{
void *sender = ui_new_osc_sender( addr,port );
if(!sender)
return 0;
if(ui_send_osc_( sender, "/veejay/ui", NULL ) <= 0 )
veejay_msg(0, "Error sending /veejay/ui to %s %s", addr,port );
ui_free_osc_sender(sender);
return 1;
}
int request_window(const char *addr,
const char *port, int sample, int entry )
{
void *sender = ui_new_osc_sender( addr,port );
if(!sender)
return 0;
if(ui_send_osc_( sender, "/veejay/request", "ii",sample, entry ) <= 0 )
veejay_msg(0, "Error sending /veejay/ui to %s %s", addr,port );
ui_free_osc_sender(sender);
return 1;
}
void error_handler( int num, const char *msg, const char *path )
{
veejay_msg(0,"Liblo server error %d in path %s: %s\n",num,path,msg );
}
void osc_new_veejay_sender(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
void *stats = NULL;
osc_recv_t *info = (osc_recv_t*) ptr;
lo_address a = lo_message_get_source(data);
char *uri = lo_address_get_url(a);
if(info->sender)
ui_free_osc_sender( info->sender );
info->sender = ui_new_osc_sender_uri( uri );
free(uri);
}
void osc_new_window(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
char *window_name = (char*) &argv[0]->s;
char *window_label = (char*) &argv[1]->s;
//@ check if window doesnt already exist
void *wt = NULL;
if( vevo_property_get( info->tree, window_name,0,&wt ) == VEVO_NO_ERROR )
{
veejay_msg(0,"A window with the name '%s' already exists\n", window_name);
void *exwin = director_window_is_realized( window_name );
#ifdef STRICT_CHECKING
assert( exwin != NULL );
#endif
if(exwin)
{
GtkWidget *gexwin = (GtkWidget*)exwin;
gtk_window_present( GTK_WINDOW(gexwin) );
}
return;
}
void *stats = builder_init();
vevo_property_set( info->tree, window_name, VEVO_ATOM_TYPE_VOIDPTR,1,&stats);
void *window = builder_new_window( stats, window_label );
void *box = builder_new_box( stats, window, VBOX );
char box_name[128];
sprintf(box_name,"%s_box", window_name );
builder_register_widget(
stats, window_name, window );
builder_register_widget(
stats, box_name, box );
}
void osc_cleanup_window( void *ptr, const char *window_name, void *window, void *stats )
{
osc_recv_t *info = (osc_recv_t*) ptr;
// builder_destroy_rootnode( stats,window );
// builder_free(stats);
// stats = NULL;
// vevo_property_set( info->tree, window_name, VEVO_ATOM_TYPE_VOIDPTR, 0, NULL );
}
void osc_delete_window( void *ptr, const char *name )
{
osc_recv_t *info = (osc_recv_t*) ptr;
vevo_property_set( info->tree, name,
VEVO_ATOM_TYPE_VOIDPTR,0,NULL);
if( info->template )
{
void *custom_widget = NULL;
int error = vevo_property_get( info->template,
"widget",0,&custom_widget );
if(custom_widget && error == VEVO_NO_ERROR)
channelbank_free( custom_widget );
vevo_port_free( info->template );
info->template = NULL;
}
}
void osc_destroy_window(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
char *window_name = &argv[0]->s;
void *stats = NULL;
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *window = builder_from_register( stats, window_name );
if(!window)
{
veejay_msg(0,"Window '%s' does not exist\n", window_name);
return;
}
GladeXML *xml = builder_glade_from_register( stats, window_name );
char *id = builder_get_identifier( stats, window );
GtkWidget *w = glade_xml_get_widget( xml, id );
if(w)
{
gtk_widget_destroy( w );
// builder_destroy_rootnode(stats,window);
// builder_free( stats );
//@ free stats
vevo_property_set( info->tree, window_name,
VEVO_ATOM_TYPE_VOIDPTR,0,NULL);
}
free(id);
}
else
veejay_msg(0,"Cannot find window '%s'\n",window_name);
}
void osc_new_widget_template(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
char *window_name = (char*) &argv[0]->s;
char *osc_path = (char*) &argv[1]->s;
int n = argv[2]->i; // number of names
//@ check if window doesnt already exist
void *wt = NULL;
if( vevo_property_get( info->tree, window_name,0,&wt ) == VEVO_NO_ERROR )
{
if(info->template == NULL )
info->template = vpn(VEVO_ANONYMOUS_PORT);
int i;
char **strs = (char**) malloc(sizeof(char*) * (n+1));
memset(strs,0,sizeof(char*) * (n+1));
for( i = 0; i < n; i ++ )
{
strs[i] = strdup( (char*) &argv[i+3]->s );
}
int error = vevo_property_set( info->template, "string_list",VEVO_ATOM_TYPE_STRING, n, strs );
#ifdef STRICT_CHECKING
assert( error == VEVO_NO_ERROR );
#endif
error = vevo_property_set( info->template, "osc_path", VEVO_ATOM_TYPE_STRING, 1, &osc_path );
#ifdef STRICT_CHECKING
assert( error == VEVO_NO_ERROR );
#endif
for ( i = 0; i < n ; i ++ )
free(strs[i]);
free(strs);
}
}
void osc_realize_window(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
char *window_name = &argv[0]->s;
void *stats = NULL;
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *window = builder_from_register( stats, window_name );
if(!window)
{
veejay_msg(0,"Window '%s' does not exist\n", window_name);
return;
}
void *exwin = director_window_is_realized( window_name );
if(exwin)
{
GtkWidget *gexwin = (GtkWidget*)exwin;
gtk_window_present( GTK_WINDOW(gexwin) );
return;
}
int size = 0;
char *data = builder_formalize( stats,window, &size );
if(!data || size <= 0 )
{
veejay_msg(0,"Nothing to formalize\n");
}
// builder_writefile( stats, "glade-dump-window.xml" );
//@ wipe xml
GladeXML *gxml = glade_xml_new_from_memory( data, size, NULL,NULL );
void *mainw = NULL;
if(gxml)
{
mainw = director_connect_full( gxml, stats,info );
builder_register_glade( stats, window_name, gxml );
director_finish( gxml,mainw,stats,info,window_name );
if(info->template)
director_instantiate_template( gxml, mainw,stats, info->template );
}
if(!exwin && mainw)
director_realize_window( window_name, mainw );
}
}
void osc_new_box(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
char *window_name = (char*) &argv[0]->s;
char *container_name = (char*) &argv[1]->s;
char *my_name = (char*) &argv[2]->s;
int type = argv[3]->i;
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *container = builder_from_register( stats, container_name );
if(!container)
{
veejay_msg(0,"%s Container '%s' not in register of Window %s\n", __FUNCTION__ , container_name, window_name);
return;
}
void *box = builder_new_box( stats, container,
( type == 0 ? HBOX : VBOX ) );
builder_register_widget( stats, my_name, box );
}
else
{
veejay_msg(0,"%s: cannot get '%s\n", __FUNCTION__, window_name );
}
}
void osc_new_vframe(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
char *window_name = (char*) &argv[0]->s;
char *container_name = (char*) &argv[1]->s;
char *my_name = (char*) &argv[2]->s;
char *label = (char*) &argv[3]->s;
char frame_name[128];
sprintf(frame_name, "%s_frame", my_name );
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *container = builder_from_register( stats, container_name );
if(!container)
{
veejay_msg(0,"%s Container '%s' not in register of Window %s\n", __FUNCTION__ , container_name, window_name);
return;
}
void *panel = builder_new_frame( stats, container, label, HBOX, frame_name,1 );
builder_register_widget( stats, my_name, panel );
}
else
{
veejay_msg(0,"%s: cannot get '%s\n", __FUNCTION__, window_name );
}
}
void osc_new_frame(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
char *window_name = (char*) &argv[0]->s;
char *my_name = (char*) &argv[1]->s;
char *label = (char*) &argv[2]->s;
char container_name[128];
sprintf(container_name, "%s_box", window_name );
char frame_name[128];
sprintf(frame_name, "%s_frame", my_name );
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *container = builder_from_register( stats, container_name );
if(!container)
{
veejay_msg(0,"%s Container '%s' not in register of Window %s\n", __FUNCTION__ , container_name, window_name);
return;
}
void *panel = builder_new_frame( stats, container, label, HBOX, frame_name,0 );
builder_register_widget( stats, my_name, panel );
}
else
{
veejay_msg(0,"%s: cannot get '%s\n", __FUNCTION__, window_name );
}
}
void osc_new_switch(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
char *window_name = &argv[0]->s;
char *panel_name = &argv[1]->s;
char *widget_name = &argv[2]->s;
char *label = &argv[3]->s;
int active = argv[4]->i;
char *osc_path = &argv[5]->s;
char *tooltip = &argv[6]->s;
int widget_type = builder_get_widget_type( widget_name );
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *container = builder_from_register( stats, panel_name );
if(!container)
{
veejay_msg(0,"Widget '%s' is not in register!\n", panel_name);
return;
}
veejay_msg(0,"WIDGET %s is %d\n", label, active );
builder_new_boolean_object( stats, container, label, active, widget_type, osc_path ,tooltip);
}
else
{
veejay_msg(0,"%s: cannot get '%s\n", __FUNCTION__, window_name );
}
}
void osc_new_label(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
char *window_name = &argv[0]->s;
char *panel_name = &argv[1]->s;
char *label_name = &argv[2]->s;
char *label = &argv[3]->s;
int widget_type = LABEL;
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *container = builder_from_register( stats, panel_name );
if(!container)
{
veejay_msg(0,"Widget '%s' is not in register!\n", panel_name);
return;
}
builder_new_label_object( stats, container, label, label_name );
// builder_register_widget(
// stats, window_name, window );
}
else
{
veejay_msg(0,"%s: cannot get '%s\n", __FUNCTION__, window_name );
}
}
void osc_new_button(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
char *window_name = &argv[0]->s;
char *panel_name = &argv[1]->s;
char *label = &argv[2]->s;
char *osc_path = &argv[3]->s;
char *tooltip = &argv[4]->s;
int widget_type = BUTTON;
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *container = builder_from_register( stats, panel_name );
if(!container)
{
veejay_msg(0,"Widget '%s' is not in register!\n", panel_name);
return;
}
builder_new_button_object( stats, container, label, widget_type, osc_path,tooltip );
}
else
{
veejay_msg(0,"%s: cannot get '%s\n", __FUNCTION__, window_name );
}
}
void osc_new_radio_group( const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
int i;
char *window_name = &argv[0]->s; // window
char *panel_name = &argv[1]->s; // which frame
char *prefix = &argv[2]->s; // identifier prefix
char *label_prefix = &argv[3]->s; // label prefix
int n_buttons = argv[4]->i; // number of buttons in group
int active_button = argv[5]->i; // active button
if(n_buttons <= 0 )
{
veejay_msg(0,"Empty radio group!\n");
return;
}
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *container = builder_from_register( stats, panel_name );
if(!container)
{
veejay_msg(0,"No such panel: %s\n",panel_name);
return;
}
builder_new_boolean_group_object(
stats,
container,
prefix,
label_prefix,
active_button,
n_buttons );
}
}
void osc_new_fxpulldown(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
if( argc <= 5 )
{
veejay_msg(0,"Insufficient arguments\n");
return;
}
if (strncmp( types, "ssssss", 6 ) != 0 )
{
veejay_msg(0,"%s Invalid format: '%s' \n",__FUNCTION__, types );
return;
}
char *window_name = &argv[0]->s;
char *panel_name = &argv[1]->s;
char *label = &argv[2]->s;
char *osc_path = &argv[3]->s;
char *format = &argv[4]->s;
char *tooltip = &argv[5]->s;
double dv = 0.0;
int n_items = argc - 6;
char **items = NULL;
if(n_items <= 0 )
{
veejay_msg(0,"Empty pulldown!\n");
return;
}
items = (char**)malloc(sizeof(char*) * n_items );
int i;
for(i = 0; i < n_items; i ++ )
items[i] = strdup( (char*) &argv[(i+6)]->s );
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
int widget_type = COMBOBOX;
void *container = builder_from_register( stats, panel_name );
if(!container)
{
veejay_msg(0,"Widget '%s' is not in register!\n", panel_name);
return;
}
builder_new_pulldown_object( stats, container, label,NULL, COMBOBOX, n_items, items, osc_path,format,dv,tooltip );
}
else
{
veejay_msg(0,"%s: cannot get '%s\n", __FUNCTION__, window_name );
}
for(i = 0; i < n_items; i ++ )
free(items[i]);
free(items);
}
void osc_new_pulldown(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
if( argc <= 6 )
{
veejay_msg(0,"Insufficient arguments\n");
return;
}
if (strncmp( types, "sssssds", 7 ) != 0 )
{
veejay_msg(0,"%s Invalid format: '%s' \n",__FUNCTION__, types );
return;
}
char *window_name = &argv[0]->s;
char *panel_name = &argv[1]->s;
char *identifier = &argv[2]->s;
char *label = &argv[3]->s;
char *osc_path = &argv[4]->s;
double row = argv[5]->d;
char *tooltip = &argv[6]->s;
#ifdef STRICT_CHECKING
assert( window_name != NULL );
assert( panel_name != NULL );
assert( label != NULL );
assert( osc_path != NULL );
assert( tooltip != NULL );
#endif
int n_items = argc - 7;
char **items = NULL;
if(n_items <= 0 )
{
veejay_msg(0,"Empty pulldown!\n");
return;
}
items = (char**)malloc(sizeof(char*) * n_items );
int i;
for(i = 0; i < n_items; i ++ )
items[i] = strdup( (char*) &argv[(i+7)]->s );
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
int widget_type = COMBOBOX;
void *container = builder_from_register( stats, panel_name );
if(!container)
{
veejay_msg(0,"Widget '%s' is not in register!\n", panel_name);
return;
}
builder_new_pulldown_object( stats, container, label,identifier,COMBOBOX, n_items, items, osc_path,window_name, row,tooltip );
}
else
{
veejay_msg(0,"%s: cannot get '%s\n", __FUNCTION__, window_name );
}
for(i = 0; i < n_items; i ++ )
free(items[i]);
free(items);
}
void osc_update_pulldown(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
if( argc <= 5 )
{
veejay_msg(0,"Insufficient arguments\n");
return;
}
if (strncmp( types, "sssssds", 7 ) != 0 )
{
veejay_msg(0,"%s Invalid format: '%s' \n",__FUNCTION__, types );
return;
}
char *window_name = &argv[0]->s;
char *panel_name = &argv[1]->s;
char *widget_id = &argv[2]->s;
char *new_label = &argv[3]->s;
double selected_fx_id = argv[4]->d;
char *tooltip = &argv[5]->s;
#ifdef STRICT_CHECKING
assert( window_name != NULL );
assert( panel_name != NULL );
assert( new_label != NULL );
#endif
int n_items = argc - 6;
char **items = NULL;
if(n_items <= 0 )
{
veejay_msg(0,"Empty pulldown!\n");
return;
}
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
GladeXML *xml = builder_glade_from_register( stats, window_name );
//char *id = builder_get_identifier( stats, wid );
director_update_combobox( xml, stats, info,widget_id, argc, argv, 6 );
}
}
void osc_new_numeric(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
void *stats = NULL;
char *window_name = &argv[0]->s;
char *panel_name = &argv[1]->s;
char *label = &argv[2]->s;
double min = argv[3]->d;
double max = argv[4]->d;
double value = argv[5]->d;
int digits = argv[6]->i;
int extra = argv[7]->i;
char *widgetname = &argv[8]->s;
char *osc_path = &argv[9]->s;
char *format = &argv[10]->s;
char *tooltip = &argv[11]->s;
int widget_type = builder_get_widget_type( widgetname );
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *panel = builder_from_register( stats, panel_name );
if(!panel)
{
veejay_msg(0,"Widget '%s' is not in register!\n", panel_name);
return;
}
builder_new_numeric_object(
stats,
panel,
label,
min,
max,
value,
digits,
extra,
widget_type,
osc_path,
format,
tooltip
);
}
else
{
veejay_msg(0,"%s: cannot get '%s\n", __FUNCTION__, window_name );
}
}
void osc_load_sample(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
const int sample_id = argv[0]->i;
const char *title = &argv[1]->s;
#ifdef STRICT_CHECKING
assert( sample_id >= 0 );
assert( title != NULL );
#endif
samplebank_store_sample( director_get_sample_pad(), sample_id, title );
director_lock();
director_reload_lists();
director_unlock();
}
void osc_update_preview(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
}
void osc_destroy_sample(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
const int sample_id = argv[0]->i;
// samplebank_destroy_sample( sample_id );
// director_reload_lists()
}
void osc_set_widget(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
char *window_name = &argv[0]->s;
char *widget_name = &argv[1]->s;
void *stats = NULL;
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
void *wid = builder_from_register( stats, widget_name );
if(!wid)
{
veejay_msg(0,"Widget '%s' does not exist in window %s\n", widget_name, window_name);
return;
}
GladeXML *xml = builder_glade_from_register( stats, window_name );
char *id = builder_get_identifier( stats, wid );
director_set_widget( xml, id,argc,argv );
}
else
{
veejay_msg(0,"Cannot find Window '%s'\n", window_name );
}
}
void osc_update_widget(const char *path, const char *types,
lo_arg **argv, int argc, void *data, void *ptr )
{
osc_recv_t *info = (osc_recv_t*) ptr;
char *window_name = &argv[0]->s;
void *stats = NULL;
if( vevo_property_get(info->tree, window_name,0,&stats ) == VEVO_NO_ERROR )
{
director_update_widget( stats, (const char*) &argv[1]->s, types, argc,2, argv );
}
}
gboolean osc_message_handler( GIOChannel *ch, GIOCondition condition, gpointer data )
{
osc_recv_t *info = (osc_recv_t*) data;
if( condition & G_IO_IN )
lo_server_recv_noblock( info->st, 0 );
if( condition & G_IO_NVAL )
return FALSE;
if( condition & G_IO_HUP )
{
g_io_channel_close( ch );
return FALSE;
}
return TRUE;
}
int ui_osc_new_listener(void *data, int fd)
{
GIOChannel *ch = g_io_channel_unix_new( fd );
int watch = -1;
watch = g_io_add_watch_full(
ch,
G_PRIORITY_HIGH,
G_IO_IN | G_IO_NVAL | G_IO_HUP,
osc_message_handler,
data,
NULL );
return watch;
}
void *ui_new_osc_server(void *data , const char *port)
{
osc_recv_t *s = (osc_recv_t*) malloc(sizeof( osc_recv_t));
memset(s,0,sizeof(osc_recv_t));
s->st = lo_server_new( port, error_handler );
s->tree = vpn(VEVO_ANONYMOUS_PORT );
s->sender = NULL;
lo_server_add_method( s->st,
"/veejay",
"s",
osc_new_veejay_sender,
(void*) s );
lo_server_add_method( s->st,
"/create/window",
"ss",
osc_new_window,
(void*)s );
lo_server_add_method( s->st,
"/create/frame",
"sss",
osc_new_frame,
(void*) s );
lo_server_add_method( s->st,
"/create/box",
"sssi",
osc_new_box,
(void*) s );
lo_server_add_method( s->st,
"/create/vframe",
"ssss",
osc_new_vframe,
(void*) s );
lo_server_add_method( s->st,
"/create/switch",
"ssssiss",
osc_new_switch,
(void*) s );
lo_server_add_method( s->st,
"/create/button",
"sssss",
osc_new_button,
(void*) s );
lo_server_add_method( s->st,
"/create/label",
"ssss",
osc_new_label,
(void*) s );
lo_server_add_method( s->st,
"/update/widget",
NULL,
osc_update_widget,
(void*) s );
lo_server_add_method( s->st,
"/update/tegdiw",
NULL,
osc_set_widget,
(void*) s );
lo_server_add_method( s->st,
"/update/sample",
"is",
osc_load_sample,
(void*) s);
lo_server_add_method( s->st,
"/create/pulldown",
NULL,
osc_new_pulldown,
(void*) s );
lo_server_add_method( s->st,
"/update/pulldown",
NULL,
osc_update_pulldown,
(void*) s );
lo_server_add_method( s->st,
"/create/fxpulldown",
NULL,
osc_new_fxpulldown,
(void*) s );
lo_server_add_method( s->st,
"/create/radiogroup",
"ssssii",
osc_new_radio_group,
(void*) s);
lo_server_add_method( s->st,
"/create/numeric",
"sssdddiissss",
osc_new_numeric,
(void*)s );
lo_server_add_method( s->st,
"/create/channels",
NULL,
osc_new_widget_template,
(void*) s );
lo_server_add_method( s->st,
"/show/window",
"s",
osc_realize_window,
(void*) s );
lo_server_add_method( s->st,
"/destroy/sample",
"s",
osc_destroy_sample,
(void*) s );
lo_server_add_method( s->st,
"/destroy/window",
"s",
osc_destroy_window,
(void*) s );
lo_server_add_method( s->st,
"/update/preview",
NULL,
osc_update_preview,
(void*) s );
int w = ui_osc_new_listener( (void*) s, lo_server_get_socket_fd( s->st ) );
veejay_msg(0,"liblo OSC server ready at port %s", port );
return (void*) s;
}
void ui_free_osc_server( void *dosc)
{
osc_recv_t *s = (osc_recv_t*) dosc;
vevo_port_free(s->tree);
lo_server_free( s->st );
free(s);
s = NULL;
}
void ui_print_help(void)
{
}