[PD-cvs] pd/src s_audio_jack.c,1.5.4.2,1.5.4.3

Tim Blechmann timblech at users.sourceforge.net
Fri Apr 8 14:44:08 CEST 2005


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

Modified Files:
      Tag: devel_0_38
	s_audio_jack.c 
Log Message:
callback based scheduling

Index: s_audio_jack.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/s_audio_jack.c,v
retrieving revision 1.5.4.2
retrieving revision 1.5.4.3
diff -C2 -d -r1.5.4.2 -r1.5.4.3
*** s_audio_jack.c	27 Feb 2005 12:06:52 -0000	1.5.4.2
--- s_audio_jack.c	8 Apr 2005 12:44:05 -0000	1.5.4.3
***************
*** 8,11 ****
--- 8,12 ----
  #include <string.h>
  #include <m_pd.h>
+ #include "m_simd.h"
  #include <s_stuff.h>
  #include <jack/jack.h>
***************
*** 31,38 ****
  static int jack_dio_error;
  
- 
  pthread_mutex_t jack_mutex;
  pthread_cond_t jack_sem;
  
  static int
  process (jack_nframes_t nframes, void *arg)
--- 32,41 ----
  static int jack_dio_error;
  
  pthread_mutex_t jack_mutex;
  pthread_cond_t jack_sem;
  
+ extern int sys_keepsched;
+ extern int sys_callbackscheduler;
+ 
  static int
  process (jack_nframes_t nframes, void *arg)
***************
*** 41,46 ****
  	float *out; 
  	float *in;
!         
!         
  	if (nframes > JACK_OUT_MAX) jack_out_max = nframes;
  	else jack_out_max = JACK_OUT_MAX;
--- 44,48 ----
  	float *out; 
  	float *in;
! 
  	if (nframes > JACK_OUT_MAX) jack_out_max = nframes;
  	else jack_out_max = JACK_OUT_MAX;
***************
*** 66,74 ****
  		jack_filled = 0;
  	}
! 	/* tb: wait in the scheduler
! 	 * pthread_cond_broadcast(&jack_sem); */
  	return 0;
  }
  
  static int
  jack_srate (jack_nframes_t srate, void *arg)
--- 68,128 ----
  		jack_filled = 0;
  	}
! /* 	tb: wait in the scheduler */
! /* 	pthread_cond_broadcast(&jack_sem); */
! 	return 0;
! }
! 
! 
! void sys_peakmeters(void);
! 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);
! 
! static int cb_process (jack_nframes_t nframes, void *arg)
! {
! 	int i,j;
! 	
! 	sys_lock();
! 	for (i = 0; i != dspticks_per_jacktick; ++i)
! 	{
! 		/* get sound from the inputs */
! 		for (j = 0; j < sys_inchannels; j++)
! 		{
! 			t_sample * in = jack_port_get_buffer(input_port[j], nframes);
! 			copyvec_simd(sys_soundin + j * sys_dacblocksize,
! 						 in + i * sys_dacblocksize,
! 						 sys_dacblocksize);
! 		}
! 
! 		/* run dsp */
! 		sched_tick(sys_time + sys_time_per_dsp_tick);
! 
! 		/* send sound to the output */
! 		for (j = 0; j < sys_outchannels;  j++) 
! 		{
! 			t_sample * out = jack_port_get_buffer (output_port[j], nframes);
! 			copyvec_simd(out + i * sys_dacblocksize,
! 						 sys_soundout + j * sys_dacblocksize,
! 						 sys_dacblocksize);
! 		}
! 		
! 		/* update peak meters */
! 		if (sys_meters)
! 			sys_peakmeters();
! 		
! 		/* clear the output buffer */
! 		zerovec_simd(sys_soundout, j * sys_dacblocksize);
! 	}
! 	sys_unlock();
! 
  	return 0;
  }
  
+ 
+ 
  static int
  jack_srate (jack_nframes_t srate, void *arg)
***************
*** 97,101 ****
      int num_clients = 0;
      regex_t port_regex;
!     jack_ports = jack_get_ports( jack_client, "", "", 0 );
      regcomp( &port_regex, "^[^:]*", REG_EXTENDED );
  
--- 151,155 ----
      int num_clients = 0;
      regex_t port_regex;
! 	jack_ports = jack_get_ports( jack_client, "", "", 0 );
      regcomp( &port_regex, "^[^:]*", REG_EXTENDED );
  
***************
*** 201,206 ****
  
  int
! jack_open_audio(int inchans, int outchans, int rate)
! 
  {
  	int j;
--- 255,259 ----
  
  int
! jack_open_audio(int inchans, int outchans, int rate, int scheduler)
  {
  	int j;
***************
*** 224,227 ****
--- 277,289 ----
  	}
  
+ 	if (jack_client && sys_callbackscheduler != scheduler)
+ 	{
+ 		jack_client_close(jack_client);
+ 		jack_client = NULL;
+ 	}
+ 	
+ 	sys_keepsched = 0;
+ 	sys_callbackscheduler = scheduler;
+ 
  	/* try to become a client of the JACK server (we allow two pd's)*/
  	if (!jack_client) {
***************
*** 241,248 ****
  		/* tell the JACK server to call `process()' whenever
  		   there is work to be done.
  		*/
!           
! 		jack_set_process_callback (jack_client, process, 0);
!           
  		jack_set_error_function (jack_error);
            
--- 303,314 ----
  		/* tell the JACK server to call `process()' whenever
  		   there is work to be done.
+ 		   tb: adapted for callback based scheduling
  		*/
! 		if (scheduler == 1)
! 			jack_set_process_callback (jack_client, cb_process, 0);
! 		else
! 			jack_set_process_callback (jack_client, process, 0);
! 		
! 
  		jack_set_error_function (jack_error);
            
***************
*** 311,314 ****
--- 377,401 ----
  		pthread_cond_init(&jack_sem,NULL);
  	}
+ 
+ 	if (scheduler)
+ 		dspticks_per_jacktick = jack_get_buffer_size(jack_client)
+ 			/ sys_schedblocksize;
+ 	
+ 	/* tb: get advance from jack server */
+ 	sys_schedadvance = (float)jack_port_get_total_latency(jack_client,output_port[0]) 
+ 		* 1000. / sys_dacsr * 1000;
+ 	
+ 	/* set block copy/zero functions */
+     if(SIMD_CHKCNT(sys_dacblocksize) && simd_runtime_check()) 
+ 	{
+         copyblock = (void (*)(t_sample *,t_sample *,int))&copyvec_simd;
+         zeroblock = &zerovec_simd;
+     }
+     else 
+ 	{
+         copyblock = (void (*)(t_sample *,t_sample *,int))&copyvec;
+         zeroblock = &zerovec;
+     }
+ 
  	return 0;
  }
***************
*** 317,321 ****
--- 404,411 ----
  
  {
+ 	jack_client_deactivate(jack_client);
  	jack_started = 0;
+ 	jack_client_close(jack_client);
+ 	jack_client = NULL;
  }
  
***************
*** 339,344 ****
  	if (jack_filled >= jack_out_max)
  		return SENDDACS_NO;
! 	/* tb: wait in the scheduler
! 	 * pthread_cond_wait(&jack_sem,&jack_mutex); */
  
  	jack_started = 1;
--- 429,434 ----
  	if (jack_filled >= jack_out_max)
  		return SENDDACS_NO;
! 	/* 	tb: wait in the scheduler */
! /* 		pthread_cond_wait(&jack_sem,&jack_mutex); */
  
  	jack_started = 1;





More information about the Pd-cvs mailing list