[PD-cvs] pd/src d_soundfile.c, 1.4.4.11.2.10.2.16, 1.4.4.11.2.10.2.17

Mathieu Bouchard matju at users.sourceforge.net
Thu Jul 19 04:43:36 CEST 2007


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

Modified Files:
      Tag: desiredata
	d_soundfile.c 
Log Message:
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.16
retrieving revision 1.4.4.11.2.10.2.17
diff -C2 -d -r1.4.4.11.2.10.2.16 -r1.4.4.11.2.10.2.17
*** d_soundfile.c	19 Jul 2007 01:30:16 -0000	1.4.4.11.2.10.2.16
--- d_soundfile.c	19 Jul 2007 02:43:33 -0000	1.4.4.11.2.10.2.17
***************
*** 403,412 ****
              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;
! 	} else if (!strcmp(flag, "wave"))      {filetype = FORMAT_WAVE; argc -= 1; argv += 1;
!         } else if (!strcmp(flag, "nextstep"))  {filetype = FORMAT_NEXT; argc -= 1; argv += 1;
!         } else if (!strcmp(flag, "aiff"))      {filetype = FORMAT_AIFF; argc -= 1; argv += 1;
!         } else if (!strcmp(flag, "big"))       {endianness = 1; argc -= 1; argv += 1;
!         } 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;
--- 403,412 ----
              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--; argv++;
! 	} else if (!strcmp(flag, "wave"))      {filetype = FORMAT_WAVE; argc--; argv++;
!         } else if (!strcmp(flag, "nextstep"))  {filetype = FORMAT_NEXT; argc--; argv++;
!         } else if (!strcmp(flag, "aiff"))      {filetype = FORMAT_AIFF; argc--; argv++;
!         } else if (!strcmp(flag, "big"))       {endianness = 1; argc--; argv++;
!         } else if (!strcmp(flag, "little"))    {endianness = 0; argc--; argv++;
          } 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;
