From 9340768f6c7dea7cb7fe348f6fdf52db75ce9d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= Date: Tue, 23 Nov 2004 15:29:47 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r2300, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/iem16/; revision=2301 --- src/iem16_table.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 src/iem16_table.c (limited to 'src/iem16_table.c') diff --git a/src/iem16_table.c b/src/iem16_table.c new file mode 100644 index 0000000..f43e2bb --- /dev/null +++ b/src/iem16_table.c @@ -0,0 +1,141 @@ +/* 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" +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); + + 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, *src; + 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 (!(a = (t_garray *)pd_findbyclass(s, garray_class))){ + error("%s: no such array", s->s_name); + return; + } else 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 [ [ [ []]]] [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"); +} + + +static 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); + class_addmethod(table16_class, (t_method)table16_const, gensym("const"), A_DEFFLOAT); + class_addmethod(table16_class, (t_method)table16_from, gensym("from"), A_GIMME); +} + + +void iem16_table_setup(void) +{ + table16_setup(); +} + -- cgit v1.2.1