[PD-cvs] pd/src d_soundfile.c,1.4.4.11.2.10.2.8,1.4.4.11.2.10.2.9

Mathieu Bouchard matju at users.sourceforge.net
Tue Jul 3 06:35:02 CEST 2007


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

Modified Files:
      Tag: desiredata
	d_soundfile.c 
Log Message:
more cleanup


Index: d_soundfile.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/d_soundfile.c,v
retrieving revision 1.4.4.11.2.10.2.8
retrieving revision 1.4.4.11.2.10.2.9
diff -C2 -d -r1.4.4.11.2.10.2.8 -r1.4.4.11.2.10.2.9
*** d_soundfile.c	3 Jul 2007 01:05:09 -0000	1.4.4.11.2.10.2.8
--- d_soundfile.c	3 Jul 2007 04:34:59 -0000	1.4.4.11.2.10.2.9
***************
*** 13,16 ****
--- 13,17 ----
  
  /* threaded soundfiler by Tim Blechmann */
+ // #define THREADED_SF
  
  #ifndef MSW
***************
*** 27,31 ****
  #include <stdlib.h>
  
! #include "m_pd.h"
  
  #define MAXSFCHANS 64
--- 28,35 ----
  #include <stdlib.h>
  
! #define PD_PLUSPLUS_FACE
! #include "desire.h"
! #define a_symbol a_w.w_symbol
! #define a_float a_w.w_float
  
  #define MAXSFCHANS 64
***************
*** 394,407 ****
      t_symbol *filesym;
      float rate = -1;
!     while (argc > 0 && argv->a_type == A_SYMBOL && *argv->a_w.w_symbol->s_name == '-') {
!         char *flag = argv->a_w.w_symbol->s_name + 1;
          if (!strcmp(flag, "skip")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((onset = (long) argv[1].a_w.w_float) < 0)) goto usage;
              argc -= 2; argv += 2;
          } else if (!strcmp(flag, "nframes")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((nframes = (long) argv[1].a_w.w_float) < 0)) goto usage;
              argc -= 2; argv += 2;
          } else if (!strcmp(flag, "bytes")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((bytespersamp = (int) argv[1].a_w.w_float) < 2) || bytespersamp > 4) goto usage;
              argc -= 2; argv += 2;
          } else if (!strcmp(flag, "normalize")) {normalize = 1; argc -= 1; argv += 1;
--- 398,411 ----
      t_symbol *filesym;
      float rate = -1;
!     while (argc > 0 && argv->a_type == A_SYMBOL && *argv->a_symbol->s_name == '-') {
!         char *flag = argv->a_symbol->s_name + 1;
          if (!strcmp(flag, "skip")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((onset = (long) argv[1].a_float) < 0)) goto usage;
              argc -= 2; argv += 2;
          } else if (!strcmp(flag, "nframes")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((nframes = (long) argv[1].a_float) < 0)) goto usage;
              argc -= 2; argv += 2;
          } else if (!strcmp(flag, "bytes")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((bytespersamp = (int) argv[1].a_float) < 2) || bytespersamp > 4) goto usage;
              argc -= 2; argv += 2;
          } else if (!strcmp(flag, "normalize")) {normalize = 1; argc -= 1; argv += 1;
***************
*** 412,421 ****
          } else if (!strcmp(flag, "little"))    {endianness = 0; argc -= 1; argv += 1;
          } else if (!strcmp(flag, "r") || !strcmp(flag, "rate")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((rate = argv[1].a_w.w_float) <= 0)) goto usage;
              argc -= 2; argv += 2;
          } else goto usage;
      }
      if (!argc || argv->a_type != A_SYMBOL) goto usage;
!     filesym = argv->a_w.w_symbol;
      /* check if format not specified and fill in */
      if (filetype < 0) {
--- 416,425 ----
          } else if (!strcmp(flag, "little"))    {endianness = 0; argc -= 1; argv += 1;
          } else if (!strcmp(flag, "r") || !strcmp(flag, "rate")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((rate = argv[1].a_float) <= 0)) goto usage;
              argc -= 2; argv += 2;
          } else goto usage;
      }
      if (!argc || argv->a_type != A_SYMBOL) goto usage;
