[PD-cvs] pd/src s_audio_jack.c,1.5.4.8.2.7.2.8,1.5.4.8.2.7.2.9

Mathieu Bouchard matju at users.sourceforge.net
Tue Jul 10 23:49:18 CEST 2007


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17357

Modified Files:
      Tag: desiredata
	s_audio_jack.c 
Log Message:
cleanup


Index: s_audio_jack.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_audio_jack.c,v
retrieving revision 1.5.4.8.2.7.2.8
retrieving revision 1.5.4.8.2.7.2.9
diff -C2 -d -r1.5.4.8.2.7.2.8 -r1.5.4.8.2.7.2.9
*** s_audio_jack.c	10 Jul 2007 15:48:57 -0000	1.5.4.8.2.7.2.8
--- s_audio_jack.c	10 Jul 2007 21:49:16 -0000	1.5.4.8.2.7.2.9
***************
*** 20,24 ****
  static jack_port_t *output_port[NUM_JACK_PORTS];
  static int outport_count = 0;
! static jack_client_t *jack_client = NULL;
  char *jack_client_names[MAX_CLIENTS];
  static int jack_dio_error;
--- 20,24 ----
  static jack_port_t *output_port[NUM_JACK_PORTS];
  static int outport_count = 0;
! static jack_client_t *jack_client = 0;
  char *jack_client_names[MAX_CLIENTS];
  static int jack_dio_error;
***************
*** 57,70 ****
  }
  
- 
  void sys_peakmeters();
  extern int sys_meters;          /* true if we're metering */
- extern float sys_inmax;         /* max input amplitude */
- extern float sys_outmax;        /* max output amplitude */
- 
  static int dspticks_per_jacktick;
  static void (*copyblock)(t_sample *dst,t_sample *src,int n);
  static void (*zeroblock)(t_sample *dst,int n);
- 
  extern int canvas_dspstate;
  
--- 57,65 ----
***************
*** 135,150 ****
  
  /* register idle callback in scheduler */
