Update of /cvsroot/pure-data/externals/iem16/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25770
Modified Files: iem16_table.c iem16_table.h Log Message: added "read16" message for the table16 added some prelaminary tabfudge that should make casting faster (LATER)
Index: iem16_table.h =================================================================== RCS file: /cvsroot/pure-data/externals/iem16/src/iem16_table.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** iem16_table.h 23 Nov 2004 15:29:47 -0000 1.1.1.1 --- iem16_table.h 1 Jul 2005 12:07:50 -0000 1.2 *************** *** 18,24 **** t_symbol *x_tablename; long x_size; ! t_iem16_16bit *x_table; // hold the data
int x_usedindsp; } t_table16;
--- 18,25 ---- t_symbol *x_tablename; long x_size; ! t_iem16_16bit *x_table; /* hold the data */
int x_usedindsp; + t_canvas *x_canvas; /* for file i/o */ } t_table16;
*************** *** 26,27 **** --- 27,93 ---- EXTERN int table16_getarray16(t_table16*x, int*size,t_iem16_16bit**vec); EXTERN void table16_usedindsp(t_table16*x); + + + #define UNITBIT32 1572864. /* 3*2^19; bit 32 has place value 1 */ + + /* machine-dependent definitions. These ifdefs really + should have been by CPU type and not by operating system! */ + #ifdef __irix__ + /* big-endian. Most significant byte is at low address in memory */ + #define HIOFFSET 0 /* word offset to find MSB */ + #define LOWOFFSET 1 /* word offset to find LSB */ + #define int32 long /* a data type that has 32 bits */ + #else + #ifdef __win32__ + /* little-endian; most significant byte is at highest address */ + #define HIOFFSET 1 + #define LOWOFFSET 0 + #define int32 long + #else + #ifdef __FreeBSD__ + #include <machine/endian.h> + #if BYTE_ORDER == LITTLE_ENDIAN + #define HIOFFSET 1 + #define LOWOFFSET 0 + #else + #define HIOFFSET 0 /* word offset to find MSB */ + #define LOWOFFSET 1 /* word offset to find LSB */ + #endif /* BYTE_ORDER */ + #include <sys/types.h> + #define int32 int32_t + #endif + #ifdef __linux__ + + #include <endian.h> + + #if !defined(__BYTE_ORDER) || !defined(__LITTLE_ENDIAN) + #error No byte order defined + #endif + + #if __BYTE_ORDER == __LITTLE_ENDIAN + #define HIOFFSET 1 + #define LOWOFFSET 0 + #else + #define HIOFFSET 0 /* word offset to find MSB */ + #define LOWOFFSET 1 /* word offset to find LSB */ + #endif /* __BYTE_ORDER */ + + #include <sys/types.h> + #define int32 int32_t + + #else + #ifdef __apple__ + #define HIOFFSET 0 /* word offset to find MSB */ + #define LOWOFFSET 1 /* word offset to find LSB */ + #define int32 int /* a data type that has 32 bits */ + + #endif /* MACOSX */ + #endif /* __linux__ */ + #endif /* MSW */ + #endif /* SGI */ + + union tabfudge + { + double tf_d; + int32 tf_i[2]; + };
Index: iem16_table.c =================================================================== RCS file: /cvsroot/pure-data/externals/iem16/src/iem16_table.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** iem16_table.c 23 Nov 2004 15:29:47 -0000 1.1.1.1 --- iem16_table.c 1 Jul 2005 12:07:50 -0000 1.2 *************** *** 8,11 **** --- 8,22 ----
#include "iem16_table.h" + + #include <stdio.h> /* for read/write to files */ + + 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);
*************** *** 19,22 **** --- 30,34 ---- x->x_usedindsp=0; pd_bind(&x->x_obj.ob_pd, x->x_tablename); + x->x_canvas = canvas_getcurrent();
table16_const(x, 0); *************** *** 64,68 **** t_garray *a=0; int npoints; ! t_float *vec, *src; t_iem16_16bit *dest;
--- 76,80 ---- t_garray *a=0; int npoints; ! t_float *vec=(0), *src=(0); t_iem16_16bit *dest;
*************** *** 121,125 **** 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"); }
--- 133,201 ---- 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); }
*************** *** 132,135 **** --- 208,213 ---- class_addmethod(table16_class, (t_method)table16_const, gensym("const"), A_DEFFLOAT); class_addmethod(table16_class, (t_method)table16_from, gensym("from"), A_GIMME); + class_addmethod(table16_class, (t_method)table16_read16, gensym("read16"), A_SYMBOL, + A_DEFFLOAT, A_DEFSYM, A_NULL); }