***************
*** 460,475 ****
  }
  
  static int create_soundfile(t_canvas *canvas, const char *filename, int filetype, int nframes, int bytespersamp,
  int bigendian, int nchannels, int swap, float samplerate) {
      char filenamebuf[MAXPDSTRING];
      char headerbuf[WRITEHDRSIZE];
-     t_wave *wavehdr = (t_wave *)headerbuf;
-     t_nextstep *nexthdr = (t_nextstep *)headerbuf;
-     t_aiff *aiffhdr = (t_aiff *)headerbuf;
      int fd, headersize = 0;
      strncpy(filenamebuf, filename, MAXPDSTRING-10);
      filenamebuf[MAXPDSTRING-10] = 0;
      if (filetype == FORMAT_NEXT) {
!         if (strcasecmp(filenamebuf + strlen(filenamebuf)-4, ".snd")) strcat(filenamebuf, ".snd");
          if (bigendian) strncpy(nexthdr->fileid, bigendian?".snd":"dns.", 4);
          nexthdr->onset = swap4(sizeof(*nexthdr), swap);
--- 460,475 ----
  }
  
+ static bool strcaseends(const char *a, const char *b) {return strcasecmp(a+strlen(a)-strlen(b),b)==0;}
+ 
  static int create_soundfile(t_canvas *canvas, const char *filename, int filetype, int nframes, int bytespersamp,
  int bigendian, int nchannels, int swap, float samplerate) {
      char filenamebuf[MAXPDSTRING];
      char headerbuf[WRITEHDRSIZE];
      int fd, headersize = 0;
      strncpy(filenamebuf, filename, MAXPDSTRING-10);
      filenamebuf[MAXPDSTRING-10] = 0;
      if (filetype == FORMAT_NEXT) {
!         t_nextstep *nexthdr = (t_nextstep *)headerbuf;
!         if (!strcaseends(filenamebuf,".snd")) strcat(filenamebuf, ".snd");
          if (bigendian) strncpy(nexthdr->fileid, bigendian?".snd":"dns.", 4);
          nexthdr->onset = swap4(sizeof(*nexthdr), swap);
***************
*** 485,490 ****
          long longtmp;
          static unsigned char dogdoo[] = {0x40, 0x0e, 0xac, 0x44, 0, 0, 0, 0, 0, 0, 'S', 'S', 'N', 'D'};
!         if (strcasecmp(filenamebuf + strlen(filenamebuf)-4, ".aif") &&
!             strcasecmp(filenamebuf + strlen(filenamebuf)-5, ".aiff"))
                  strcat(filenamebuf, ".aif");
          strncpy(aiffhdr->fileid, "FORM", 4);
--- 485,490 ----
          long longtmp;
          static unsigned char dogdoo[] = {0x40, 0x0e, 0xac, 0x44, 0, 0, 0, 0, 0, 0, 'S', 'S', 'N', 'D'};
!         t_aiff *aiffhdr = (t_aiff *)headerbuf;
!         if (!strcaseends(filenamebuf,".aif") && !strcaseends(filenamebuf,".aiff"))
                  strcat(filenamebuf, ".aif");
          strncpy(aiffhdr->fileid, "FORM", 4);
***************
*** 502,506 ****
          memset(aiffhdr->samprate + sizeof(dogdoo) + 4, 0, 8);
          headersize = AIFFPLUS;
- 
  	/* fix by matju for häfeli, 2007.07.04, but really, dogdoo should be removed */
  	while (samplerate >= 0x10000) {aiffhdr->samprate[1]++; samplerate/=2;}
--- 502,505 ----
***************
*** 509,513 ****
      } else {   /* WAVE format */
          long datasize = nframes * nchannels * bytespersamp;
!         if (strcasecmp(filenamebuf + strlen(filenamebuf)-4, ".wav")) strcat(filenamebuf, ".wav");
          strncpy(wavehdr->fileid, "RIFF", 4);
          wavehdr->chunksize = swap4(datasize + sizeof(*wavehdr) - 8, swap);
--- 508,513 ----
      } else {   /* WAVE format */
          long datasize = nframes * nchannels * bytespersamp;
!         if (!strcaseends(filenamebuf,".wav")) strcat(filenamebuf, ".wav");
!         t_wave *wavehdr = (t_wave *)headerbuf;
          strncpy(wavehdr->fileid, "RIFF", 4);
          wavehdr->chunksize = swap4(datasize + sizeof(*wavehdr) - 8, swap);
***************
*** 525,529 ****
          headersize = sizeof(t_wave);
      }
- 
      char *buf2 = canvas_makefilename(canvas, filenamebuf,0,0);
      sys_bashfilename(buf2,buf2);
--- 525,528 ----
***************
*** 581,585 ****
      float *fp;
      int bytesperframe = bytespersamp * nchannels;
-     long xx;
      for (i = 0, sp = buf; i < nchannels; i++, sp += bytespersamp) {
          sp2 = sp; fp = vecs[i] + onset;
--- 580,583 ----
***************
*** 588,601 ****
              if (bigendian) {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     int xx = int(32768. + (*fp * ff)) - 0x8000;
!                     if (xx < -0x7fff) xx = -0x7fff;
!                     if (xx > +0x7fff) xx = +0x7fff;
                      sp2[0] = xx>>8; sp2[1] = xx;
                  }
              } else {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     int xx = int(32768. + (*fp * ff)) - 0x8000;
!                     if (xx < -0x7fff) xx = -0x7fff;
!                     if (xx > +0x7fff) xx = +0x7fff;
                      sp2[1] = xx>>8; sp2[0] = xx;
                  }
--- 586,595 ----
              if (bigendian) {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     int xx = clip(int(32768. + (*fp * ff)) - 0x8000,-0x7fff,+0x7fff);
                      sp2[0] = xx>>8; sp2[1] = xx;
                  }
              } else {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     int xx = clip(int(32768. + (*fp * ff)) - 0x8000,-0x7fff,+0x7fff);
                      sp2[1] = xx>>8; sp2[0] = xx;
                  }
***************
*** 605,618 ****
              if (bigendian) {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     int xx = int(8388608. + (*fp * ff)) - 0x800000;
!                     if (xx < -0x7fffff) xx = -0x7fffff;
!                     if (xx > +0x7fffff) xx = +0x7fffff;
                      sp2[0] = xx>>16; sp2[1] = xx>>8; sp2[2] = xx;
                  }
              } else {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     int xx = int(8388608. + (*fp * ff)) - 0x800000;
!                     if (xx < -0x7fffff) xx = -0x7fffff;
!                     if (xx > +0x7fffff) xx = +0x7fffff;
                      sp2[2] = xx>>16; sp2[1] = xx>>8; sp2[0] = xx;
                  }
--- 599,608 ----
              if (bigendian) {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     int xx = clip(int(8388608. + (*fp * ff)) - 0x800000,-0x7fffff,+0x7fffff);
                      sp2[0] = xx>>16; sp2[1] = xx>>8; sp2[2] = xx;
                  }
              } else {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     int xx = clip(int(8388608. + (*fp * ff)) - 0x800000,-0x7fffff,+0x7fffff);
                      sp2[2] = xx>>16; sp2[1] = xx>>8; sp2[0] = xx;
                  }