!     filesym = argv->a_symbol;
      /* check if format not specified and fill in */
      if (filetype < 0) {
***************
*** 662,666 ****
  
  static pthread_t sf_thread_id; /* id of soundfiler thread */
- static pthread_attr_t sf_attr;
  
  struct t_sfprocess {
--- 666,669 ----
***************
*** 699,705 ****
      pthread_mutex_lock(&(last_entry->mutex));
      last_entry->process = process;
!     last_entry->x = x;
      last_entry->argc = argc;
!     last_entry->argv = copybytes (argv, argc * sizeof(t_atom));
      last_entry->next = NULL;
      pthread_mutex_unlock(&(last_entry->mutex));
--- 702,708 ----
      pthread_mutex_lock(&(last_entry->mutex));
      last_entry->process = process;
!     last_entry->x = (t_soundfiler *)x;
      last_entry->argc = argc;
!     last_entry->argv = (t_atom *)copybytes(argv, argc * sizeof(t_atom));
      last_entry->next = NULL;
      pthread_mutex_unlock(&(last_entry->mutex));
***************
*** 733,739 ****
  /* global soundfiler thread ... sleeping until signaled */
  void soundfiler_thread() {
!     t_sfprocess * me;
!     int i;
!     t_sfprocess * next;
  #ifdef DEBUG
      post("soundfiler_thread ID: %d", pthread_self());
--- 736,741 ----
  /* global soundfiler thread ... sleeping until signaled */
  void soundfiler_thread() {
!     t_sfprocess *me;
!     t_sfprocess *next;
  #ifdef DEBUG
      post("soundfiler_thread ID: %d", pthread_self());
***************
*** 783,789 ****
      int status;
      // initialize queue
!     soundfiler_queue = getbytes (sizeof(t_sfqueue));
!     pthread_mutex_init (&soundfiler_queue->mutex,NULL);
!     pthread_cond_init (&soundfiler_queue->cond,NULL);
      soundfiler_queue->begin=soundfiler_queue->end=NULL;
  /*     pthread_mutex_unlock(&(soundfiler_queue->mutex));  */
--- 785,791 ----
      int status;
      // initialize queue
!     soundfiler_queue = (t_sfqueue *)getbytes(sizeof(t_sfqueue));
!     pthread_mutex_init(&soundfiler_queue->mutex,NULL);
!     pthread_cond_init(&soundfiler_queue->cond,NULL);
      soundfiler_queue->begin=soundfiler_queue->end=NULL;
  /*     pthread_mutex_unlock(&(soundfiler_queue->mutex));  */
***************
*** 803,807 ****
  #endif /* UNIX */
      //start thread
!     status = pthread_create(&sf_thread_id, &sf_attr, (void *) soundfiler_thread,NULL);
      if (status != 0) error("Couldn't create soundfiler thread: %d",status);
      else post("global soundfiler thread launched, priority: %d", sf_param.sched_priority);
--- 805,809 ----
  #endif /* UNIX */
      //start thread
!     status = pthread_create(&sf_thread_id, &sf_attr, (void *(*)(void *)) soundfiler_thread,NULL);
      if (status != 0) error("Couldn't create soundfiler thread: %d",status);
      else post("global soundfiler thread launched, priority: %d", sf_param.sched_priority);
***************
*** 838,843 ****
  static void soundfiler_t_read(t_soundfiler *x, t_symbol *s, int argc, t_atom *argv) {
      int headersize = -1, channels = 0, bytespersamp = 0, bigendian = 0, resize = 0, i, j;
!     long skipframes = 0, nframes = 0, finalsize = 0, itemsleft, maxsize = DEFMAXSIZE, itemsread = 0,
! 	bytelimit = 0x7fffffff;
      int fd = -1;
      char endianness, *filename;
--- 840,844 ----
  static void soundfiler_t_read(t_soundfiler *x, t_symbol *s, int argc, t_atom *argv) {
      int headersize = -1, channels = 0, bytespersamp = 0, bigendian = 0, resize = 0, i, j;
!     long skipframes = 0, nframes = 0, finalsize = 0, maxsize = DEFMAXSIZE, itemsread = 0, bytelimit = 0x7fffffff;
      int fd = -1;
      char endianness, *filename;
***************
*** 852,872 ****
      pthread_mutex_t resume_after_callback_mutex = PTHREAD_MUTEX_INITIALIZER; /* dummy */
      t_int* outargs;
!     while (argc > 0 && argv->a_type == A_SYMBOL && *argv->a_w.w_symbol->s_name == '-') {
!     	char *flag = argv->a_w.w_symbol->s_name + 1;
  		if (!strcmp(flag, "skip")) {
! 			if (argc < 2 || argv[1].a_type != A_FLOAT || ((skipframes = argv[1].a_w.w_float) < 0)) goto usage;
  			argc -= 2; argv += 2;
  		} else if (!strcmp(flag, "nframes")) {
! 			if (argc < 2 || argv[1].a_type != A_FLOAT || ((nframes = argv[1].a_w.w_float) < 0)) goto usage;
  			argc -= 2; argv += 2;
  		} else if (!strcmp(flag, "raw")) {
  			if (argc < 5 ||
! 				argv[1].a_type != A_FLOAT || ((headersize = argv[1].a_w.w_float) < 0) ||
! 				argv[2].a_type != A_FLOAT || ((channels = argv[2].a_w.w_float) < 1) ||
  				(channels > MAXSFCHANS) ||
! 				argv[3].a_type != A_FLOAT || ((bytespersamp = argv[3].a_w.w_float) < 2) ||
  				(bytespersamp > 4) ||
  				argv[4].a_type != A_SYMBOL ||
! 				((endianness = argv[4].a_w.w_symbol->s_name[0]) != 'b'
  				 && endianness != 'l' && endianness != 'n'))
  				goto usage;
--- 853,873 ----
      pthread_mutex_t resume_after_callback_mutex = PTHREAD_MUTEX_INITIALIZER; /* dummy */
      t_int* outargs;
!     while (argc > 0 && argv->a_type == A_SYMBOL && *argv->a_symbol->s_name == '-') {
!     	char *flag = argv->a_symbol->s_name + 1;
  		if (!strcmp(flag, "skip")) {
! 			if (argc < 2 || argv[1].a_type != A_FLOAT || ((skipframes = long(argv[1].a_float)) < 0)) goto usage;
  			argc -= 2; argv += 2;
  		} else if (!strcmp(flag, "nframes")) {
! 			if (argc < 2 || argv[1].a_type != A_FLOAT || ((nframes = long(argv[1].a_float)) < 0)) goto usage;
  			argc -= 2; argv += 2;
  		} else if (!strcmp(flag, "raw")) {
  			if (argc < 5 ||
! 				argv[1].a_type != A_FLOAT || ((headersize = int(argv[1].a_float)) < 0) ||
! 				argv[2].a_type != A_FLOAT || ((channels = int(argv[2].a_float)) < 1) ||
  				(channels > MAXSFCHANS) ||
! 				argv[3].a_type != A_FLOAT || ((bytespersamp = int(argv[3].a_float)) < 2) ||
  				(bytespersamp > 4) ||
  				argv[4].a_type != A_SYMBOL ||
! 				((endianness = argv[4].a_symbol->s_name[0]) != 'b'
  				 && endianness != 'l' && endianness != 'n'))
  				goto usage;
***************
*** 879,883 ****
  			argc -= 1; argv += 1;
  		} else if (!strcmp(flag, "maxsize")) {
! 			if (argc < 2 || argv[1].a_type != A_FLOAT || ((maxsize = argv[1].a_w.w_float) < 0)) goto usage;
  			resize = 1;     /* maxsize implies resize. */
  			argc -= 2; argv += 2;
--- 880,884 ----
  			argc -= 1; argv += 1;
  		} else if (!strcmp(flag, "maxsize")) {
! 			if (argc < 2 || argv[1].a_type != A_FLOAT || ((maxsize = long(argv[1].a_float)) < 0)) goto usage;
  			resize = 1;     /* maxsize implies resize. */
  			argc -= 2; argv += 2;
***************
*** 885,898 ****
      }
      if (argc < 2 || argc > MAXSFCHANS + 1 || argv[0].a_type != A_SYMBOL) goto usage;
!     filename = argv[0].a_w.w_symbol->s_name;
      argc--; argv++;
      for (i = 0; i < argc; i++) {
      	if (argv[i].a_type != A_SYMBOL) goto usage;
! 	if (!(garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_w.w_symbol, garray_class))) {
! 		pd_error(x, "%s: no such table", argv[i].a_w.w_symbol->s_name);
  		goto done;
  	}
      	else if (!garray_getfloatarray(garrays[i], &vecsize[i], &vecs[i]))
!     	    error("%s: bad template for tabwrite", argv[i].a_w.w_symbol->s_name);
      	if (finalsize && finalsize != vecsize[i] && !resize) {
  		post("soundfiler_read: arrays have different lengths; resizing...");
--- 886,899 ----
      }
      if (argc < 2 || argc > MAXSFCHANS + 1 || argv[0].a_type != A_SYMBOL) goto usage;
!     filename = argv[0].a_symbol->s_name;
      argc--; argv++;
      for (i = 0; i < argc; i++) {
      	if (argv[i].a_type != A_SYMBOL) goto usage;
! 	if (!(garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_symbol, garray_class))) {
! 		pd_error(x, "%s: no such table", argv[i].a_symbol->s_name);
  		goto done;
  	}
      	else if (!garray_getfloatarray(garrays[i], &vecsize[i], &vecs[i]))
!     	    error("%s: bad template for tabwrite", argv[i].a_symbol->s_name);
      	if (finalsize && finalsize != vecsize[i] && !resize) {
  		post("soundfiler_read: arrays have different lengths; resizing...");
***************
*** 940,944 ****
  	if (resize)
  		for (i = 0; i < argc; i++) {
! 			nvecs[i]=getalignedbytes (finalsize * sizeof(t_float));
  			/* if we are out of memory, free it again and quit */
  			if (nvecs[i]==0) {
--- 941,945 ----
  	if (resize)
  		for (i = 0; i < argc; i++) {
! 			nvecs[i] = (float *)getalignedbytes(finalsize * sizeof(t_float));
  			/* if we are out of memory, free it again and quit */
  			if (nvecs[i]==0) {
***************
*** 953,957 ****
  	else
  		for (i = 0; i < argc; i++) {
! 			nvecs[i] = getalignedbytes (vecsize[i] * sizeof(t_float));
  			/* if we are out of memory, free it again and quit */
  			if (nvecs[i]==0) {
--- 954,958 ----
  	else
  		for (i = 0; i < argc; i++) {
! 			nvecs[i] = (float *)getalignedbytes(vecsize[i] * sizeof(t_float));
  			/* if we are out of memory, free it again and quit */
  			if (nvecs[i]==0) {
***************
*** 1006,1010 ****
  		sys_callback(&soundfiler_read_update_graphics, w, 2);
  	}
- end:
  	/* free the old arrays */
  	for (i = 0; i < argc; i++) freealignedbytes(vecs[i], vecsize[i] * sizeof(t_float));
--- 1007,1010 ----
***************
*** 1024,1028 ****
  #endif
  	outargs = (t_int*)getbytes(2*sizeof(t_int));
! 	outargs[0] = (t_int)x->x_obj.ob_outlet;
  	outargs[1] = (t_int)itemsread;
  	sys_callback(&soundfiler_read_output, outargs, 2);
--- 1024,1028 ----
  #endif
  	outargs = (t_int*)getbytes(2*sizeof(t_int));
! 	outargs[0] = (t_int)x->outlet;
  	outargs[1] = (t_int)itemsread;
  	sys_callback(&soundfiler_read_output, outargs, 2);
***************
*** 1035,1041 ****
  	t_int finalsize = w[2];
  	pthread_cond_t * conditional = (pthread_cond_t*) w[3];
! 	garray->x_array.a_vec = (char *) nvec;
! 	garray->x_array.a_n = finalsize;
! 	if (garray->x_usedindsp) canvas_update_dsp();
  	/* signal helper thread */
  	pthread_cond_broadcast(conditional);
--- 1035,1041 ----
  	t_int finalsize = w[2];
  	pthread_cond_t * conditional = (pthread_cond_t*) w[3];
! 	garray->array.vec = (char *) nvec;
! 	garray->array.n = finalsize;
! 	if (garray->usedindsp) canvas_update_dsp();
  	/* signal helper thread */
  	pthread_cond_broadcast(conditional);
***************
*** 1044,1049 ****
  
  static t_int soundfiler_read_update_graphics(t_int * w) {
! 	t_garray* garray = (t_garray*) w[0];
! 	t_glist *gl;
  	int n = w[1];
  	/* if this is the only array in the graph, reset the graph's coordinates */
--- 1044,1049 ----
  
  static t_int soundfiler_read_update_graphics(t_int * w) {
! 	t_garray *garray = (t_garray*) w[0];
! 	t_canvas *gl;
  	int n = w[1];
  	/* if this is the only array in the graph, reset the graph's coordinates */
***************
*** 1051,1058 ****
  	post("redraw array %p", garray);
  #endif
! 	gl = garray->x_glist;
! 	if (gl->gl_list == &garray->x_gobj && !garray->x_gobj.g_next) {
! 		vmess(&gl->gl_pd, gensym("bounds"), "ffff",
! 			  0., gl->gl_y1, (double)(n > 1 ? n-1 : 1), gl->gl_y2);
  		/* close any dialogs that might have the wrong info now... */
  	} else garray_redraw(garray);
--- 1051,1057 ----
  	post("redraw array %p", garray);
  #endif
! 	gl = garray->canvas;
! 	if (gl->list == garray && !garray->next) {
! 		vmess(gl, gensym("bounds"), "ffff", 0., gl->y1, double(n > 1 ? n-1 : 1), gl->y2);
  		/* close any dialogs that might have the wrong info now... */
  	} else garray_redraw(garray);
***************
*** 1073,1082 ****
     call it too... not done yet though. */
  long soundfiler_t_dowrite(void *obj, t_canvas *canvas, int argc, t_atom *argv) {
!     int headersize, bytespersamp, bigendian, endianness, swap, filetype, normalize, i, j, nchannels;
!     long onset, nframes, itemsleft, maxsize = DEFMAXSIZE, itemswritten = 0;
      t_garray *garrays[MAXSFCHANS];
      t_float *vecs[MAXSFCHANS];
      char sampbuf[SAMPBUFSIZE];
!     int bufframes, nitems;
      int fd = -1;
      float normfactor, biggest = 0, samplerate;
--- 1072,1081 ----
     call it too... not done yet though. */
  long soundfiler_t_dowrite(void *obj, t_canvas *canvas, int argc, t_atom *argv) {
!     int bytespersamp, bigendian, swap, filetype, normalize, i, j, nchannels;
!     long onset, nframes, itemswritten = 0;
      t_garray *garrays[MAXSFCHANS];
      t_float *vecs[MAXSFCHANS];
      char sampbuf[SAMPBUFSIZE];
!     int bufframes;
      int fd = -1;
      float normfactor, biggest = 0, samplerate;
***************
*** 1093,1102 ****
      	int vecsize;
      	if (argv[i].a_type != A_SYMBOL) goto usage;
! 	if (!(garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_w.w_symbol, garray_class))) {
! 	    pd_error(obj, "%s: no such table", argv[i].a_w.w_symbol->s_name);
  	    goto fail;
  	}
      	else if (!garray_getfloatarray(garrays[i], &vecsize, &vecs[i]))
!     	    error("%s: bad template for tabwrite", argv[i].a_w.w_symbol->s_name);
      	if (nframes > vecsize - onset)
  	    nframes = vecsize - onset;
--- 1092,1101 ----
      	int vecsize;
      	if (argv[i].a_type != A_SYMBOL) goto usage;
! 	if (!(garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_symbol, garray_class))) {
! 	    pd_error(obj, "%s: no such table", argv[i].a_symbol->s_name);
  	    goto fail;
  	}
      	else if (!garray_getfloatarray(garrays[i], &vecsize, &vecs[i]))
!     	    error("%s: bad template for tabwrite", argv[i].a_symbol->s_name);
      	if (nframes > vecsize - onset)
  	    nframes = vecsize - onset;
***************
*** 1125,1129 ****
      bufframes = SAMPBUFSIZE / (nchannels * bytespersamp);
      for (itemswritten = 0; itemswritten < nframes; ) {
!     	int thiswrite = nframes - itemswritten, nitems, nbytes;
      	thiswrite = (thiswrite > bufframes ? bufframes : thiswrite);
  	soundfile_xferout(argc, vecs, (unsigned char *)sampbuf, thiswrite,
--- 1124,1128 ----
      bufframes = SAMPBUFSIZE / (nchannels * bytespersamp);
      for (itemswritten = 0; itemswritten < nframes; ) {
!     	int thiswrite = nframes - itemswritten, nbytes;
      	thiswrite = (thiswrite > bufframes ? bufframes : thiswrite);
  	soundfile_xferout(argc, vecs, (unsigned char *)sampbuf, thiswrite,
***************
*** 1143,1147 ****
      	close (fd);
      }
!     return ((float)itemswritten);
  usage:
      pd_error(obj, "usage: write [flags] filename tablename...");
--- 1142,1146 ----
      	close (fd);
      }
!     return itemswritten;
  usage:
      pd_error(obj, "usage: write [flags] filename tablename...");
***************
*** 1157,1161 ****
      long bozo = soundfiler_t_dowrite(x, x->canvas, argc, argv);
      sys_lock();
!     outlet_float(x->x_obj.ob_outlet, (float)bozo);
      sys_lock();
  }
--- 1156,1160 ----
      long bozo = soundfiler_t_dowrite(x, x->canvas, argc, argv);
      sys_lock();
!     outlet_float(x->outlet, (float)bozo);
      sys_lock();
  }
***************
*** 1170,1191 ****
      int was, elemsize;       /* array contains was elements of size elemsize */
      t_float * vec;           /* old array */
!     t_glist *gl;
!     int dspwas;
      int n;                   /* resize of n elements */
      char *nvec;              /* new array */
  
!     t_garray * x = (t_garray *)pd_findbyclass(argv[0].a_w.w_symbol, garray_class);
      if (!(x)) {
! 	pd_error(y, "%s: no such table", argv[0].a_w.w_symbol->s_name);
  	goto usage;
      }
!     vec = (t_float*) x->x_array.a_vec;
!     was = x->x_array.a_n;
      if ((argv+1)->a_type == A_FLOAT) {
! 	n = (int) (argv+1)->a_w.w_float;
      } else goto usage;
      if (n == was) return;
      if (n < 1) n = 1;
!     elemsize = template_findbyname(x->x_array.a_templatesym)->t_n * sizeof(t_word);
  
  #if (_POSIX_MEMLOCK - 0) >=  200112L
--- 1169,1189 ----
      int was, elemsize;       /* array contains was elements of size elemsize */
      t_float * vec;           /* old array */
!     t_canvas *gl;
      int n;                   /* resize of n elements */
      char *nvec;              /* new array */
  
!     t_garray * x = (t_garray *)pd_findbyclass(argv[0].a_symbol, garray_class);
      if (!(x)) {
! 	pd_error(y, "%s: no such table", argv[0].a_symbol->s_name);
  	goto usage;
      }
!     vec = (t_float*) x->array.vec;
!     was = x->array.n;
      if ((argv+1)->a_type == A_FLOAT) {
! 	n = (int) (argv+1)->a_float;
      } else goto usage;
      if (n == was) return;
      if (n < 1) n = 1;
!     elemsize = template_findbyname(x->array.a_templatesym)->t_n * sizeof(t_word);
  
  #if (_POSIX_MEMLOCK - 0) >=  200112L
***************
*** 1193,1200 ****
  #endif
      if (was > n) {
! 	nvec = (char*)copyalignedbytes(x->x_array.a_vec, was * elemsize);
      } else {
  	nvec = getalignedbytes(n * elemsize);
! 	memcpy (nvec, x->x_array.a_vec, was * elemsize);
  	memset(nvec + was*elemsize, 0, (n - was) * elemsize);
      }
--- 1191,1198 ----
  #endif
      if (was > n) {
! 	nvec = (char*)copyalignedbytes(x->array.a_vec, was * elemsize);
      } else {
  	nvec = getalignedbytes(n * elemsize);
! 	memcpy (nvec, x->array.a_vec, was * elemsize);
  	memset(nvec + was*elemsize, 0, (n - was) * elemsize);
      }
***************
*** 1209,1221 ****
      /* TB: we'll have to be sure that no one is accessing the array */
      sys_lock();
!     x->x_array.a_vec = nvec;
!     x->x_array.a_n = n;
!     if (x->x_usedindsp) canvas_update_dsp();
      sys_unlock();
      /* if this is the only array in the graph, reset the graph's coordinates */
!     gl = x->x_glist;
!     if (gl->gl_list == &x->x_gobj && !x->x_gobj.g_next) {
!     	vmess(&gl->gl_pd, gensym("bounds"), "ffff",
! 	  0., gl->gl_y1, (double)(n > 1 ? n-1 : 1), gl->gl_y2);
  	/* close any dialogs that might have the wrong info now... */
      } else garray_redraw(x);
--- 1207,1218 ----
      /* TB: we'll have to be sure that no one is accessing the array */
      sys_lock();
!     x->array.vec = nvec;
!     x->array.n = n;
!     if (x->usedindsp) canvas_update_dsp();
      sys_unlock();
      /* if this is the only array in the graph, reset the graph's coordinates */
!     gl = x->canvas;
!     if (gl->list == x && !x->next) {
!     	vmess(gl, gensym("bounds"), "ffff", 0., gl->y1, (double)(n > 1 ? n-1 : 1), gl->y2);
  	/* close any dialogs that might have the wrong info now... */
      } else garray_redraw(x);
***************
*** 1225,1229 ****
  #endif
      sys_lock();
!     outlet_float(y->x_obj.ob_outlet, (float)atom_getintarg(1,argc,argv));
      sys_unlock();
      return;
--- 1222,1226 ----
  #endif
      sys_lock();
!     outlet_float(y->outlet, (float)atom_getintarg(1,argc,argv));
      sys_unlock();
      return;
***************
*** 1241,1265 ****
      int size, elemsize;    /* array contains was elements of size elemsize */
      t_float * vec;         /* old array */
!     t_glist *gl;
!     int dspwas;
      int val;               /* value */
      char *nvec;            /* new array */
      int i;
!     t_garray * x = (t_garray *)pd_findbyclass(argv[0].a_w.w_symbol, garray_class);
      if (!(x)) {
! 	pd_error(y, "%s: no such table", argv[0].a_w.w_symbol->s_name);
  	goto usage;
      }
!     vec = (t_float*) x->x_array.a_vec;
!     size = x->x_array.a_n;
      if ((argv+1)->a_type == A_FLOAT) {
! 	val = (int) (argv+1)->a_w.w_float;
      } else goto usage;
!     elemsize = template_findbyname(x->x_array.a_templatesym)->t_n * sizeof(t_word);
      /* allocating memory */
  #if (_POSIX_MEMLOCK - 0) >=  200112L
      munlockall();
  #endif
!     nvec = getalignedbytes(size * elemsize);
      if (!nvec) {
      	pd_error(x, "array resize failed: out of memory");
--- 1238,1261 ----
      int size, elemsize;    /* array contains was elements of size elemsize */
      t_float * vec;         /* old array */
!     t_canvas *gl;
      int val;               /* value */
      char *nvec;            /* new array */
      int i;
!     t_garray * x = (t_garray *)pd_findbyclass(argv[0].a_symbol, garray_class);
      if (!(x)) {
! 	pd_error(y, "%s: no such table", argv[0].a_symbol->s_name);
  	goto usage;
      }
!     vec = (t_float*) x->array.a_vec;
!     size = x->array.a_n;
      if ((argv+1)->a_type == A_FLOAT) {
! 	val = (int) (argv+1)->a_float;
      } else goto usage;
!     elemsize = template_findbyname(x->array.a_templatesym)->t_n * sizeof(t_word);
      /* allocating memory */
  #if (_POSIX_MEMLOCK - 0) >=  200112L
      munlockall();
  #endif
!     nvec = (char *)getalignedbytes(size * elemsize);
      if (!nvec) {
      	pd_error(x, "array resize failed: out of memory");
***************
*** 1273,1284 ****
      /* TB: we'll have to be sure that no one is accessing the array */
      sys_lock();
!     x->x_array.a_vec = nvec;
!     if (x->x_usedindsp) canvas_update_dsp();
      sys_unlock();
      /* if this is the only array in the graph, reset the graph's coordinates */
!     gl = x->x_glist;
!     if (gl->gl_list == &x->x_gobj && !x->x_gobj.g_next) {
!     	vmess(&gl->gl_pd, gensym("bounds"), "ffff",
! 	  0., gl->gl_y1, (double)(size > 1 ? size-1 : 1), gl->gl_y2);
  	/* close any dialogs that might have the wrong info now... */
      } else garray_redraw(x);
--- 1269,1279 ----
      /* TB: we'll have to be sure that no one is accessing the array */
      sys_lock();
!     x->array.a_vec = nvec;
!     if (x->usedindsp) canvas_update_dsp();
      sys_unlock();
      /* if this is the only array in the graph, reset the graph's coordinates */
!     gl = x->canvas;
!     if (gl->list == x && !x->next) {
!     	vmess(gl, gensym("bounds"), "ffff", 0., gl->y1, (double)(size > 1 ? size-1 : 1), gl->y2);
  	/* close any dialogs that might have the wrong info now... */
      } else garray_redraw(x);
***************
*** 1288,1292 ****
  #endif
      sys_lock();
!     outlet_float(y->x_obj.ob_outlet, size);
      sys_unlock();
      return;
--- 1283,1287 ----
  #endif
      sys_lock();
!     outlet_float(y->outlet, size);
      sys_unlock();
      return;
***************
*** 1329,1349 ****
      int bufframes, nitems;
      FILE *fp;
!     while (argc > 0 && argv->a_type == A_SYMBOL && *argv->a_w.w_symbol->s_name == '-') {
!         char *flag = argv->a_w.w_symbol->s_name + 1;
          if (!strcmp(flag, "skip")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((skipframes = long(argv[1].a_w.w_float)) < 0)) goto usage;
              argc -= 2; argv += 2;
          } else if (!strcmp(flag, "nframes")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((nframes = long(argv[1].a_w.w_float)) < 0)) goto usage;
              argc -= 2; argv += 2;
          } else if (!strcmp(flag, "raw")) {
              if (argc < 5 ||
!                 argv[1].a_type != A_FLOAT || ((headersize = int(argv[1].a_w.w_float)) < 0) ||
!                 argv[2].a_type != A_FLOAT || ((channels = int(argv[2].a_w.w_float)) < 1) ||
                  (channels > MAXSFCHANS) ||
!                 argv[3].a_type != A_FLOAT || ((bytespersamp = int(argv[3].a_w.w_float)) < 2) ||
                      (bytespersamp > 4) ||
                  argv[4].a_type != A_SYMBOL ||
!                     ((endianness = argv[4].a_w.w_symbol->s_name[0]) != 'b' && endianness != 'l' && endianness != 'n'))
                          goto usage;
              if      (endianness == 'b') bigendian = 1;
--- 1324,1344 ----
      int bufframes, nitems;
      FILE *fp;
!     while (argc > 0 && argv->a_type == A_SYMBOL && *argv->a_symbol->s_name == '-') {
!         char *flag = argv->a_symbol->s_name + 1;
          if (!strcmp(flag, "skip")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((skipframes = long(argv[1].a_float)) < 0)) goto usage;
              argc -= 2; argv += 2;
          } else if (!strcmp(flag, "nframes")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((nframes = long(argv[1].a_float)) < 0)) goto usage;
              argc -= 2; argv += 2;
          } else if (!strcmp(flag, "raw")) {
              if (argc < 5 ||
!                 argv[1].a_type != A_FLOAT || ((headersize = int(argv[1].a_float)) < 0) ||
!                 argv[2].a_type != A_FLOAT || ((channels = int(argv[2].a_float)) < 1) ||
                  (channels > MAXSFCHANS) ||
!                 argv[3].a_type != A_FLOAT || ((bytespersamp = int(argv[3].a_float)) < 2) ||
                      (bytespersamp > 4) ||
                  argv[4].a_type != A_SYMBOL ||
!                     ((endianness = argv[4].a_symbol->s_name[0]) != 'b' && endianness != 'l' && endianness != 'n'))
                          goto usage;
              if      (endianness == 'b') bigendian = 1;
***************
*** 1355,1359 ****
              argc -= 1; argv += 1;
          } else if (!strcmp(flag, "maxsize")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((maxsize = long(argv[1].a_w.w_float)) < 0)) goto usage;
              resize = 1;     /* maxsize implies resize. */
              argc -= 2; argv += 2;
--- 1350,1354 ----
              argc -= 1; argv += 1;
          } else if (!strcmp(flag, "maxsize")) {
!             if (argc < 2 || argv[1].a_type != A_FLOAT || ((maxsize = long(argv[1].a_float)) < 0)) goto usage;
              resize = 1;     /* maxsize implies resize. */
              argc -= 2; argv += 2;
***************
*** 1361,1374 ****
      }
      if (argc < 2 || argc > MAXSFCHANS + 1 || argv[0].a_type != A_SYMBOL) goto usage;
!     filename = argv[0].a_w.w_symbol->s_name;
      argc--; argv++;
      for (i = 0; i < argc; i++) {
          int vecsize;
          if (argv[i].a_type != A_SYMBOL) goto usage;
!         if (!(garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_w.w_symbol, garray_class))) {
!             pd_error(x, "%s: no such table", argv[i].a_w.w_symbol->s_name);
              goto done;
          } else if (!garray_getfloatarray(garrays[i], &vecsize, &vecs[i]))
!             error("%s: bad template for tabwrite", argv[i].a_w.w_symbol->s_name);
          if (finalsize && finalsize != vecsize && !resize) {
              post("soundfiler_read: arrays have different lengths; resizing...");
--- 1356,1369 ----
      }
      if (argc < 2 || argc > MAXSFCHANS + 1 || argv[0].a_type != A_SYMBOL) goto usage;
!     filename = argv[0].a_symbol->s_name;
      argc--; argv++;
      for (i = 0; i < argc; i++) {
          int vecsize;
          if (argv[i].a_type != A_SYMBOL) goto usage;
!         if (!(garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_symbol, garray_class))) {
!             pd_error(x, "%s: no such table", argv[i].a_symbol->s_name);
              goto done;
          } else if (!garray_getfloatarray(garrays[i], &vecsize, &vecs[i]))
!             error("%s: bad template for tabwrite", argv[i].a_symbol->s_name);
          if (finalsize && finalsize != vecsize && !resize) {
              post("soundfiler_read: arrays have different lengths; resizing...");
***************
*** 1473,1482 ****
          int vecsize;
          if (argv[i].a_type != A_SYMBOL) goto usage;
!         if (!(garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_w.w_symbol, garray_class))) {
!             pd_error(obj, "%s: no such table", argv[i].a_w.w_symbol->s_name);
              goto fail;
          }
          else if (!garray_getfloatarray(garrays[i], &vecsize, &vecs[i]))
!             error("%s: bad template for tabwrite", argv[i].a_w.w_symbol->s_name);
          if (nframes > vecsize - onset)
              nframes = vecsize - onset;
--- 1468,1477 ----
          int vecsize;
          if (argv[i].a_type != A_SYMBOL) goto usage;
!         if (!(garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_symbol, garray_class))) {
!             pd_error(obj, "%s: no such table", argv[i].a_symbol->s_name);
              goto fail;
          }
          else if (!garray_getfloatarray(garrays[i], &vecsize, &vecs[i]))
!             error("%s: bad template for tabwrite", argv[i].a_symbol->s_name);
          if (nframes > vecsize - onset)
              nframes = vecsize - onset;
***************
*** 1546,1550 ****
      class_addmethod(soundfiler_class, (t_method)soundfiler_t_resize_addq, gensym("resize"), A_GIMME, 0);
      class_addmethod(soundfiler_class, (t_method)soundfiler_t_const_addq,  gensym("const"), A_GIMME, 0);
! else
      class_addmethod(soundfiler_class, (t_method)soundfiler_read, gensym("read"), A_GIMME, 0);
  #endif /* THREADED_SF */
--- 1541,1545 ----
      class_addmethod(soundfiler_class, (t_method)soundfiler_t_resize_addq, gensym("resize"), A_GIMME, 0);
      class_addmethod(soundfiler_class, (t_method)soundfiler_t_const_addq,  gensym("const"), A_GIMME, 0);
! #else
      class_addmethod(soundfiler_class, (t_method)soundfiler_read, gensym("read"), A_GIMME, 0);
  #endif /* THREADED_SF */
***************
*** 1775,1789 ****
              }
              sfread_cond_signal(&x->answercondition);
!         } else if (x->requestcode == REQUEST_CLOSE) {
!             if (x->fd >= 0) {
!                 fd = x->fd;
!                 pthread_mutex_unlock(&x->mutex);
!                 close (fd);
!                 pthread_mutex_lock(&x->mutex);
!                 x->fd = -1;
!             }
!             if (x->requestcode == REQUEST_CLOSE) x->requestcode = REQUEST_NOTHING;
!             sfread_cond_signal(&x->answercondition);
!         } else if (x->requestcode == REQUEST_QUIT) {
              if (x->fd >= 0) {
                  fd = x->fd;
--- 1770,1774 ----
              }
              sfread_cond_signal(&x->answercondition);
!         } else if (x->requestcode == REQUEST_CLOSE || x->requestcode == REQUEST_QUIT) {
              if (x->fd >= 0) {
                  fd = x->fd;
***************
*** 1795,1800 ****
              x->requestcode = REQUEST_NOTHING;
              sfread_cond_signal(&x->answercondition);
-             break;
          }
      }
      pthread_mutex_unlock(&x->mutex);
--- 1780,1785 ----
              x->requestcode = REQUEST_NOTHING;
              sfread_cond_signal(&x->answercondition);
          }
+         if (x->requestcode == REQUEST_QUIT) break;
      }
      pthread_mutex_unlock(&x->mutex);
***************
*** 1952,1958 ****
      int i, noutlets = x->noutlets;
      pthread_mutex_lock(&x->mutex);
!     x->vecsize = sp[0]->s_n;
      x->sigperiod = (x->fifosize / (x->bytespersample * x->sfchannels * x->vecsize));
!     for (i = 0; i < noutlets; i++) x->outvec[i] = sp[i]->s_vec;
      pthread_mutex_unlock(&x->mutex);
      dsp_add(readsf_perform, 1, x);
--- 1937,1943 ----
      int i, noutlets = x->noutlets;
      pthread_mutex_lock(&x->mutex);
!     x->vecsize = sp[0]->n;
      x->sigperiod = (x->fifosize / (x->bytespersample * x->sfchannels * x->vecsize));
!     for (i = 0; i < noutlets; i++) x->outvec[i] = sp[i]->v;
      pthread_mutex_unlock(&x->mutex);
      dsp_add(readsf_perform, 1, x);
***************
*** 2063,2068 ****
              x->swap = garray_ambigendian() != bigendian;
              /* in a loop, wait for the fifo to have data and write it to disk */
!             while (x->requestcode == REQUEST_BUSY || (x->requestcode == REQUEST_CLOSE &&
!                     x->fifohead != x->fifotail)) {
                  int fifosize = x->fifosize, fifotail;
                  char *buf = x->buf;
--- 2048,2052 ----
              x->swap = garray_ambigendian() != bigendian;
              /* in a loop, wait for the fifo to have data and write it to disk */
!             while (x->requestcode == REQUEST_BUSY || (x->requestcode == REQUEST_CLOSE && x->fifohead != x->fifotail)) {
                  int fifosize = x->fifosize, fifotail;
                  char *buf = x->buf;
***************
*** 2071,2081 ****
                     writing until there are at least WRITESIZE bytes in the
                     buffer */
!                 if (x->fifohead < x->fifotail ||
!                     x->fifohead >= x->fifotail + WRITESIZE
!                     || (x->requestcode == REQUEST_CLOSE &&
!                         x->fifohead != x->fifotail))
                  {
!                     writebytes = (x->fifohead < x->fifotail ?
!                         fifosize : x->fifohead) - x->fifotail;
                      if (writebytes > READSIZE)
                          writebytes = READSIZE;
--- 2055,2062 ----
                     writing until there are at least WRITESIZE bytes in the
                     buffer */
!                 if (x->fifohead < x->fifotail || x->fifohead >= x->fifotail + WRITESIZE
!                     || (x->requestcode == REQUEST_CLOSE && x->fifohead != x->fifotail))
                  {
!                     writebytes = (x->fifohead < x->fifotail ? fifosize : x->fifohead) - x->fifotail;
                      if (writebytes > READSIZE)
                          writebytes = READSIZE;
***************
*** 2095,2100 ****
                  else {
                      x->fifotail += sysrtn;
!                     if (x->fifotail == fifosize)
!                         x->fifotail = 0;
                  }
                  x->itemswritten += sysrtn / (x->bytespersample * x->sfchannels);
--- 2076,2080 ----
                  else {
                      x->fifotail += sysrtn;
!                     if (x->fifotail == fifosize) x->fifotail = 0;
                  }
                  x->itemswritten += sysrtn / (x->bytespersample * x->sfchannels);
***************
*** 2103,2107 ****
              }
          } else if (x->requestcode == REQUEST_CLOSE || x->requestcode == REQUEST_QUIT) {
-             int quit = (x->requestcode == REQUEST_QUIT);
              if (x->fd >= 0) {
                  int bytesperframe = x->bytespersample * x->sfchannels;
--- 2083,2086 ----
***************
*** 2119,2124 ****
              x->requestcode = REQUEST_NOTHING;
              sfread_cond_signal(&x->answercondition);
-             if (quit) break;
          }
      }
      pthread_mutex_unlock(&x->mutex);
--- 2098,2103 ----
              x->requestcode = REQUEST_NOTHING;
              sfread_cond_signal(&x->answercondition);
          }
+         if (x->requestcode == REQUEST_QUIT) break;
      }
      pthread_mutex_unlock(&x->mutex);
***************
*** 2140,2144 ****
      if (!buf) return 0;
      x = (t_writesf *)pd_new(writesf_class);
!     for (i = 1; i < nchannels; i++) inlet_new(x,&x->ob_pd, &s_signal, &s_signal);
      x->f = 0;
      x->sfchannels = nchannels;
--- 2119,2123 ----
      if (!buf) return 0;
      x = (t_writesf *)pd_new(writesf_class);
!     for (i = 1; i < nchannels; i++) inlet_new(x,x, &s_signal, &s_signal);
      x->f = 0;
      x->sfchannels = nchannels;
***************
*** 2244,2248 ****
      else x->samplerate = sys_getsr();
      /* set fifosize from bufsize.  fifosize must be a multiple of the number of bytes eaten for each DSP tick.  */
!     x->fifosize = x->bufsize - (x->bufsize % (x->bytespersample * x->sfchannels * MAXVECSIZE));
      /* arrange for the "request" condition to be signalled 16 times per buffer */
      x->sigcountdown = x->sigperiod = x->fifosize / (16 * x->bytespersample * x->sfchannels * x->vecsize);
--- 2223,2227 ----
      else x->samplerate = sys_getsr();
      /* set fifosize from bufsize.  fifosize must be a multiple of the number of bytes eaten for each DSP tick.  */
!     x->fifosize = x->bufsize - x->bufsize % (x->bytespersample * x->sfchannels * MAXVECSIZE);
      /* arrange for the "request" condition to be signalled 16 times per buffer */
      x->sigcountdown = x->sigperiod = x->fifosize / (16 * x->bytespersample * x->sfchannels * x->vecsize);
***************
*** 2252,2261 ****
  
  static void writesf_dsp(t_writesf *x, t_signal **sp) {
!     int i, ninlets = x->sfchannels;
      pthread_mutex_lock(&x->mutex);
!     x->vecsize = sp[0]->s_n;
!     x->sigperiod = (x->fifosize / (x->bytespersample * ninlets * x->vecsize));
!     for (i = 0; i < ninlets; i++) x->outvec[i] = sp[i]->s_vec;
!     x->insamplerate = sp[0]->s_sr;
      pthread_mutex_unlock(&x->mutex);
      dsp_add(writesf_perform, 1, x);
--- 2231,2240 ----
  
  static void writesf_dsp(t_writesf *x, t_signal **sp) {
!     int ninlets = x->sfchannels;
      pthread_mutex_lock(&x->mutex);
!     x->vecsize = sp[0]->n;
!     x->sigperiod = x->fifosize / (x->bytespersample * ninlets * x->vecsize);
!     for (int i=0; i<ninlets; i++) x->outvec[i] = sp[i]->v;
!     x->insamplerate = sp[0]->sr;
      pthread_mutex_unlock(&x->mutex);
      dsp_add(writesf_perform, 1, x);





More information about the Pd-cvs mailing list