aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2005-07-01 12:07:50 +0000
committerIOhannes m zmölnig <zmoelnig@users.sourceforge.net>2005-07-01 12:07:50 +0000
commiteb13b6f58fffc9e84968b64618dd5e4bcd972724 (patch)
tree5dcc117590dd1c08897762e6dea36b97c5027929
parent9340768f6c7dea7cb7fe348f6fdf52db75ce9d82 (diff)
added "read16" message for the table16
added some prelaminary tabfudge that should make casting faster (LATER) svn path=/trunk/externals/iem16/; revision=3277
-rw-r--r--src/iem16_table.c82
-rw-r--r--src/iem16_table.h68
2 files changed, 147 insertions, 3 deletions
diff --git a/src/iem16_table.c b/src/iem16_table.c
index f43e2bb..1f01178 100644
--- a/src/iem16_table.c
+++ b/src/iem16_table.c
@@ -7,6 +7,17 @@
/* sampling */
#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);
static void *table16_new(t_symbol *s, t_float f){
@@ -18,6 +29,7 @@ static void *table16_new(t_symbol *s, t_float f){
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);
@@ -63,7 +75,7 @@ static void table16_from(t_table16*x, t_symbol*s, int argc, t_atom*argv){
int startfrom=0, startto=0, endfrom=0, endto=x->x_size;
t_garray *a=0;
int npoints;
- t_float *vec, *src;
+ t_float *vec=(0), *src=(0);
t_iem16_16bit *dest;
int i,length=0;
@@ -120,7 +132,71 @@ static void table16_from(t_table16*x, t_symbol*s, int argc, t_atom*argv){
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");
+ //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);
}
@@ -131,6 +207,8 @@ static void table16_setup(void){
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);
+ class_addmethod(table16_class, (t_method)table16_read16, gensym("read16"), A_SYMBOL,
+ A_DEFFLOAT, A_DEFSYM, A_NULL);
}
diff --git a/src/iem16_table.h b/src/iem16_table.h
index 4810312..98c98cd 100644
--- a/src/iem16_table.h
+++ b/src/iem16_table.h
@@ -17,11 +17,77 @@ typedef struct _table16 {
t_symbol *x_tablename;
long x_size;
- t_iem16_16bit *x_table; // hold the data
+ t_iem16_16bit *x_table; /* hold the data */
int x_usedindsp;
+ t_canvas *x_canvas; /* for file i/o */
} t_table16;
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];
+};