Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15144
Modified Files: Tag: devel_0_38 s_audio_jack.c Log Message: restore connection state if jack kicks us out
Index: s_audio_jack.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/s_audio_jack.c,v retrieving revision 1.5.4.8 retrieving revision 1.5.4.9 diff -C2 -d -r1.5.4.8 -r1.5.4.9 *** s_audio_jack.c 13 May 2005 17:01:48 -0000 1.5.4.8 --- s_audio_jack.c 16 Jun 2005 12:44:55 -0000 1.5.4.9 *************** *** 1,5 ****
! /* ----------------------- Experimental routines for jack -------------- */ #ifdef USEAPI_JACK
--- 1,5 ----
! /* ----------------------- Routines for jack ---------------------------- */ #ifdef USEAPI_JACK
*************** *** 35,40 **** pthread_cond_t jack_sem;
! extern int sys_keepsched; ! extern int sys_callbackscheduler;
static int --- 35,40 ---- pthread_cond_t jack_sem;
! t_int jack_save_connection_state(t_int* dummy); ! static void jack_restore_connection_state(void);
static int *************** *** 146,157 **** static t_int jack_shutdown_handler(t_int* none) { jack_close_audio(); ! post("jack most likely kicked us out ... trying to reconnect"); /* try to reconnect to jack server */ jack_open_audio(sys_inchannels, sys_outchannels,\ ! sys_dacsr, sys_callbackscheduler); return 0; }
static void jack_shutdown (void *arg) --- 146,166 ---- static t_int jack_shutdown_handler(t_int* none) { + int i; + post("jack kicked us out ... trying to reconnect"); + /* clean up */ jack_close_audio(); ! /* try to reconnect to jack server */ jack_open_audio(sys_inchannels, sys_outchannels,\ ! sys_dacsr, sys_callbackscheduler); ! ! /* restore last connection state */ ! jack_restore_connection_state(); ! return 0; }
+ + static void jack_shutdown (void *arg) *************** *** 167,170 **** --- 176,186 ---- }
+ static int jack_graph_order_callback(void* arg) + { + post("graph order"); + sys_callback(jack_save_connection_state, NULL, 0); + return 0; + } +
static char** jack_get_clients(void) *************** *** 174,177 **** --- 190,194 ---- int num_clients = 0; regex_t port_regex; + jack_ports = jack_get_ports( jack_client, "", "", 0 ); regcomp( &port_regex, "^[^:]*", REG_EXTENDED ); *************** *** 228,232 **** }
! /* for (i=0;i<num_clients;i++) post("client: %s",jack_client_names[i]); */
free( jack_ports ); --- 245,249 ---- }
! /* for (i=0;i<num_clients;i++) post("client: %s",jack_client_names[i]); */
free( jack_ports ); *************** *** 251,254 **** --- 268,273 ---- jack_ports = jack_get_ports( jack_client, regex_pattern, NULL, JackPortIsOutput); + + if (jack_ports) for (i=0;jack_ports[i] != NULL && i < sys_inchannels;i++) *************** *** 264,270 **** if (jack_connect (jack_client, jack_port_name (output_port[i]), jack_ports[i])) fprintf (stderr, "cannot connect output ports %s -> %s\n", jack_port_name (output_port[i]),jack_ports[i]); ! ! ! free(jack_ports); return 0; --- 283,289 ---- if (jack_connect (jack_client, jack_port_name (output_port[i]), jack_ports[i])) fprintf (stderr, "cannot connect output ports %s -> %s\n", jack_port_name (output_port[i]),jack_ports[i]); ! ! ! free(jack_ports); return 0; *************** *** 272,276 ****
! void jack_error(const char *desc) { return; } --- 291,296 ----
! static void jack_error(const char *desc) ! { return; } *************** *** 285,292 **** int new_jack = 0; int srate; ! jack_dio_error = 0;
! if ((inchans == 0) && (outchans == 0)) return 0;
if (outchans > NUM_JACK_PORTS) { --- 305,317 ---- int new_jack = 0; int srate; ! int ret; ! jack_dio_error = 0;
! if ((inchans == 0) && (outchans == 0)) ! { ! ret = 0; ! goto bailout; ! }
if (outchans > NUM_JACK_PORTS) { *************** *** 300,304 **** }
! if (jack_client && sys_callbackscheduler != scheduler) { jack_client_close(jack_client); --- 325,329 ---- }
! if (jack_client && scheduler != sys_getscheduler()) { jack_client_close(jack_client); *************** *** 306,311 **** } ! sys_keepsched = 0; ! sys_callbackscheduler = scheduler;
/* try to become a client of the JACK server (we allow two pd's)*/ --- 331,335 ---- } ! sys_setscheduler(scheduler);
/* try to become a client of the JACK server (we allow two pd's)*/ *************** *** 319,323 **** if (!jack_client) { // jack spits out enough messages already, do not warn sys_inchannels = sys_outchannels = 0; ! return 1; }
--- 343,348 ---- if (!jack_client) { // jack spits out enough messages already, do not warn sys_inchannels = sys_outchannels = 0; ! ret = 1; ! goto bailout; }
*************** *** 339,342 **** --- 364,371 ---- jack_set_xrun_callback (jack_client, jack_xrun, NULL); #endif + + jack_set_graph_order_callback(jack_client, + jack_graph_order_callback, NULL); +
/* tell the JACK server to call `srate()' whenever *************** *** 358,362 **** output_port[j] = NULL; } - new_jack = 1; } --- 387,390 ---- *************** *** 371,375 ****
/* create the ports */ ! for (j = 0; j < inchans; j++) { sprintf(port_name, "input%d", j); --- 399,403 ----
/* create the ports */ ! for (j = 0; j < inchans; j++) { sprintf(port_name, "input%d", j); *************** *** 385,397 **** /* tell the JACK server that we are ready to roll */
! if (new_jack) { ! if (jack_activate (jack_client)) { fprintf (stderr, "cannot activate client\n"); sys_inchannels = sys_outchannels = 0; ! return 1; } ! memset(jack_outbuf,0,sizeof(jack_outbuf)); ! if (jack_client_names[0]) jack_connect_ports(jack_client_names[0]); --- 413,428 ---- /* tell the JACK server that we are ready to roll */
! if (new_jack) ! { ! if (jack_activate (jack_client)) ! { fprintf (stderr, "cannot activate client\n"); sys_inchannels = sys_outchannels = 0; ! ret = 1; ! goto bailout; } ! memset(jack_outbuf,0,sizeof(jack_outbuf)); ! if (jack_client_names[0]) jack_connect_ports(jack_client_names[0]); *************** *** 422,425 **** --- 453,461 ----
return 0; + + bailout: + /* tb: if we can't start jack, go to traditional scheduler */ + sys_setscheduler(0); + return ret; }
*************** *** 429,436 **** --- 465,480 ---- if (jack_client) { + int i; + sys_setscheduler(0); jack_deactivate(jack_client); jack_started = 0; jack_client_close(jack_client); jack_client = NULL; + + for (i = 0; i <NUM_JACK_PORTS; i++) + { + input_port[i] = NULL; + output_port[i] = NULL; + } } } *************** *** 501,503 **** --- 545,635 ---- }
+ + /* ports connected to the inputs */ + static const char ** jack_in_connections[NUM_JACK_PORTS]; + /* ports connected to the outputs */ + static const char ** jack_out_connections[NUM_JACK_PORTS]; + + /* tb: save the current state of pd's jack connections */ + /* static t_int jack_shutdown_handler(t_int* none) */ + t_int jack_save_connection_state(t_int* dummy) + { + int i; + return 0; + for (i = 0; i != NUM_JACK_PORTS; ++i) + { + post("%d", i); + /* saving the inputs connections */ + if (jack_in_connections[i]) + free(jack_in_connections[i]); + + if (i < sys_inchannels) + jack_in_connections[i] = + jack_port_get_all_connections(jack_client, input_port[i]); + else + jack_in_connections[i] = 0; + + /* saving the inputs connections */ + if (jack_out_connections[i]) + free(jack_out_connections[i]); + + if (i < sys_outchannels) + jack_out_connections[i] = + jack_port_get_all_connections(jack_client, output_port[i]); + else + jack_out_connections[i] = 0; + } + return 0; + } + + static void jack_restore_connection_state(void) + { + int i, j, status; + + post("restoring connections"); + for (i = 0; i != NUM_JACK_PORTS; ++i) + { + /* restoring the inputs connections */ + if (jack_in_connections[i]) + { + j = 0; + while (1) + { + const char* src_port = jack_in_connections[i][j]; + if (!src_port) + /* we've connected all incoming ports */ + break; + + status = jack_connect(jack_client, src_port, + jack_port_name(input_port[i])); + if (status) + post("cannot connect input ports %s -> %s", + src_port, jack_port_name (input_port[i])); + ++j; + } + + } + + /* restoring the output connections */ + if (jack_in_connections[i]) + { + j = 0; + while (1) + { + const char* dst_port = jack_out_connections[i][j]; + if (!dst_port) + /* we've connected all outgoing ports */ + break; + + status = jack_connect(jack_client, jack_port_name(input_port[i]), + dst_port); + if (status) + post("cannot connect output ports %s -> %s", + jack_port_name(output_port[i]), dst_port); + ++j; + } + } + } + } + #endif /* JACK */