|
|
@@ -42,14 +42,12 @@ |
|
|
|
|
|
|
|
#include <lo/lo.h> |
|
|
|
|
|
|
|
#include <pthread.h> |
|
|
|
#include <jack/ringbuffer.h> |
|
|
|
|
|
|
|
int client_active = 0; |
|
|
|
|
|
|
|
jack_client_t *client; |
|
|
|
|
|
|
|
pthread_mutex_t port_lock; |
|
|
|
|
|
|
|
lo_server losrv; |
|
|
|
lo_address nsm_addr; |
|
|
|
int nsm_is_active; |
|
|
@@ -72,15 +70,21 @@ struct patch_record { |
|
|
|
|
|
|
|
struct port_record { |
|
|
|
char *port; |
|
|
|
int reg; /* true if registered, false if unregistered */ |
|
|
|
struct port_record *next; |
|
|
|
}; |
|
|
|
|
|
|
|
static struct port_record *new_ports = NULL; |
|
|
|
struct port_notification_record { |
|
|
|
int len; |
|
|
|
int reg; /* true if registered, false if unregistered */ |
|
|
|
char port[]; |
|
|
|
}; |
|
|
|
|
|
|
|
static struct port_record *known_ports = NULL; |
|
|
|
|
|
|
|
static struct patch_record *patch_list = NULL; |
|
|
|
|
|
|
|
static jack_ringbuffer_t *port_ringbuffer = NULL; |
|
|
|
|
|
|
|
/** |
|
|
|
* Pretty-print patch relationship of /pr/ |
|
|
|
*/ |
|
|
@@ -114,34 +118,18 @@ dequeue ( struct patch_record *pr ) |
|
|
|
} |
|
|
|
|
|
|
|
void |
|
|
|
enqueue_port ( struct port_record **q, const char *port, int reg ) |
|
|
|
enqueue_port ( struct port_record **q, const char *port ) |
|
|
|
{ |
|
|
|
struct port_record *p = malloc( sizeof( struct port_record )); |
|
|
|
|
|
|
|
p->port = strdup( port ); |
|
|
|
p->reg = reg; |
|
|
|
p->next = *q; |
|
|
|
*q = p; |
|
|
|
} |
|
|
|
|
|
|
|
struct port_record * |
|
|
|
dequeue_port ( struct port_record **q ) |
|
|
|
{ |
|
|
|
if ( *q ) |
|
|
|
{ |
|
|
|
struct port_record *p = *q; |
|
|
|
|
|
|
|
*q = p->next; |
|
|
|
|
|
|
|
return p; |
|
|
|
} |
|
|
|
|
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
void enqueue_known_port ( const char *port ) |
|
|
|
{ |
|
|
|
enqueue_port( &known_ports, port, 1 ); |
|
|
|
enqueue_port( &known_ports, port ); |
|
|
|
} |
|
|
|
|
|
|
|
const char * find_known_port ( const char *port ) |
|
|
@@ -155,29 +143,6 @@ const char * find_known_port ( const char *port ) |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
enqueue_new_port ( const char *port, int reg ) |
|
|
|
{ |
|
|
|
pthread_mutex_lock( &port_lock ); |
|
|
|
|
|
|
|
enqueue_port( &new_ports, port, reg ); |
|
|
|
|
|
|
|
pthread_mutex_unlock( &port_lock ); |
|
|
|
} |
|
|
|
|
|
|
|
struct port_record * |
|
|
|
dequeue_new_port ( void ) |
|
|
|
{ |
|
|
|
pthread_mutex_lock( &port_lock ); |
|
|
|
|
|
|
|
struct port_record *p = dequeue_port( &new_ports ); |
|
|
|
|
|
|
|
pthread_mutex_unlock( &port_lock ); |
|
|
|
return p; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
process_patch ( const char *patch ) |
|
|
|
{ |
|
|
@@ -565,6 +530,8 @@ die ( void ) |
|
|
|
if ( client_active ) |
|
|
|
jack_deactivate( client ); |
|
|
|
|
|
|
|
printf( "JACKPATCH: Closing jack client\n" ); |
|
|
|
|
|
|
|
jack_client_close( client ); |
|
|
|
client = NULL; |
|
|
|
exit( 0 ); |
|
|
@@ -719,11 +686,31 @@ init_osc ( const char *osc_port ) |
|
|
|
lo_server_add_method( losrv, "/reply", "ssss", osc_announce_reply, NULL ); |
|
|
|
} |
|
|
|
|
|
|
|
struct port_notification_record * |
|
|
|
dequeue_new_port ( void ) |
|
|
|
{ |
|
|
|
int size = 0; |
|
|
|
|
|
|
|
if ( sizeof( int ) == jack_ringbuffer_peek( port_ringbuffer, (char*)&size, sizeof( int ) ) ) |
|
|
|
{ |
|
|
|
if ( jack_ringbuffer_read_space( port_ringbuffer ) >= size ); |
|
|
|
{ |
|
|
|
struct port_notification_record *pr = malloc( size ); |
|
|
|
|
|
|
|
jack_ringbuffer_read( port_ringbuffer, (char*)pr, size ); |
|
|
|
|
|
|
|
return pr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
check_for_new_ports ( void ) |
|
|
|
{ |
|
|
|
struct port_record *p = NULL; |
|
|
|
struct port_notification_record *p = NULL; |
|
|
|
|
|
|
|
while ( ( p = dequeue_new_port() ) ) |
|
|
|
{ |
|
|
@@ -732,7 +719,6 @@ check_for_new_ports ( void ) |
|
|
|
else |
|
|
|
remove_known_port( p->port ); |
|
|
|
|
|
|
|
free( p->port ); |
|
|
|
free( p ); |
|
|
|
} |
|
|
|
} |
|
|
@@ -741,10 +727,22 @@ void |
|
|
|
port_registration_callback( jack_port_id_t id, int reg, void *arg ) |
|
|
|
{ |
|
|
|
jack_port_t *p = jack_port_by_id( client, id ); |
|
|
|
|
|
|
|
const char *port = jack_port_name( p ); |
|
|
|
|
|
|
|
enqueue_new_port( port, reg ); |
|
|
|
int size = strlen(port) + 1 + sizeof( struct port_notification_record ); |
|
|
|
|
|
|
|
struct port_notification_record *pr = malloc( size ); |
|
|
|
|
|
|
|
pr->len = size; |
|
|
|
pr->reg = reg; |
|
|
|
strcpy( pr->port, port ); |
|
|
|
|
|
|
|
if ( size != jack_ringbuffer_write( port_ringbuffer, (const char *)pr, size ) ) |
|
|
|
{ |
|
|
|
fprintf( stderr, "ERROR: port notification buffer overrun" ); |
|
|
|
} |
|
|
|
|
|
|
|
// enqueue_new_port( port, reg ); |
|
|
|
} |
|
|
|
|
|
|
|
/* */ |
|
|
@@ -767,8 +765,7 @@ main ( int argc, char **argv ) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
pthread_mutex_init( &port_lock, NULL ); |
|
|
|
|
|
|
|
port_ringbuffer = jack_ringbuffer_create( 1024 * 8 ); |
|
|
|
|
|
|
|
set_traps(); |
|
|
|
|
|
|
@@ -812,7 +809,7 @@ main ( int argc, char **argv ) |
|
|
|
|
|
|
|
for ( ;; ) |
|
|
|
{ |
|
|
|
lo_server_recv_noblock( losrv, 500 ); |
|
|
|
lo_server_recv_noblock( losrv, 200 ); |
|
|
|
|
|
|
|
if ( client_active ) |
|
|
|
check_for_new_ports(); |
|
|
|