***************
*** 621,632 ****
              if (bigendian) {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     float f2 = *fp * normalfactor;
!                     xx = *(long *)&f2;
                      sp2[0] = xx >> 24; sp2[1] = xx >> 16; sp2[2] = xx >> 8; sp2[3] = xx;
                  }
              } else {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     float f2 = *fp * normalfactor;
!                     xx = *(long *)&f2;
                      sp2[3] = xx >> 24; sp2[2] = xx >> 16; sp2[1] = xx >> 8; sp2[0] = xx;
                  }
--- 611,620 ----
              if (bigendian) {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     float f2 = *fp * normalfactor; long xx = *(long *)&f2;
                      sp2[0] = xx >> 24; sp2[1] = xx >> 16; sp2[2] = xx >> 8; sp2[3] = xx;
                  }
              } else {
                  for (j = 0; j < nitems; j++, sp2 += bytesperframe, fp++) {
!                     float f2 = *fp * normalfactor; long xx = *(long *)&f2;
                      sp2[3] = xx >> 24; sp2[2] = xx >> 16; sp2[1] = xx >> 8; sp2[0] = xx;
                  }
***************
*** 801,805 ****
  static t_int soundfiler_read_output(t_int * w);
  
- 
  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;
--- 789,792 ----
***************
*** 833,838 ****
  				(bytespersamp > 4) ||
  				argv[4].a_type != A_SYMBOL ||
! 				((endianness = argv[4].a_symbol->name[0]) != 'b'
! 				 && endianness != 'l' && endianness != 'n'))
  				goto usage;
  			if      (endianness == 'b') bigendian = 1;
--- 820,824 ----
  				(bytespersamp > 4) ||
  				argv[4].a_type != A_SYMBOL ||
! 				((endianness = argv[4].a_symbol->name[0]) != 'b' && endianness != 'l' && endianness != 'n'))
  				goto usage;
  			if      (endianness == 'b') bigendian = 1;
***************
*** 871,875 ****
      	goto done;
      }
- 
      if (resize) {
  	/* figure out what to resize to */
--- 857,860 ----
***************
*** 911,916 ****
  				goto done;
  			}
- 			/* zero samples */
- 			if(i > channels) memset(nvecs[i],0,vecsize[i] * sizeof(t_float));
  		}
  	else
--- 896,899 ----
***************
*** 924,930 ****
  				goto done;
  			}
- 			/* zero samples */
- 			if(i > channels) memset(nvecs[i],0,vecsize[i] * sizeof(t_float));
  		}
  	if (debug) post("transfer soundfile");
  	for (itemsread = 0; itemsread < finalsize; ) {
--- 907,912 ----
  				goto done;
  			}
  		}
+ 	if(i > channels) memset(nvecs[i],0,vecsize[i] * sizeof(t_float));
  	if (debug) post("transfer soundfile");
  	for (itemsread = 0; itemsread < finalsize; ) {
***************
*** 1018,1023 ****
  }
  
! /* this is broken out from soundfiler_write below so garray_write can
!    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;
--- 1000,1004 ----
  }
  
! /* this is broken out from soundfiler_write below so garray_write can 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;
***************
*** 1117,1121 ****
      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)) {
--- 1098,1101 ----
***************
*** 1621,1625 ****
              fd = open_soundfile(dirname, filename, skipheaderbytes, &bytespersample, &bigendian, &sfchannels, &bytelimit, onsetframes);
              pthread_mutex_lock(&x->mutex);
- 
              /* copy back into the instance structure. */
              x->bytespersample = bytespersample;
--- 1601,1604 ----
***************
*** 1633,1637 ****
                  goto lost;
              }
!                 /* check if another request has been made; if so, field it */
              if (x->requestcode != REQUEST_BUSY) goto lost;
              x->fifohead = 0;
--- 1612,1616 ----
                  goto lost;
              }
!             /* check if another request has been made; if so, field it */
              if (x->requestcode != REQUEST_BUSY) goto lost;
              x->fifohead = 0;
***************
*** 1643,1657 ****
              x->sigcountdown = x->sigperiod = x->fifosize / (16 * x->bytespersample * x->sfchannels * x->vecsize);
              /* in a loop, wait for the fifo to get hungry and feed it */