! static void jack_shutdown (void *arg) {sys_callback(jack_shutdown_handler, NULL, 0);}
! static int jack_graph_order_callback(void* arg) {sys_callback(jack_save_connection_state, NULL, 0); return 0;}
  
  static char** jack_get_clients() {
-     const char **jack_ports;
      int num_clients = 0;
      regex_t port_regex;
!     jack_ports = jack_get_ports(jack_client, "", "", 0);
      regcomp(&port_regex, "^[^:]*", REG_EXTENDED);
!     jack_client_names[0] = NULL;
      /* Build a list of clients from the list of ports */
!     for (int i=0; jack_ports[i] != NULL; i++) {
          int client_seen;
          regmatch_t match_info;
--- 130,144 ----
  
  /* register idle callback in scheduler */
! static void jack_shutdown (void *arg) {sys_callback(jack_shutdown_handler,0,0);}
! static int jack_graph_order_callback(void* arg) {sys_callback(jack_save_connection_state,0,0); return 0;}
  
  static char** jack_get_clients() {
      int num_clients = 0;
      regex_t port_regex;
!     const char **jack_ports = jack_get_ports(jack_client, "", "", 0);
      regcomp(&port_regex, "^[^:]*", REG_EXTENDED);
!     jack_client_names[0] = 0;
      /* Build a list of clients from the list of ports */
!     for (int i=0; jack_ports[i] != 0; i++) {
          int client_seen;
          regmatch_t match_info;
***************
*** 159,175 ****
          if (!client_seen) {
              jack_client_names[num_clients] = (char*)getbytes(strlen(tmp_client_name) + 1);
!             /* The alsa_pcm client should go in spot 0.  If this
!              * is the alsa_pcm client AND we are NOT about to put
!              * it in spot 0 put it in spot 0 and move whatever
!              * was already in spot 0 to the end. */
              if (strcmp("alsa_pcm",tmp_client_name)==0 && num_clients>0) {
                  /* alsa_pcm goes in spot 0 */
  		char* tmp = jack_client_names[ num_clients ];
! 		jack_client_names[ num_clients ] = jack_client_names[0];
  		jack_client_names[0] = tmp;
  		strcpy(jack_client_names[0], tmp_client_name);
              } else {
                  /* put the new client at the end of the client list */
!                 strcpy(jack_client_names[ num_clients ], tmp_client_name);
              }
              num_clients++;
--- 153,167 ----
          if (!client_seen) {
              jack_client_names[num_clients] = (char*)getbytes(strlen(tmp_client_name) + 1);
!             /* The alsa_pcm client should go in spot 0.  If this is the alsa_pcm client AND we are NOT about to put
!                it in spot 0 put it in spot 0 and move whatever was already in spot 0 to the end. */
              if (strcmp("alsa_pcm",tmp_client_name)==0 && num_clients>0) {
                  /* alsa_pcm goes in spot 0 */
  		char* tmp = jack_client_names[ num_clients ];
! 		jack_client_names[num_clients] = jack_client_names[0];
  		jack_client_names[0] = tmp;
  		strcpy(jack_client_names[0], tmp_client_name);
              } else {
                  /* put the new client at the end of the client list */
!                 strcpy(jack_client_names[num_clients], tmp_client_name);
              }
              num_clients++;
***************
*** 183,188 ****
  /* Wire up all the ports of one client. */
  static int jack_connect_ports(char *client) {
! 	char regex_pattern[100]; /* its always the same, ... */
! 	const char **jack_ports;
  	static int entered = 0;
  	if (entered) return 0;
--- 175,179 ----
  /* Wire up all the ports of one client. */
  static int jack_connect_ports(char *client) {
! 	char regex_pattern[100];
  	static int entered = 0;
  	if (entered) return 0;
***************
*** 190,203 ****
  	if (strlen(client) > 96)  return -1;
  	sprintf(regex_pattern, "%s:.*", client);
! 	jack_ports = jack_get_ports(jack_client, regex_pattern, NULL, JackPortIsOutput);
  	if (jack_ports)
! 		for (int i=0;jack_ports[i] != NULL && i < sys_inchannels;i++)
  			if (jack_connect (jack_client, jack_ports[i], jack_port_name (input_port[i])))
! 				fprintf (stderr, "cannot connect input ports %s -> %s\n", jack_ports[i],jack_port_name (input_port[i]));
! 	jack_ports = jack_get_ports(jack_client, regex_pattern, NULL, JackPortIsInput);
  	if (jack_ports)
! 		for (int i=0;jack_ports[i] != NULL && i < sys_outchannels;i++)
  			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;
--- 181,195 ----
  	if (strlen(client) > 96)  return -1;
  	sprintf(regex_pattern, "%s:.*", client);
! 	const char **jack_ports = jack_get_ports(jack_client, regex_pattern, 0, JackPortIsOutput);
  	if (jack_ports)
! 		for (int i=0;jack_ports[i] != 0 && i < sys_inchannels;i++)
  			if (jack_connect (jack_client, jack_ports[i], jack_port_name (input_port[i])))
! 				fprintf (stderr, "cannot connect input ports %s -> %s\n",  jack_ports[i],jack_port_name(input_port[i]));
! 	free(jack_ports);
! 	jack_ports = jack_get_ports(jack_client, regex_pattern, 0, JackPortIsInput);
  	if (jack_ports)
! 		for (int i=0;jack_ports[i] != 0 && i < sys_outchannels;i++)
  			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;
***************
*** 207,220 ****
  
  int jack_open_audio(int inchans, int outchans, int rate, int scheduler) {
      char port_name[80] = "";
-     int client_iterator = 0;
      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) {
  	fprintf(stderr,"%d output ports not supported, setting to %d\n",outchans, NUM_JACK_PORTS);
--- 199,212 ----
  
  int jack_open_audio(int inchans, int outchans, int rate, int scheduler) {
+     jack_dio_error = 0;
+     if (inchans==0 && outchans==0) return 0;
+     int ret = jack_open_audio(inchans,outchans,rate,scheduler);
+     if (ret) sys_setscheduler(0);
+     return ret;
+ }
+ 
+ int jack_open_audio_2(int inchans, int outchans, int rate, int scheduler) {
      char port_name[80] = "";
      int new_jack = 0;
      if (outchans > NUM_JACK_PORTS) {
  	fprintf(stderr,"%d output ports not supported, setting to %d\n",outchans, NUM_JACK_PORTS);
***************
*** 227,231 ****
      if (jack_client && scheduler != sys_getscheduler()) {
  	jack_client_close(jack_client);
! 	jack_client = NULL;
      }
      sys_setscheduler(scheduler);
--- 219,223 ----
      if (jack_client && scheduler != sys_getscheduler()) {
  	jack_client_close(jack_client);
! 	jack_client = 0;
      }
      sys_setscheduler(scheduler);
***************
*** 241,253 ****
      /* try to become a client of the JACK server (we allow two pd's)*/
      if (!jack_client) {
  	do {
              sprintf(port_name,"pure_data_%d",client_iterator);
              client_iterator++;
  	} while (((jack_client = jack_client_new (port_name)) == 0) && client_iterator < 2);
! 	if (!jack_client) { // jack spits out enough messages already, do not warn
!             sys_inchannels = sys_outchannels = 0;
! 	    ret = 1;
! 	    goto bailout;
! 	}
  	jack_get_clients();
  	/* tell the JACK server to call `process()' whenever there is work to be done.
--- 233,243 ----
      /* try to become a client of the JACK server (we allow two pd's)*/
      if (!jack_client) {
+         int client_iterator = 0;
  	do {
              sprintf(port_name,"pure_data_%d",client_iterator);
              client_iterator++;
  	} while (((jack_client = jack_client_new (port_name)) == 0) && client_iterator < 2);
!         // jack spits out enough messages already, do not warn
! 	if (!jack_client) {sys_inchannels = sys_outchannels = 0; return 1;}
  	jack_get_clients();
  	/* tell the JACK server to call `process()' whenever there is work to be done.
***************
*** 259,265 ****
  	jack_set_error_function (jack_error);
  #ifdef JACK_XRUN
! 	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 the sample rate of the system changes. */
  	jack_set_sample_rate_callback (jack_client, jack_srate, 0);
--- 249,255 ----
  	jack_set_error_function (jack_error);
  #ifdef JACK_XRUN
! 	jack_set_xrun_callback (jack_client, jack_xrun, 0);
  #endif
! 	jack_set_graph_order_callback(jack_client, jack_graph_order_callback, 0);
  	/* tell the JACK server to call `srate()' whenever the sample rate of the system changes. */
  	jack_set_sample_rate_callback (jack_client, jack_srate, 0);
***************
*** 268,273 ****
  	jack_on_shutdown (jack_client, jack_shutdown, 0);
  	for (int j=0;j<NUM_JACK_PORTS;j++) {
! 		input_port[j]=NULL;
! 		output_port[j] = NULL;
  	}
  	new_jack = 1;
--- 258,263 ----
  	jack_on_shutdown (jack_client, jack_shutdown, 0);
  	for (int j=0;j<NUM_JACK_PORTS;j++) {
! 		input_port[j]=0;
! 		output_port[j]=0;
  	}
  	new_jack = 1;
***************
*** 275,288 ****
      /* display the current sample rate. once the client is activated
         (see below), you should rely on your own sample rate callback (see above) for this value. */
!     srate = jack_get_sample_rate (jack_client);
      sys_dacsr = srate;
      /* create the ports */
      for (int j = 0; j < inchans; j++) {
  	sprintf(port_name, "input%d", j);
! 	if (!input_port[j]) input_port[j] = jack_port_register (jack_client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
      }
      for (int j = 0; j < outchans; j++) {
  	sprintf(port_name, "output%d", j);
! 	if (!output_port[j]) output_port[j] = jack_port_register (jack_client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
      }
      outport_count = outchans;
--- 265,278 ----
      /* display the current sample rate. once the client is activated
         (see below), you should rely on your own sample rate callback (see above) for this value. */
!     int srate = jack_get_sample_rate (jack_client);
      sys_dacsr = srate;
      /* create the ports */
      for (int j = 0; j < inchans; j++) {
  	sprintf(port_name, "input%d", j);
! 	if (!input_port[j])  input_port[j]  = jack_port_register(jack_client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
      }
      for (int j = 0; j < outchans; j++) {
  	sprintf(port_name, "output%d", j);
! 	if (!output_port[j]) output_port[j] = jack_port_register(jack_client, port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
      }
      outport_count = outchans;
***************
*** 290,310 ****
      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]);
! 	pthread_mutex_init(&jack_mutex,NULL);
! 	pthread_cond_init(&jack_sem,NULL);
      }
      /* tb: get advance from jack server */
      sys_schedadvance = int((float)jack_port_get_total_latency(jack_client,output_port[0]) * 1000. / sys_dacsr * 1000);
      return 0;
-  bailout:
-     /* tb: if we can't start jack, go to traditional scheduler */
-     sys_setscheduler(0);
-     return ret;
  }
  
--- 280,292 ----
      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]);
! 	pthread_mutex_init(&jack_mutex,0);
! 	pthread_cond_init(&jack_sem,0);
      }
      /* tb: get advance from jack server */
      sys_schedadvance = int((float)jack_port_get_total_latency(jack_client,output_port[0]) * 1000. / sys_dacsr * 1000);
      return 0;
  }
  
***************
*** 314,321 ****
  	jack_started = 0;
  	jack_client_close(jack_client);
! 	jack_client = NULL;
  	for (int i = 0; i <NUM_JACK_PORTS; i++) {
! 		input_port[i] = NULL;
! 		output_port[i] = NULL;
  	}
      }
--- 296,303 ----
  	jack_started = 0;
  	jack_client_close(jack_client);
! 	jack_client = 0;
  	for (int i = 0; i <NUM_JACK_PORTS; i++) {
! 		input_port[i] = 0;
! 		output_port[i] = 0;
  	}
      }





More information about the Pd-cvs mailing list