diff options
author | IOhannes m zmölnig <zmoelnig@users.sourceforge.net> | 2007-06-01 09:15:09 +0000 |
---|---|---|
committer | IOhannes m zmölnig <zmoelnig@users.sourceforge.net> | 2007-06-01 09:15:09 +0000 |
commit | 843409ecc7baf287962cbe34e967380302f35509 (patch) | |
tree | 42bde9b459007104cb83b137e8c1c22319393f70 /src/table16.c | |
parent | 7119bfd22c7a53c254b3532649f0342efc6625e3 (diff) |
new filelayout (one c-file per object)
svn path=/trunk/externals/iem16/; revision=7739
Diffstat (limited to 'src/table16.c')
-rw-r--r-- | src/table16.c | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/src/table16.c b/src/table16.c new file mode 100644 index 0000000..fd9d585 --- /dev/null +++ b/src/table16.c @@ -0,0 +1,234 @@ +/* copyleft (c) 2003 forum::für::umläute -- IOhannes m zmölnig @ IEM + * based on d_array.c from pd: + * Copyright (c) 1997-1999 Miller Puckette and others. + * For information on usage and redistribution, and for a DISCLAIMER OF ALL + * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ + +/* sampling */ + +#include "iem16_table.h" + +#include <stdlib.h> +#include <string.h> +#include <stdio.h> /* for read/write to files */ + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# define fdopen(fd,type) _fdopen(fd,type) +#endif + + +static int am_bigendian(void){ + /* actually this should be in m_pd.h */ + unsigned short s = 1; + unsigned char c = *(char *)(&s); + return (c==0); +} + + +static void table16_const(t_table16*x, t_float f); + +static void *table16_new(t_symbol *s, t_float f){ + t_table16 *x = (t_table16*)pd_new(table16_class); + int i=f; + if(i<1)i=100; + x->x_tablename=s; + x->x_size=i; + x->x_table=getbytes(x->x_size*sizeof(t_iem16_16bit)); + x->x_usedindsp=0; + pd_bind(&x->x_obj.ob_pd, x->x_tablename); + x->x_canvas = canvas_getcurrent(); + + table16_const(x, 0); + return(x); +} + +static void table16_free(t_table16 *x){ + if(x->x_table)freebytes(x->x_table, x->x_size*sizeof(t_iem16_16bit)); + pd_unbind(&x->x_obj.ob_pd, x->x_tablename); +} + +int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec){ + *size=x->x_size; + *vec =x->x_table; + return 1; +} +void table16_usedindsp(t_table16*x){ + x->x_usedindsp=1; +} +static void table16_resize(t_table16*x, t_float f){ + int i=f; + int was=x->x_size; + if (i<1){ + error("can only resize to sizes >0"); + return; + } + x->x_table=resizebytes(x->x_table, was*sizeof(t_iem16_16bit), i*sizeof(t_iem16_16bit)); + if(i>was)memset(x->x_table+was, 0, (i-was)*sizeof(t_iem16_16bit)); + x->x_size =i; + if (x->x_usedindsp) canvas_update_dsp(); +} + +static void table16_const(t_table16*x, t_float f){ + t_iem16_16bit s = (t_iem16_16bit)f; + int i = x->x_size; + t_iem16_16bit*buf=x->x_table; + while(i--)*buf++=s; +} + + +static void table16_from(t_table16*x, t_symbol*s, int argc, t_atom*argv){ + float scale=IEM16_SCALE_UP; + int resize=0; + int startfrom=0, startto=0, endfrom=0, endto=x->x_size; + t_garray *a=0; + int npoints; + t_float *vec=(0), *src=(0); + t_iem16_16bit *dest; + + int i,length=0; + + if(argc<1 || argv->a_type!=A_SYMBOL){ + error("you have to specify the from-table !"); + return; + } + s=atom_getsymbol(argv); argc--;argv++; +#if defined __WIN32__ || defined __WIN32 + // hmm, how do i import garray_class on w32?? + error("ack, windows hit the wall...tell me how to see garray_class"); + return; +#else + if (!(a = (t_garray *)pd_findbyclass(s, garray_class))){ + error("%s: no such array", s->s_name); + return; + } else +#endif + if (!garray_getfloatarray(a, &npoints, &vec)){ + error("%s: bad template for tabread4", s->s_name); + return; + } + + if(argc>0 && atom_getsymbol(argv+argc-1)==gensym("resize")){ + resize=1; + argc--; + } + endfrom=npoints; + + switch(argc){ + case 0:break; + case 4: + endto =atom_getfloat(argv+3); + case 3: + startto =atom_getfloat(argv+2); + case 2: + endfrom =atom_getfloat(argv+1); + case 1: + startfrom=atom_getfloat(argv); + break; + default: + error("table16: from <tablename> [<startfrom> [<endfrom> [<startto> [<endto>]]]] [resize]"); + return; + } + if(startfrom<0)startfrom=0; + if (startto<0)startto=0; + if(endfrom<=startfrom)return; + if(endto <=startto) return; + + length=endfrom-startfrom; + if(resize){ + if(x->x_size < (startto+length))table16_resize(x, startto+length); + } else{ + if(x->x_size < (startto+length))length=x->x_size-startto; + } + endfrom=startfrom+length; + endto =startto+length; + + dest=x->x_table+startto; + src =vec+startfrom; + i=length; + while(i--)*dest++=(*src++)*scale; + //post("from %s (%d, %d) --> (%d, %d)\tresize=%s", s->s_name, startfrom, endfrom, startto, endto, (resize)?"yes":"no"); +} + +#define BINREADMODE "rb" +#define BINWRITEMODE "wb" +static void table16_read16(t_table16 *x, t_symbol *filename, t_symbol *endian, t_floatarg fskip) +{ + int skip = fskip, filedesc; + int i, nelem; + t_iem16_16bit *vec; + FILE *fd; + char buf[MAXPDSTRING], *bufptr; + short s; + int cpubig = am_bigendian(), swap = 0; + char c = endian->s_name[0]; + if (c == 'b') + { + if (!cpubig) swap = 1; + } + else if (c == 'l') + { + if (cpubig) swap = 1; + } + else if (c) + { + error("array_read16: endianness is 'l' (low byte first ala INTEL)"); + post("... or 'b' (high byte first ala MIPS,DEC,PPC)"); + } + if (!table16_getarray16(x, &nelem, &vec)) + { + error("%s: not a 16bit array", x->x_tablename->s_name); + return; + } + if ((filedesc = open_via_path( + canvas_getdir(x->x_canvas)->s_name, + filename->s_name, "", buf, &bufptr, MAXPDSTRING, 1)) < 0 + || !(fd = fdopen(filedesc, BINREADMODE)) + ) + { + error("%s: can't open", filename->s_name); + return; + } + if (skip) + { + long pos = fseek(fd, (long)skip, SEEK_SET); + if (pos < 0) + { + error("%s: can't seek to byte %d", buf, skip); + fclose(fd); + return; + } + } + + for (i = 0; i < nelem; i++) + { + if (fread(&s, sizeof(s), 1, fd) < 1) + { + post("%s: read %d elements into table of size %d", + filename->s_name, i, nelem); + break; + } + if (swap) s = ((s & 0xff) << 8) | ((s & 0xff00) >> 8); + vec[i] = s; + } + while (i < nelem) vec[i++] = 0; + fclose(fd); +} + + +void table16_setup(void){ + table16_class = class_new(gensym("table16"), + (t_newmethod)table16_new, (t_method)table16_free, + sizeof(t_table16), 0, A_DEFSYM, A_DEFFLOAT, 0); + class_addmethod(table16_class, (t_method)table16_resize, gensym("resize"), A_DEFFLOAT, 0); + class_addmethod(table16_class, (t_method)table16_const, gensym("const"), A_DEFFLOAT, 0); + class_addmethod(table16_class, (t_method)table16_from, gensym("from"), A_GIMME, 0); + class_addmethod(table16_class, (t_method)table16_read16, gensym("read16"), A_SYMBOL, + A_DEFFLOAT, A_DEFSYM, 0); +} + + +void iem16_table_setup(void) +{ + table16_setup(); +} + |