Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21108
Modified Files:
Tag: desiredata
d_soundfile.c
Log Message:
cleanup; added macros EAT_ARG and LOOP
Index: d_soundfile.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/d_soundfile.c,v
retrieving revision 1.4.4.11.2.10.2.19
retrieving revision 1.4.4.11.2.10.2.20
diff -C2 -d -r1.4.4.11.2.10.2.19 -r1.4.4.11.2.10.2.20
*** d_soundfile.c 19 Jul 2007 03:02:07 -0000 1.4.4.11.2.10.2.19
--- d_soundfile.c 19 Jul 2007 04:24:20 -0000 1.4.4.11.2.10.2.20
***************
*** 42,45 ****
--- 42,47 ----
static bool debug=0;
+ #define EAT_ARG(ATYPE,VAR) if (argc<1 || argv->a_type != ATYPE) goto usage; else {VAR = *argv++; argc--;}
+
/***************** soundfile header structures ************************/
***************
*** 333,337 ****
long itemsread, unsigned char *buf, int nitems, int bytespersamp, int bigendian) {
unsigned char *sp, *sp2;
- float *fp;
int nchannels = (sfchannels < nvecs ? sfchannels : nvecs);
int bytesperframe = bytespersamp * sfchannels;
--- 335,338 ----
***************
*** 340,367 ****
int j;
sp2=sp;
! fp=vecs[i] + itemsread;
if (bytespersamp == 2) {
! if (bigendian) {
! for (j=0; j<nitems; j++, sp2 += bytesperframe, fp++) *fp = SCALE * ((sp2[0]<<24) | (sp2[1]<<16));
! } else {
! for (j=0; j<nitems; j++, sp2 += bytesperframe, fp++) *fp = SCALE * ((sp2[1]<<24) | (sp2[0]<<16));
! }
} else if (bytespersamp == 3) {
! if (bigendian) {
! for (j=0; j<nitems; j++, sp2 += bytesperframe, fp++) *fp = SCALE * ((sp2[0]<<24) | (sp2[1]<<16) | (sp2[2]<<8));
! } else {
! for (j=0; j<nitems; j++, sp2 += bytesperframe, fp++) *fp = SCALE * ((sp2[2]<<24) | (sp2[1]<<16) | (sp2[0]<<8));
! }
} else if (bytespersamp == 4) {
! if (bigendian) {
! for (j=0; j<nitems; j++, sp2 += bytesperframe, fp++) *(long *)fp = (sp2[0]<<24) | (sp2[1]<<16) | (sp2[2]<<8) | sp2[3];
! } else {
! for (j=0; j<nitems; j++, sp2 += bytesperframe, fp++) *(long *)fp = (sp2[3]<<24) | (sp2[2]<<16) | (sp2[1]<<8) | sp2[0];
! }
}
}
/* zero out other outputs */
for (int i=sfchannels; i < nvecs; i++) {
! fp=vecs[i];
for (int j=nitems; j--; ) *fp++ = 0;
}
--- 341,361 ----
int j;
sp2=sp;
! float *fp=vecs[i] + itemsread;
! #define LOOP for (j=0; j<nitems; j++, sp2 += bytesperframe, fp++)
if (bytespersamp == 2) {
! if (bigendian) LOOP {*fp = SCALE * ((sp2[0]<<24) | (sp2[1]<<16));}
! else LOOP {*fp = SCALE * ((sp2[1]<<24) | (sp2[0]<<16));}
} else if (bytespersamp == 3) {
! if (bigendian) LOOP {*fp = SCALE * ((sp2[0]<<24) | (sp2[1]<<16) | (sp2[2]<<8));}
! else LOOP {*fp = SCALE * ((sp2[2]<<24) | (sp2[1]<<16) | (sp2[0]<<8));}
} else if (bytespersamp == 4) {
! if (bigendian) LOOP {*(long *)fp = (sp2[0]<<24) | (sp2[1]<<16) | (sp2[2]<<8) | sp2[3];}
! else LOOP {*(long *)fp = (sp2[3]<<24) | (sp2[2]<<16) | (sp2[1]<<8) | sp2[0];}
}
+ #undef LOOP
}
/* zero out other outputs */
for (int i=sfchannels; i < nvecs; i++) {
! float *fp=vecs[i];
for (int j=nitems; j--; ) *fp++ = 0;
}
***************
*** 370,382 ****
/* soundfiler_write ...
usage: write [flags] filename table ...
! flags:
! -nframes <frames>
! -skip <frames>
! -bytes <bytes per sample>
! -normalize
! -nextstep
! -wave
! -big
! -little
the routine which actually does the work should LATER also be called from garray_write16.
Parse arguments for writing. The "obj" argument is only for flagging
--- 364,368 ----
/* soundfiler_write ...
usage: write [flags] filename table ...
! flags: -nframes <frames> -skip <frames> -bytes <bytes per sample> -normalize -nextstep -wave -big -little
the routine which actually does the work should LATER also be called from garray_write16.
Parse arguments for writing. The "obj" argument is only for flagging
***************
*** 396,407 ****
argc--; argv++;
if (!strcmp(flag, "skip")) {
! if (argc < 1 || argv[0].a_type != A_FLOAT || ((onset = (long) argv[0].a_float) < 0)) goto usage;
! argc--; argv++;
} else if (!strcmp(flag, "nframes")) {
! if (argc < 1 || argv[0].a_type != A_FLOAT || ((nframes = (long) argv[0].a_float) < 0)) goto usage;
! argc--; argv++;
} else if (!strcmp(flag, "bytes")) {
! if (argc < 1 || argv[0].a_type != A_FLOAT || ((bytespersamp = (int) argv[0].a_float) < 2) || bytespersamp > 4) goto usage;
! argc--; argv++;
} else if (!strcmp(flag, "normalize")) {normalize = 1;
} else if (!strcmp(flag, "wave")) {filetype = FORMAT_WAVE;
--- 382,390 ----
argc--; argv++;
if (!strcmp(flag, "skip")) {
! EAT_ARG(A_FLOAT,onset); if (onset<0) goto usage;
} else if (!strcmp(flag, "nframes")) {
! EAT_ARG(A_FLOAT,nframes); if (nframes<0) goto usage;
} else if (!strcmp(flag, "bytes")) {
! EAT_ARG(A_FLOAT,bytespersamp); if (bytespersamp<2 || bytespersamp>4) goto usage;
} else if (!strcmp(flag, "normalize")) {normalize = 1;
} else if (!strcmp(flag, "wave")) {filetype = FORMAT_WAVE;
***************
*** 411,416 ****
} else if (!strcmp(flag, "little")) {endianness = 0;
} 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--; argv++;
} else goto usage;
}
--- 394,398 ----
} else if (!strcmp(flag, "little")) {endianness = 0;
} else if (!strcmp(flag, "r") || !strcmp(flag, "rate")) {
! EAT_ARG(A_FLOAT,rate); if (rate<0) goto usage;
} else goto usage;
}
***************
*** 577,626 ****
static void soundfile_xferout(int nchannels, float **vecs, unsigned char *buf, int nitems, long onset, int bytespersamp,
int bigendian, float normalfactor) {
! int i, j;
! unsigned char *sp, *sp2;
float *fp;
int bytesperframe = bytespersamp * nchannels;
! for (i = 0, sp = buf; i < nchannels; i++, sp += bytespersamp) {
sp2 = sp; fp = vecs[i] + onset;
if (bytespersamp == 2) {
float ff = normalfactor * 32768.;
! 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;
! }
}
} else if (bytespersamp == 3) {
float ff = normalfactor * 8388608.;
! 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;
! }
}
} else if (bytespersamp == 4) {
! 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;
! }
}
}
}
}
--- 559,597 ----
static void soundfile_xferout(int nchannels, float **vecs, unsigned char *buf, int nitems, long onset, int bytespersamp,
int bigendian, float normalfactor) {
! unsigned char *sp=buf, *sp2;
float *fp;
int bytesperframe = bytespersamp * nchannels;
! #define LOOP for (int j=0; j<nitems; j++, sp2 += bytesperframe, fp++)
! for (int i = 0; i < nchannels; i++, sp += bytespersamp) {
sp2 = sp; fp = vecs[i] + onset;
if (bytespersamp == 2) {
float ff = normalfactor * 32768.;
! if (bigendian) LOOP {
! int xx = clip(int(32768. + (*fp * ff)) - 0x8000,-0x7fff,+0x7fff);
! sp2[0] = xx>>8; sp2[1] = xx;
! } else LOOP {
! int xx = clip(int(32768. + (*fp * ff)) - 0x8000,-0x7fff,+0x7fff);
! sp2[1] = xx>>8; sp2[0] = xx;
}
} else if (bytespersamp == 3) {
float ff = normalfactor * 8388608.;
! if (bigendian) LOOP {
! int xx = clip(int(8388608. + (*fp * ff)) - 0x800000,-0x7fffff,+0x7fffff);
! sp2[0] = xx>>16; sp2[1] = xx>>8; sp2[2] = xx;
! } else LOOP {
! int xx = clip(int(8388608. + (*fp * ff)) - 0x800000,-0x7fffff,+0x7fffff);
! sp2[2] = xx>>16; sp2[1] = xx>>8; sp2[0] = xx;
}
} else if (bytespersamp == 4) {
! if (bigendian) LOOP {
! float f2 = *fp * normalfactor; long xx = *(long *)&f2;
! sp2[0] = xx >> 24; sp2[1] = xx >> 16; sp2[2] = xx >> 8; sp2[3] = xx;
! } else LOOP {
! float f2 = *fp * normalfactor; long xx = *(long *)&f2;
! sp2[3] = xx >> 24; sp2[2] = xx >> 16; sp2[1] = xx >> 8; sp2[0] = xx;
}
}
}
+ #undef LOOP
}
***************
*** 775,796 ****
}
! /* soundfiler_read
! usage: read [flags] filename table ...
! flags:
! -skip <frames> ... frames to skip in file
! -nframes <frames>
! -onset <frames> ... onset in table to read into (NOT DONE YET)
! -raw <headersize channels bytes endian>
! -resize
! -maxsize <max-size>
!
! TB: adapted for threaded use
! */
!
! /* callback prototypes */
! static t_int soundfiler_read_update_garray(t_int * w);
! static t_int soundfiler_read_update_graphics(t_int * w);
! 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;
--- 746,758 ----
}
! /* soundfiler_read
! usage: read [flags] filename table ...
! flags: -skip <frames> ... frames to skip in file
! -nframes <frames> -onset <frames> ... onset in table to read into (NOT DONE YET)
! -raw <headersize channels bytes endian> -resize -maxsize <max-size>
! TB: adapted for threaded use */
! static t_int soundfiler_read_update_garray(t_int *w);
! static t_int soundfiler_read_update_graphics(t_int *w);
! 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;
***************
*** 812,838 ****
argc--; argv++;
if (!strcmp(flag, "skip")) {
! if (argc < 1 || argv[0].a_type != A_FLOAT || ((skipframes = long(argv[0].a_float)) < 0)) goto usage;
! argc--; argv++;
} else if (!strcmp(flag, "nframes")) {
! if (argc < 1 || argv[0].a_type != A_FLOAT || ((nframes = long(argv[0].a_float)) < 0)) goto usage;
! argc--; argv++;
} else if (!strcmp(flag, "raw")) {
! if (argc < 4 ||
! argv[0].a_type != A_FLOAT || ((headersize = int(argv[0].a_float)) < 0) ||
! argv[1].a_type != A_FLOAT || ((channels = int(argv[1].a_float)) < 1) || (channels > MAXSFCHANS) ||
! argv[2].a_type != A_FLOAT || ((bytespersamp = int(argv[2].a_float)) < 2) || (bytespersamp > 4) ||
! argv[3].a_type != A_SYMBOL ||
! ((endianness = argv[3].a_symbol->name[0]) != 'b' && endianness != 'l' && endianness != 'n'))
! goto usage;
! if (endianness == 'b') bigendian = 1;
! else if (endianness == 'l') bigendian = 0;
! else bigendian = garray_ambigendian();
! argc -= 4; argv += 4;
} else if (!strcmp(flag, "resize")) {
! resize = 1;
} else if (!strcmp(flag, "maxsize")) {
! if (argc < 1 || argv[0].a_type != A_FLOAT || ((maxsize = long(argv[0].a_float)) < 0)) goto usage;
! resize = 1; /* maxsize implies resize. */
! argc--; argv++;
} else goto usage;
}
--- 774,793 ----
argc--; argv++;
if (!strcmp(flag, "skip")) {
! EAT_ARG(A_FLOAT,skipframes); if (skipframes<0) goto usage;
} else if (!strcmp(flag, "nframes")) {
! EAT_ARG(A_FLOAT,nframes); if (nframes<0) goto usage;
} else if (!strcmp(flag, "raw")) {
! EAT_ARG(A_FLOAT,headersize); if (headersize<0) goto usage;
! EAT_ARG(A_FLOAT,channels); if (channels<1) goto usage;
! EAT_ARG(A_FLOAT,bytespersamp); if (bytespersamp<2 || bytespersamp>4) goto usage;
! EAT_ARG(A_SYMBOL,endianness); if (endianness!='b' && endianness!='l' && endianness!='n') goto usage;
! if (endianness == 'b') bigendian = 1;
! else if (endianness == 'l') bigendian = 0;
! else bigendian = garray_ambigendian();
} else if (!strcmp(flag, "resize")) {
! resize = 1;
} else if (!strcmp(flag, "maxsize")) {
! EAT_ARG(A_FLOAT,maxsize); if (maxsize<0) goto usage;
! resize = 1; /* maxsize implies resize. */
} else goto usage;
}
***************
*** 842,854 ****
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->name);
! goto done;
! }
! else if (!garray_getfloatarray(garrays[i], &vecsize[i], &vecs[i]))
error("%s: bad template for tabwrite", argv[i].a_symbol->name);
if (finalsize && finalsize != vecsize[i] && !resize) {
! post("soundfiler_read: arrays have different lengths; resizing...");
! resize = 1;
}
finalsize = vecsize[i];
--- 797,809 ----
for (i = 0; i < argc; i++) {
if (argv[i].a_type != A_SYMBOL) goto usage;
! garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_symbol, garray_class);
! if (!garrays[i]) {
! pd_error(x, "%s: no such table", argv[i].a_symbol->name);
! goto done;
! } else if (!garray_getfloatarray(garrays[i], &vecsize[i], &vecs[i]))
error("%s: bad template for tabwrite", argv[i].a_symbol->name);
if (finalsize && finalsize != vecsize[i] && !resize) {
! post("soundfiler_read: arrays have different lengths; resizing...");
! resize = 1;
}
finalsize = vecsize[i];
***************
*** 868,881 ****
framesinfile = (eofis - poswas) / (channels * bytespersamp);
if (framesinfile > maxsize) {
! pd_error(x, "soundfiler_read: truncated to %d elements", maxsize);
! framesinfile = maxsize;
}
! if (framesinfile > bytelimit / (channels * bytespersamp))
! framesinfile = bytelimit / (channels * bytespersamp);
finalsize = framesinfile;
}
if (!finalsize) finalsize = 0x7fffffff;
! if (finalsize > bytelimit / (channels * bytespersamp))
! finalsize = bytelimit / (channels * bytespersamp);
fp = fdopen(fd, "rb");
bufframes = SAMPBUFSIZE / (channels * bytespersamp);
--- 823,834 ----
framesinfile = (eofis - poswas) / (channels * bytespersamp);
if (framesinfile > maxsize) {
! pd_error(x, "soundfiler_read: truncated to %d elements", maxsize);
! framesinfile = maxsize;
}
! framesinfile = min(framesinfile, bytelimit / (channels * bytespersamp));
finalsize = framesinfile;
}
if (!finalsize) finalsize = 0x7fffffff;
! finalsize = min(finalsize, bytelimit / (channels * bytespersamp));
fp = fdopen(fd, "rb");
bufframes = SAMPBUFSIZE / (channels * bytespersamp);
***************
*** 886,956 ****
munlockall();
/* allocate memory for new array */
! 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) {
! pd_error(x, "resize failed");
! /* if the resizing fails, we'll have to free all arrays again */
! for (j=0; j!=i;++j) freealignedbytes (nvecs[i],finalsize * sizeof(t_float));
! goto done;
! }
! }
! 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) {
! pd_error(x, "resize failed");
! /* if the resizing fails, we'll have to free all arrays again */
! for (j=0; j!=i;++j) freealignedbytes (nvecs[i],vecsize[i] * sizeof(t_float));
! goto done;
! }
}
- if(i > channels) memset(nvecs[i],0,vecsize[i] * sizeof(t_float));
- if (debug) post("transfer soundfile");
- for (itemsread = 0; itemsread < finalsize; ) {
- int thisread = finalsize - itemsread;
- thisread = (thisread > bufframes ? bufframes : thisread);
- nitems = fread(sampbuf, channels * bytespersamp, thisread, fp);
- if (nitems <= 0) break;
- soundfile_xferin(channels, argc, nvecs, itemsread, (unsigned char *)sampbuf, nitems, bytespersamp, bigendian);
- itemsread += nitems;
- }
- if (debug) post("zeroing remaining elements");
- /* zero out remaining elements of vectors */
- for (i = 0; i < argc; i++) {
- for (j = itemsread; j < finalsize; j++) nvecs[i][j] = 0;
- }
- /* set idle callback to switch pointers */
- if (debug) post("locked");
- for (i = 0; i < argc; i++) {
- t_int* w = (t_int*)getbytes(4*sizeof(t_int));
- w[0] = (t_int)(garrays[i]);
- w[1] = (t_int)nvecs[i];
- w[2] = (t_int)finalsize;
- w[3] = (t_int)(&resume_after_callback);
- sys_callback(&soundfiler_read_update_garray, w, 4);
- pthread_cond_wait(&resume_after_callback, &resume_after_callback_mutex);
}
! if (debug) post("unlocked, doing graphics updates");
! /* do all graphics updates. run this in the main thread via callback */
! for (i = 0; i < argc; i++) {
! t_int* w = (t_int*)getbytes(2*sizeof(t_int));
! w[0] = (t_int)(garrays[i]);
! w[1] = (t_int)finalsize;
! sys_callback(&soundfiler_read_update_graphics, w, 2);
}
! /* free the old arrays */
! for (i = 0; i < argc; i++) freealignedbytes(vecs[i], vecsize[i] * sizeof(t_float));
!
fclose(fp);
fd = -1;
goto done;
! usage:
pd_error(x, "usage: read [flags] filename tablename...");
post("flags: -skip <n> -nframes <n> -resize -maxsize <n> ...");
post("-raw <headerbytes> <channels> <bytespersamp> <endian (b, l, or n)>.");
! done:
if (fd>=0) close(fd);
mlockall(MCL_FUTURE);
--- 839,906 ----
munlockall();
/* allocate memory for new array */
! if (resize)
! for (int 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) {
! pd_error(x, "resize failed");
! /* if the resizing fails, we'll have to free all arrays again */
! for (j=0; j!=i;++j) freealignedbytes (nvecs[i],finalsize * sizeof(t_float));
! goto done;
}
}
! else
! for (int 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) {
! pd_error(x, "resize failed");
! /* if the resizing fails, we'll have to free all arrays again */
! for (j=0; j!=i;++j) freealignedbytes (nvecs[i],vecsize[i] * sizeof(t_float));
! goto done;
! }
}
! if(i > channels) memset(nvecs[i],0,vecsize[i] * sizeof(t_float));
! if (debug) post("transfer soundfile");
! for (itemsread = 0; itemsread < finalsize; ) {
! int thisread = finalsize - itemsread;
! thisread = (thisread > bufframes ? bufframes : thisread);
! nitems = fread(sampbuf, channels * bytespersamp, thisread, fp);
! if (nitems <= 0) break;
! soundfile_xferin(channels, argc, nvecs, itemsread, (unsigned char *)sampbuf, nitems, bytespersamp, bigendian);
! itemsread += nitems;
! }
! if (debug) post("zeroing remaining elements");
! /* zero out remaining elements of vectors */
! for (int i=0; i<argc; i++) for (int j=itemsread; j<finalsize; j++) nvecs[i][j] = 0;
! /* set idle callback to switch pointers */
! if (debug) post("locked");
! for (int i=0; i<argc; i++) {
! t_int *w = (t_int*)getbytes(4*sizeof(t_int));
! w[0] = (t_int)(garrays[i]);
! w[1] = (t_int)nvecs[i];
! w[2] = (t_int)finalsize;
! w[3] = (t_int)(&resume_after_callback);
! sys_callback(&soundfiler_read_update_garray, w, 4);
! pthread_cond_wait(&resume_after_callback, &resume_after_callback_mutex);
! }
! if (debug) post("unlocked, doing graphics updates");
! /* do all graphics updates. run this in the main thread via callback */
! for (int i=0; i<argc; i++) {
! t_int *w = (t_int*)getbytes(2*sizeof(t_int));
! w[0] = (t_int)(garrays[i]);
! w[1] = (t_int)finalsize;
! sys_callback(&soundfiler_read_update_graphics, w, 2);
! }
! /* free the old arrays */
! for (int i=0; i<argc; i++) freealignedbytes(vecs[i], vecsize[i] * sizeof(t_float));
fclose(fp);
fd = -1;
goto done;
! usage:
pd_error(x, "usage: read [flags] filename tablename...");
post("flags: -skip <n> -nframes <n> -resize -maxsize <n> ...");
post("-raw <headerbytes> <channels> <bytespersamp> <endian (b, l, or n)>.");
! done:
if (fd>=0) close(fd);
mlockall(MCL_FUTURE);
***************
*** 999,1003 ****
/* 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;
long onset, nframes, itemswritten = 0;
t_garray *garrays[MAXSFCHANS];
--- 949,953 ----
/* 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, nchannels;
long onset, nframes, itemswritten = 0;
t_garray *garrays[MAXSFCHANS];
***************
*** 1008,1012 ****
float normfactor, biggest = 0, samplerate;
t_symbol *filesym;
-
if (soundfiler_writeargparse(obj, &argc, &argv, &filesym, &filetype,
&bytespersamp, &swap, &bigendian, &normalize, &onset, &nframes, &samplerate))
--- 958,961 ----
***************
*** 1015,1019 ****
if (nchannels < 1 || nchannels > MAXSFCHANS) goto usage;
if (samplerate < 0) samplerate = sys_getsr();
! for (i = 0; i < nchannels; i++) {
int vecsize;
if (argv[i].a_type != A_SYMBOL) goto usage;
--- 964,968 ----
if (nchannels < 1 || nchannels > MAXSFCHANS) goto usage;
if (samplerate < 0) samplerate = sys_getsr();
! for (int i=0; i<nchannels; i++) {
int vecsize;
if (argv[i].a_type != A_SYMBOL) goto usage;
***************
*** 1026,1030 ****
if (nframes > vecsize - onset)
nframes = vecsize - onset;
! for (j = 0; j < vecsize; j++) {
if (+vecs[i][j] > biggest) biggest = +vecs[i][j];
else if (-vecs[i][j] > biggest) biggest = -vecs[i][j];
--- 975,979 ----
if (nframes > vecsize - onset)
nframes = vecsize - onset;
! for (int j=0; j<vecsize; j++) {
if (+vecs[i][j] > biggest) biggest = +vecs[i][j];
else if (-vecs[i][j] > biggest) biggest = -vecs[i][j];
***************
*** 1213,1227 ****
/* soundfiler_read ...
usage: read [flags] filename table ...
! flags:
! -skip <frames> ... frames to skip in file
! -nframes <frames>
! -onset <frames> ... onset in table to read into (NOT DONE YET)
! -raw <headersize channels bytes endian>
! -resize
! -maxsize <max-size>
! */
!
static void soundfiler_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;
--- 1162,1170 ----
/* soundfiler_read ...
usage: read [flags] filename table ...
! flags: -skip <frames> ... frames to skip in file
! -nframes <frames> -onset <frames> ... onset in table to read into (NOT DONE YET)
! -raw <headersize channels bytes endian> -resize -maxsize <max-size> */
static void soundfiler_read(t_soundfiler *x, t_symbol *s, int argc, t_atom *argv) {
! int headersize = -1, channels = 0, bytespersamp = 0, bigendian = 0, resize = 0;
long skipframes = 0, nframes = 0, finalsize = 0, maxsize = DEFMAXSIZE, itemsread = 0, bytelimit = 0x7fffffff;
int fd = -1;
***************
*** 1236,1262 ****
argc--; argv++;
if (!strcmp(flag, "skip")) {
! if (argc < 1 || argv[0].a_type != A_FLOAT || ((skipframes = long(argv[0].a_float)) < 0)) goto usage;
! argc--; argv++;
} else if (!strcmp(flag, "nframes")) {
! if (argc < 1 || argv[0].a_type != A_FLOAT || ((nframes = long(argv[0].a_float)) < 0)) goto usage;
! argc--; argv++;
} else if (!strcmp(flag, "raw")) {
! if (argc < 4 ||
! argv[0].a_type != A_FLOAT || ((headersize = int(argv[0].a_float)) < 0) ||
! argv[1].a_type != A_FLOAT || ((channels = int(argv[1].a_float)) < 1) || (channels > MAXSFCHANS) ||
! argv[2].a_type != A_FLOAT || ((bytespersamp = int(argv[2].a_float)) < 2) || (bytespersamp > 4) ||
! argv[3].a_type != A_SYMBOL ||
! ((endianness = argv[3].a_symbol->name[0]) != 'b' && endianness != 'l' && endianness != 'n'))
! goto usage;
if (endianness == 'b') bigendian = 1;
else if (endianness == 'l') bigendian = 0;
else bigendian = garray_ambigendian();
- argc -= 4; argv += 4;
} else if (!strcmp(flag, "resize")) {
resize = 1;
} else if (!strcmp(flag, "maxsize")) {
! if (argc < 1 || argv[0].a_type != A_FLOAT || ((maxsize = long(argv[0].a_float)) < 0)) goto usage;
resize = 1; /* maxsize implies resize. */
- argc--; argv++;
} else goto usage;
}
--- 1179,1198 ----
argc--; argv++;
if (!strcmp(flag, "skip")) {
! EAT_ARG(A_FLOAT,skipframes); if (skipframes<0) goto usage;
} else if (!strcmp(flag, "nframes")) {
! EAT_ARG(A_FLOAT,nframes); if (nframes<0) goto usage;
} else if (!strcmp(flag, "raw")) {
! EAT_ARG(A_FLOAT,headersize); if (headersize<0) goto usage;
! EAT_ARG(A_FLOAT,channels); if (channels<1) goto usage;
! EAT_ARG(A_FLOAT,bytespersamp); if (bytespersamp<2 || bytespersamp>4) goto usage;
! EAT_ARG(A_SYMBOL,endianness); if (endianness!='b' && endianness!='l' && endianness!='n') goto usage;
if (endianness == 'b') bigendian = 1;
else if (endianness == 'l') bigendian = 0;
else bigendian = garray_ambigendian();
} else if (!strcmp(flag, "resize")) {
resize = 1;
} else if (!strcmp(flag, "maxsize")) {
! EAT_ARG(A_FLOAT,maxsize); if (maxsize<0) goto usage;
resize = 1; /* maxsize implies resize. */
} else goto usage;
}
***************
*** 1264,1271 ****
filename = argv[0].a_symbol->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->name);
goto done;
--- 1200,1208 ----
filename = argv[0].a_symbol->name;
argc--; argv++;
! for (int i=0; i<argc; i++) {
int vecsize;
if (argv[i].a_type != A_SYMBOL) goto usage;
! garrays[i] = (t_garray *)pd_findbyclass(argv[i].a_symbol, garray_class);
! if (!garrays) {
pd_error(x, "%s: no such table", argv[i].a_symbol->name);
goto done;
***************
*** 1280,1285 ****
fd = open_soundfile_via_canvas(x->canvas, filename, headersize, &bytespersamp, &bigendian, &channels, &bytelimit, skipframes);
if (fd < 0) {
! pd_error(x, "soundfiler_read: %s: %s", filename, (errno == EIO ?
! "unknown or bad header format" : strerror(errno)));
goto done;
}
--- 1217,1221 ----
fd = open_soundfile_via_canvas(x->canvas, filename, headersize, &bytespersamp, &bigendian, &channels, &bytelimit, skipframes);
if (fd < 0) {
! pd_error(x, "soundfiler_read: %s: %s", filename, (errno == EIO ? "unknown or bad header format" : strerror(errno)));
goto done;
}
***************
*** 1296,1303 ****
framesinfile = maxsize;
}
! if (framesinfile > bytelimit / (channels * bytespersamp))
! framesinfile = bytelimit / (channels * bytespersamp);
finalsize = framesinfile;
! for (i = 0; i < argc; i++) {
int vecsize;
garray_resize(garrays[i], finalsize);
--- 1232,1238 ----
framesinfile = maxsize;
}
! framesinfile = min(framesinfile, bytelimit / (channels * bytespersamp));
finalsize = framesinfile;
! for (int i=0; i<argc; i++) {
int vecsize;
garray_resize(garrays[i], finalsize);
***************
*** 1310,1321 ****
}
if (!finalsize) finalsize = 0x7fffffff;
! if (finalsize > bytelimit / (channels * bytespersamp))
! finalsize = bytelimit / (channels * bytespersamp);
fp = fdopen(fd, "rb");
bufframes = SAMPBUFSIZE / (channels * bytespersamp);
-
for (itemsread = 0; itemsread < finalsize; ) {
int thisread = finalsize - itemsread;
! thisread = (thisread > bufframes ? bufframes : thisread);
nitems = fread(sampbuf, channels * bytespersamp, thisread, fp);
if (nitems <= 0) break;
--- 1245,1254 ----
}
if (!finalsize) finalsize = 0x7fffffff;
! finalsize = min(finalsize, bytelimit / (channels * bytespersamp));
fp = fdopen(fd, "rb");
bufframes = SAMPBUFSIZE / (channels * bytespersamp);
for (itemsread = 0; itemsread < finalsize; ) {
int thisread = finalsize - itemsread;
! thisread = min(thisread,bufframes);
nitems = fread(sampbuf, channels * bytespersamp, thisread, fp);
if (nitems <= 0) break;
***************
*** 1324,1341 ****
}
/* zero out remaining elements of vectors */
! for (i = 0; i < argc; i++) {
! int vecsize;
! garray_getfloatarray(garrays[i], &vecsize, &vecs[i]);
! for (j = itemsread; j < vecsize; j++) vecs[i][j] = 0;
}
/* zero out vectors in excess of number of channels */
! for (i = channels; i < argc; i++) {
! int vecsize;
! float *foo;
! garray_getfloatarray(garrays[i], &vecsize, &foo);
! for (j = 0; j < vecsize; j++) foo[j] = 0;
}
/* do all graphics updates */
! for (i = 0; i < argc; i++) garray_redraw(garrays[i]);
fclose(fp);
fd = -1;
--- 1257,1271 ----
}
/* zero out remaining elements of vectors */
! for (int i=0; i<argc; i++) {
! int vecsize; garray_getfloatarray(garrays[i], &vecsize, &vecs[i]);
! for (int j=itemsread; j<vecsize; j++) vecs[i][j]=0;
}
/* zero out vectors in excess of number of channels */
! for (int i=channels; i<argc; i++) {
! int vecsize; float *foo; garray_getfloatarray(garrays[i], &vecsize, &foo);
! for (int j=0; j<vecsize; j++) foo[j]=0;
}
/* do all graphics updates */
! for (int i=0; i<argc; i++) garray_redraw(garrays[i]);
fclose(fp);
fd = -1;
***************
*** 1353,1357 ****
call it too... not done yet though. */
long soundfiler_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];
--- 1283,1287 ----
call it too... not done yet though. */
long soundfiler_dowrite(void *obj, t_canvas *canvas, int argc, t_atom *argv) {
! int bytespersamp, bigendian, swap, filetype, normalize, nchannels;
long onset, nframes, itemswritten = 0;
t_garray *garrays[MAXSFCHANS];
***************
*** 1362,1366 ****
float normfactor, biggest = 0, samplerate;
t_symbol *filesym;
-
if (soundfiler_writeargparse(obj, &argc, &argv, &filesym, &filetype,
&bytespersamp, &swap, &bigendian, &normalize, &onset, &nframes,
--- 1292,1295 ----
***************
*** 1370,1374 ****
if (nchannels < 1 || nchannels > MAXSFCHANS) goto usage;
if (samplerate < 0) samplerate = sys_getsr();
! for (i = 0; i < nchannels; i++) {
int vecsize;
if (argv[i].a_type != A_SYMBOL) goto usage;
--- 1299,1303 ----
if (nchannels < 1 || nchannels > MAXSFCHANS) goto usage;
if (samplerate < 0) samplerate = sys_getsr();
! for (int i=0; i<nchannels; i++) {
int vecsize;
if (argv[i].a_type != A_SYMBOL) goto usage;
***************
*** 1379,1385 ****
else if (!garray_getfloatarray(garrays[i], &vecsize, &vecs[i]))
error("%s: bad template for tabwrite", argv[i].a_symbol->name);
! if (nframes > vecsize - onset)
! nframes = vecsize - onset;
! for (j = 0; j < vecsize; j++) {
if (+vecs[i][j] > biggest) biggest = +vecs[i][j];
else if (-vecs[i][j] > biggest) biggest = -vecs[i][j];
--- 1308,1313 ----
else if (!garray_getfloatarray(garrays[i], &vecsize, &vecs[i]))
error("%s: bad template for tabwrite", argv[i].a_symbol->name);
! nframes = min(nframes, vecsize - onset);
! for (int j=0; j<vecsize; j++) {
if (+vecs[i][j] > biggest) biggest = +vecs[i][j];
else if (-vecs[i][j] > biggest) biggest = -vecs[i][j];
***************
*** 1488,1498 ****
t_canvas *canvas;
t_clock *clock;
! char *buf; /* soundfile buffer */
! int bufsize; /* buffer size in bytes */
! int noutlets; /* number of audio outlets */
! t_sample *(outvec[MAXSFCHANS]); /* audio vectors */
! int vecsize; /* vector size for transfers */
! t_outlet *bangout; /* bang-on-done outlet */
! int state; /* opened, running, or idle */
float insamplerate; /* sample rate of input signal if known */
/* parameters to communicate with subthread */
--- 1416,1426 ----
t_canvas *canvas;
t_clock *clock;
! char *buf; /* soundfile buffer */
! int bufsize; /* buffer size in bytes */
! int noutlets; /* number of audio outlets */
! t_sample *(outvec[MAXSFCHANS]); /* audio vectors */
! int vecsize; /* vector size for transfers */
! t_outlet *bangout; /* bang-on-done outlet */
! int state; /* opened, running, or idle */
float insamplerate; /* sample rate of input signal if known */
/* parameters to communicate with subthread */
***************
*** 1717,1722 ****
static t_int *readsf_perform(t_int *w) {
t_readsf *x = (t_readsf *)(w[1]);
! int vecsize = x->vecsize, noutlets = x->noutlets, i, j, bytespersample = x->bytespersample, bigendian = x->bigendian;
! float *fp;
if (x->state == STATE_STREAM) {
int wantbytes, sfchannels = x->sfchannels;
--- 1645,1649 ----
static t_int *readsf_perform(t_int *w) {
t_readsf *x = (t_readsf *)(w[1]);
! int vecsize = x->vecsize, noutlets = x->noutlets, bytespersample = x->bytespersample, bigendian = x->bigendian;
if (x->state == STATE_STREAM) {
int wantbytes, sfchannels = x->sfchannels;
***************
*** 1742,1748 ****
}
/* then zero out the (rest of the) output */
! for (int i=0; i<noutlets; i++)
! for (j = vecsize, fp = x->outvec[i] + xfersize; j--; )
! *fp++ = 0;
sfread_cond_signal(&x->requestcondition);
pthread_mutex_unlock(&x->mutex);
--- 1669,1676 ----
}
/* then zero out the (rest of the) output */
! for (int i=0; i<noutlets; i++) {
! float *fp = x->outvec[i] + xfersize;
! for (int j=vecsize; j--; ) *fp++ = 0;
! }
sfread_cond_signal(&x->requestcondition);
pthread_mutex_unlock(&x->mutex);
***************
*** 1758,1764 ****
pthread_mutex_unlock(&x->mutex);
} else {
! for (i = 0; i < noutlets; i++)
! for (j = vecsize, fp = x->outvec[i]; j--; )
! *fp++ = 0;
}
return w+2;
--- 1686,1693 ----
pthread_mutex_unlock(&x->mutex);
} else {
! for (int i=0; i<noutlets; i++) {
! float *fp = x->outvec[i];
! for (int j=vecsize; j--; ) *fp++=0;
! }
}
return w+2;
***************
*** 1881,1886 ****
} else if (x->requestcode == REQUEST_OPEN) {
int fd, sysrtn, writebytes;
! /* copy file stuff out of the data structure so we can
! relinquish the mutex while we're in open_soundfile(). */
int bytespersample = x->bytespersample;
int sfchannels = x->sfchannels;
--- 1810,1814 ----
} else if (x->requestcode == REQUEST_OPEN) {
int fd, sysrtn, writebytes;
! /* copy file stuff out of the data structure so we can relinquish the mutex while we're in open_soundfile(). */
int bytespersample = x->bytespersample;
int sfchannels = x->sfchannels;
***************
*** 1890,1898 ****
t_canvas *canvas = x->canvas;
float samplerate = x->samplerate;
-
/* alter the request code so that an ensuing "open" will get noticed. */
x->requestcode = REQUEST_BUSY;
x->fileerror = 0;
-
/* if there's already a file open, close it. This should never happen since
writesf_open() calls stop if needed and then waits until we're idle. */
--- 1818,1824 ----
***************
*** 1987,1993 ****
static void *writesf_new(t_floatarg fnchannels, t_floatarg fbufsize) {
- t_writesf *x;
int nchannels = int(fnchannels), bufsize = int(fbufsize), i;
- char *buf;
if (nchannels < 1) nchannels = 1;
else if (nchannels > MAXSFCHANS) nchannels = MAXSFCHANS;
--- 1913,1917 ----
***************
*** 1995,2001 ****
else if (bufsize < MINBUFSIZE) bufsize = MINBUFSIZE;
else if (bufsize > MAXBUFSIZE) bufsize = MAXBUFSIZE;
! buf = (char *)getbytes(bufsize);
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;
--- 1919,1925 ----
else if (bufsize < MINBUFSIZE) bufsize = MINBUFSIZE;
else if (bufsize > MAXBUFSIZE) bufsize = MAXBUFSIZE;
! char *buf = (char *)getbytes(bufsize);
if (!buf) return 0;
! t_writesf *x = (t_writesf *)pd_new(writesf_class);
for (i = 1; i < nchannels; i++) inlet_new(x,x, &s_signal, &s_signal);
x->f = 0;