- 
              while (x->requestcode == REQUEST_BUSY) {
                  int fifosize = x->fifosize;
                  if (x->eof) break;
                  if (x->fifohead >= x->fifotail) {
!                         /* if the head is >= the tail, we can immediately read
!                         to the end of the fifo.  Unless, that is, we would
!                         read all the way to the end of the buffer and the
!                         "tail" is zero; this would fill the buffer completely
!                         which isn't allowed because you can't tell a completely
!                         full buffer from an empty one. */
                      if (x->fifotail || (fifosize - x->fifohead > READSIZE)) {
                          wantbytes = fifosize - x->fifohead;
--- 1622,1632 ----
              x->sigcountdown = x->sigperiod = x->fifosize / (16 * x->bytespersample * x->sfchannels * x->vecsize);
              /* in a loop, wait for the fifo to get hungry and feed it */
              while (x->requestcode == REQUEST_BUSY) {
                  int fifosize = x->fifosize;
                  if (x->eof) break;
                  if (x->fifohead >= x->fifotail) {
!                         /* if the head is >= the tail, we can immediately read to the end of the fifo. Unless, that is, we
!                            would read all the way to the end of the buffer and the "tail" is zero; this would fill the buffer completely
!                            which isn't allowed because you can't tell a completely full buffer from an empty one. */
                      if (x->fifotail || (fifosize - x->fifohead > READSIZE)) {
                          wantbytes = fifosize - x->fifohead;
***************
*** 1666,1671 ****
                      }
                  } else {
!                         /* otherwise check if there are at least READSIZE
!                         bytes to read.  If not, wait and loop back. */
                      wantbytes = x->fifotail - x->fifohead - 1;
                      if (wantbytes < READSIZE) {
--- 1641,1645 ----
                      }
                  } else {
!                     /* otherwise check if there are at least READSIZE bytes to read.  If not, wait and loop back. */
                      wantbytes = x->fifotail - x->fifohead - 1;
                      if (wantbytes < READSIZE) {
***************
*** 1728,1734 ****
  
  static void *readsf_new(t_floatarg fnchannels, t_floatarg fbufsize) {
!     t_readsf *x;
!     int nchannels = int(fnchannels), bufsize = int(fbufsize), i;
!     char *buf;
      if (nchannels < 1) nchannels = 1;
      else if (nchannels > MAXSFCHANS) nchannels = MAXSFCHANS;
--- 1702,1706 ----
  
  static void *readsf_new(t_floatarg fnchannels, t_floatarg fbufsize) {
!     int nchannels = int(fnchannels), bufsize = int(fbufsize);
      if (nchannels < 1) nchannels = 1;
      else if (nchannels > MAXSFCHANS) nchannels = MAXSFCHANS;
***************
*** 1736,1743 ****
      else if (bufsize < MINBUFSIZE) bufsize = MINBUFSIZE;
      else if (bufsize > MAXBUFSIZE) bufsize = MAXBUFSIZE;
!     buf = (char *)getbytes(bufsize);
      if (!buf) return 0;
!     x = (t_readsf *)pd_new(readsf_class);
!     for (i = 0; i < nchannels; i++) outlet_new(x,gensym("signal"));
      x->noutlets = nchannels;
      x->bangout = outlet_new(x,&s_bang);
--- 1708,1715 ----
      else if (bufsize < MINBUFSIZE) bufsize = MINBUFSIZE;
      else if (bufsize > MAXBUFSIZE) bufsize = MAXBUFSIZE;
!     char *buf = (char *)getbytes(bufsize);
      if (!buf) return 0;
!     t_readsf *x = (t_readsf *)pd_new(readsf_class);
!     for (int i=0; i<nchannels; i++) outlet_new(x,gensym("signal"));
      x->noutlets = nchannels;
      x->bangout = outlet_new(x,&s_bang);
***************
*** 1774,1778 ****
          }
          if (x->eof && x->fifohead >= x->fifotail && x->fifohead < x->fifotail + wantbytes-1) {
-             int xfersize;
              if (x->fileerror) {
                  pd_error(x, "dsp: %s: %s", x->filename,
--- 1746,1749 ----
***************
*** 1782,1786 ****
              x->state = STATE_IDLE;
              /* if there's a partial buffer left, copy it out. */
!             xfersize = (x->fifohead - x->fifotail + 1) / (sfchannels * bytespersample);
              if (xfersize) {
                  soundfile_xferin(sfchannels, noutlets, x->outvec, 0,
--- 1753,1757 ----
              x->state = STATE_IDLE;
              /* if there's a partial buffer left, copy it out. */
!             int xfersize = (x->fifohead - x->fifotail + 1) / (sfchannels * bytespersample);
              if (xfersize) {
                  soundfile_xferin(sfchannels, noutlets, x->outvec, 0,





More information about the Pd-cvs mailing list